Filter für Query

alles was zunächst nicht kategorisierbar ist

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Filter für Query

Beitrag von AUGE_OHR »

hi,

für DBF habe ich eine Routine um "Filter" zusammenzustellen.

Diese hab ich für SQL umgeschrieben und ein Problem beim "ausprobieren".

Code: Alles auswählen

   bSaveError := ERRORBLOCK()
   ERRORBLOCK( { | e | BREAK( e ) } )
   BEGIN SEQUENCE

      bBlock := "{|| " + cText + " }"
      //
      // da es keine DBE ist
      // erkennt er kein Field
      // und meint die Variable
      // wäre unbekannt
      //
      lret := EVAL( &( bBlock ) )

   RECOVER USING oError
      ERRORBLOCK( bSaveError )
   END SEQUENCE
   ERRORBLOCK( bSaveError )
wenn ich eine aktive DBF habe "erkennt" er ja die Feld Namen ( auch ohne Alias )

Code: Alles auswählen

cText := "artnr > '2000' .AND. artnr < '2010'"
bBlock := "{|| " + cText + " }"
aber bei "native"*** PostgreSQL Zugriff meint Xbase++ das Field "artnr" wäre eine Variabel :(
*** NICHT per pgDBE

Der Text String für PostgreSQL sieht "fertig" so aus ( nach dem WHERE )

Code: Alles auswählen

SELECT a.artnr,a.artikel FROM artikel AS a WHERE
a.artnr > '2000' AND a.artnr < '2010'
Frage : wie kann ich eine WHERE Bedingung prüfen damit kein Syntax Fehler entsteht ?
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter für Query

Beitrag von georg »

Hallo, Jimmy -


so ganz verstehe ich Deine Frage nicht, aber:

Code: Alles auswählen

bBlock := {|x| x}
lRet := Eval(bBlock, cText)
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Filter für Query

Beitrag von AUGE_OHR »

hi,
georg hat geschrieben:

Code: Alles auswählen

bBlock := {|x| x}
lRet := Eval(bBlock, cText)
hm ... das gibt mit dann cText zurück ... hm
angenommen ich würde mit "(" arbeiten dann müsste ich ja auch ")" haben ... so was will ich "prüfen" ob es beim evaluieren einen Fehler gibt.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter für Query

Beitrag von georg »

Hallo, Jimmy -


Deine Frage sah so aus:

Code: Alles auswählen

bBlock := "{|| " + cText + " }"
      //
      // da es keine DBE ist
      // erkennt er kein Field
      // und meint die Variable
      // wäre unbekannt
      //
      lret := EVAL( &( bBlock ) )
Genau das setzt mein Beispiel um. Daher mein "Vorwort", dass ich Deine Frage nicht richtig verstehe.

Denn auch Dein "das würde ich gerne wissen" als Inhalt von cText führt zum gleichen Problem in Deinem Code (vorausgesetzt, cText wäre eine PUBLIC/PRIVATE Variable).
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Filter für Query

Beitrag von AUGE_OHR »

georg hat geschrieben:Daher mein "Vorwort", dass ich Deine Frage nicht richtig verstehe.
Du hast Recht ... ich muss ein wenig mehr erzählen was ich machen will.
georg hat geschrieben:Denn auch Dein "das würde ich gerne wissen" als Inhalt von cText führt zum gleichen Problem in Deinem Code (vorausgesetzt, cText wäre eine PUBLIC/PRIVATE Variable).
der Code war ursprünglich für DBF Felder gedacht welchen ich nun für PostgreSQL upgraden möchte.

Wenn man pgAdmin3.EXE startet gibt es einen Button SQL wo sich ein neues Fenster öffnet.
im oberen Teil gibt es ein "Eingabe" Feld ( MLE ) und darunter ein "Ausgabe" Feld.
nachdem ich eine SQL Query eingegeben habe "prüfe" ich die mit F5 und sehe ggf. eine Meldung "wo" ein Problem auftaucht.

ich will nun so etwas bei PGU.EXE, was "native" per libpq.dll zugreift, ebenfalls einbauen.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter für Query

Beitrag von georg »

Hallo, Jimmy -


eine Möglichkeit wäre es, ein EXPLAIN SELECT ... durchzuführen und die Rückmeldung auszuwerten, wenn es Dir darum geht, den Inhalt der WHERE Clause zu prüfen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Filter für Query

Beitrag von AUGE_OHR »

georg hat geschrieben:eine Möglichkeit wäre es, ein EXPLAIN SELECT ... durchzuführen und die Rückmeldung auszuwerten, wenn es Dir darum geht, den Inhalt der WHERE Clause zu prüfen.
Ja, zu einer ähnlichen Erkenntnis bin ich auch gekommen.
wenn ich eine Query an den PostgreSQL Server abschicke bekomme ich ja eine Fehlermeldung wenn was nicht stimmt. Ich muss diese also nur "abfragen" und dann auswerten "wo" er meckert.

aber trotzdem noch mal zur Frage : dynamisches Anlegen von Variablen.

Code: Alles auswählen

Variablen zur Laufzeit erzeugen 
Mit dem Makro-Operator ist es möglich, Variablen erst zur Laufzeit eines Programms dynamisch zu erzeugen, deren Name bzw. Symbol bei der Programmierung einer Applikation nicht bekannt ist. Dies wird in dem folgenden Beispiel demonstriert: 

      cVarName := "cPrivate" 
      ? Type("cPrivate")                      // Ergebnis: U 
       PRIVATE &cVarName := "Xbase++" 
       ? cVarName                              // Ergebnis: cPrivate 
      ? &cVarName                             // Ergebnis: Xbase++ 
      ? Type("cPrivate")                      // Ergebnis: C 
      ? cPrivate                              // Ergebnis: Xbase++ 

Ein Anwendungsbereich für eine solche Vorgehensweise ist etwa die Programmierung eines Befehlszeilen-Interpreters mit Xbase++. 
und dazu dies

Code: Alles auswählen

PROCEDURE MAIN
      cVarName := "cPrivate"
      ? Type("cPrivate")                      // Ergebnis: U
PRIVATE &cVarName := "Xbase++"
      ? cVarName                              // Ergebnis: cPrivate
      ? &cVarName                             // Ergebnis: Xbase++
   ? "MEMVAR_PRIVATE",IsMemvar(cVarName,MEMVAR_PRIVATE)
   ? "MEMVAR_PUBLIC ",IsMemvar(cVarName,MEMVAR_PUBLIC )
      ? Type("cPrivate")                      // Ergebnis: C
      ? cPrivate                              // Ergebnis: Xbase++
   ? "MEMVAR_PRIVATE",IsMemvar(cPrivate,MEMVAR_PRIVATE)
   ? "MEMVAR_PUBLIC ",IsMemvar(cPrivate,MEMVAR_PUBLIC )
   WAIT
RETURN
ich bekomme aber nur beim ersten IsMemvar() ein .T. :?:
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter für Query

Beitrag von georg »

AUGE_OHR hat geschrieben:

Code: Alles auswählen

   ? "MEMVAR_PRIVATE",IsMemvar(cVarName,MEMVAR_PRIVATE)
   ? "MEMVAR_PUBLIC ",IsMemvar(cVarName,MEMVAR_PUBLIC )
      ? Type("cPrivate")                      // Ergebnis: C
      ? cPrivate                              // Ergebnis: Xbase++
   ? "MEMVAR_PRIVATE",IsMemvar(cPrivate,MEMVAR_PRIVATE)
   ? "MEMVAR_PUBLIC ",IsMemvar(cPrivate,MEMVAR_PUBLIC )
ich bekomme aber nur beim ersten IsMemvar() ein .T. :?:
Hallo, Jimmy -


das wundert mich nicht. IsMemvar() fragt ja explizit nach dem Typ, und bei der ersten Abfrage wird auf PRIVATE, bei der zweiten auf PUBLIC geprüft. Und da kann nur einer von beiden Tests erfolgreich sein, denke ich.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Filter für Query

Beitrag von AUGE_OHR »

hi,
georg hat geschrieben:Und da kann nur einer von beiden Tests erfolgreich sein, denke ich.
YUP ... JNNN ... mich "verwirrt" nun 3 und 4 was cPrivate betrifft ...

ich hab cPrivate (und cVarName) ja nicht als Variable definiert.

Code: Alles auswählen

cVarName := "cPrivate"
cPrivate steckt als String "in" der Variable cVarName.
wenn kein Compiler Schalter gesetzt ist wird cVarName als Memvar Type PRIVATE angesehen

Code: Alles auswählen

? cPrivate   // Ergebnis: Xbase++
was ist das nun cPrivate ...
mir ist schon klar das ich mit dem Macro

Code: Alles auswählen

? &cVarName  // Ergebnis: Xbase++
das selbe erreiche. ist also cPrivate jetzt das Macro ?

aber wie bekomme ich cPrivate nun in einen Codeblock ?
nun dachte ich an so was

Code: Alles auswählen

*      cText := "{ || "+ cPrivate + "}"
*      cText := "{ || "+ &cVarName + "}"
      cText := "{ || "+ cVarName + "}"

      BBlock := &(cText)
   ?  VALType( BBlock )
   ?  EVAL( BBlock )
aber leider geht nur die letzte ...
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Filter für Query

Beitrag von georg »

Guten Morgen, Jimmy -


Dein Code bringt die korrekten Ergebnisse.

Zu dem Zeitpunkt, an dem die beiden späteren Abfragen erfolgen, haben wir folgende Variablen im Programm definiert:

Code: Alles auswählen

<Private>   cPrivate C: "Xbase++"
<Private>   cVarName C: "cPrivate"
Jetzt wird folgender Code ausgeführt:

Code: Alles auswählen

? "MEMVAR_PRIVATE",IsMemvar(cPrivate,MEMVAR_PRIVATE)
Geprüft wird laut Dokumentation der INHALT des ersten Parameters. Der erste Parameter ist cPrivate. Der INHALT von cPrivate ist ... "Xbase++".

Es gibt weder eine PRIVATE, noch eine PUBLIC Variable, die Xbase++ heisst. Korrektes Ergebnis ist als FALSE, weil gibt es nicht.
<cVarName> is a character string containing the symbolic identifier of a dynamic memory variable.
Du kannst das Ganze prüfen, indem Du aus

Code: Alles auswählen

PRIVATE &cVarName := "Xbase++"

Code: Alles auswählen

PUBLIC &cVarName := "Xbase++"
machst. Es wird dann in den ersten beiden Prüfungen FALSE und TRUE ausgegeben, was beweist, dass nicht cVarName geprüft wird, sondern der Inhalt von cVarName (denn cVarName ist ja immer noch PRIVATE, während cPrivate nun eine PUBLIC Variable ist.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten