QUERY

4D - Documentation   Français   English   German   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 3


QUERY ({Tabellenname}{; Suchbegriff{; *}})

ParameterTypBeschreibung
TabellennameTabelleTabelle, in der gesucht werden soll oder
Haupttabelle ohne Angabe
SuchbegriffOperatoren und Suchbegriffe
*Weiterer Suchbegriff folgt

Beschreibung

Der Befehl QUERY sucht nach Datensätzen, welche die in Suchbegriff angegebenen Suchkriterien erfüllen und gibt die ausgewählten Datensätze für Tabellenname zurück. QUERY ändert die aktuelle Auswahl Tabellenname für den laufenden Prozess. Der erste Datensatz der neuen Auswahl ist nun der aktuelle Datensatz.

Tabellenname ist optional. Wird dieser Parameter nicht angegeben, bezieht sich Tabellenname auf die Haupttabelle. Gibt es keine Haupttabelle, erhalten Sie eine Fehlermeldung.

Geben Sie Suchbegriff oder den optionalen Parameter * nicht an, zeigt QUERY den Sucheditor für Tabellenname, außer wenn es sich um die letzte Zeile einer komplexen Suche handelt (siehe unten). Der Sucheditor in der Benutzerumgebung sieht folgendermaßen aus:

Weitere Informationen zum Sucheditor finden Sie im Handbuch 4th Dimension Benutzermodus.

Der Benutzer baut die Suche auf und klickt anschließend auf die Schaltfläche Suche oder Suche in Auswahl, um die Suche auszuführen. Läuft die Suche ohne Unterbrechung, nimmt die Systemvariable OK den Wert 1 an. Klickt der Benutzer auf die Schaltfläche Abbrechen, wird der Suchlauf annuliert, die Systemvariable OK nimmt dann den Wert 0 (Null) an.

Beispiele

1. Folgende Zeile zeigt den Sucheditor für die Tabelle [Products] an:

   QUERY([Products])

2. Folgende Zeile zeigt den Sucheditor für die Haupttabelle an (sofern vorhanden)

   QUERY

Geben Sie den Parameter Suchbegriff an, erscheint nicht der Standardsucheditor, die Suche wird per Programmierung definiert. Für einfache Suchläufe (Suche nach nur einem Datenfeld) rufen Sie QUERY einmal mit Suchbegriff auf. Für Suchsequenzen (Suche nach mehreren Datenfeldern oder Kriterien) rufen Sie QUERY mit Suchbegriff so oft wie nötig auf und geben jedes Mal den optionalen Parameter * an, außer für den letzen Aufruf von QUERY. Dieser startet dann den Suchlauf. Weitere Informationen zum Parameter Suchbegriff finden Sie im Folgenden.

Beispiele

3. Folgende Zeile sucht in der Tabelle [People] nach Nachnamen, die mit "a" beginnen:

   QUERY([People];[People]Last name="a@")

4. Folgende Zeile sucht in der Tabelle [People] nach Namen, die mit "a" oder "b" beginnen:

   QUERY([People];[People]Name="a@";*) ` * weist auf weitere Suchkriterien hin
   QUERY([People]; | ;[People]Name="b@") 
                  ` Ohne * endet die Definition der Suche, der Suchlauf startet

Suchbegriff definieren

Einen Suchbegriff definieren Sie nach folgendem Modell:

{Operator ;} Datenfeld Vergleichsoperator Wert

Der Operator ist das Verbindungsglied zwischen zwei Suchbegriffen. Bei einem einzelnen Suchbegriff benötigen Sie keinen Operator. Es gibt folgende Operatoren:

OperatorSymbol
UND&
ODER|
Außer#

Diese Operatoren entsprechen im Benutzermodus den Operatoren im Sucheditor. Der Operator ist eine Konstante, kein alphanumerischer Wert.

Die Zeile mit dem ersten Suchbegriff darf keinen Operator enthalten.

Datenfeld ist das Datenfeld, auf das sich die Suche bezieht. Sind zwei Tabellen verknüpft, darf Datenfeld einer anderen Tabelle angehören, als im ersten Parameter übergeben wurde. QUERY muss auf die Viele-Tabelle angewandt werden.

Vergleichsoperator vergleicht den Wert im Datenfeld mit dem angegebenen Wert. Es gibt folgende Vergleichsoperatoren:

VergleichsoperatorSymbol
ist gleich=
ist nicht gleich#
ist größer als >
ist größer als oder gleich>=
ist kleiner als<
ist kleiner als oder gleich<=

Vergleichsoperator kann eine Konstante oder ein alphanumerischer Wert sein. Als alphanumerischer Wert muss er zwischen Strichpunkten geschrieben werden. Ist Vergleichsoperator eine Konstante, brauchen Sie die Strichpunkte nicht zu schreiben.

Wert wird mit dem Wert in Datenfeld verglichen. Wert kann vom gleichen Typ wie Datenfeld sein oder einen alphanumerischen Wert haben. 4th Dimension nimmt dann die notwendige Konvertierung selbst vor. Der Typ von Wert wird nur einmal, und zwar bei Beginn der Suche definiert. Suchen Sie eine Zeichenkette, die eine bestimmte Buchstabenkombination enthält, setzen Sie die Buchstaben zwischen zwei Klammeraffen @, beispielsweise @mburg@. Das @-Zeichen erhalten Sie unter Windows mit der Tastenkombination alt gr + Buchstabe q, auf Macintosh mit der Kombination Umschalt- + Wahltaste + Ziffer 1. Bei einer Enthält-Suche wird nicht mit Index gesucht.

Regeln

Folgende Regeln müssen Sie bei der Programmierung einer Suche beachten:

In der ersten Suchzeile darf kein Operator stehen.

In den folgenden Zeilen muss der Suchbegriff mit einem Operator beginnen.

Alle Zeilen, mit Ausnahme der letzten, müssen mit * beendet werden. * zeigt an, dass noch weitere Suchbegriffe folgen. Das Programm sucht erst, wenn nach einem Suchbegriff kein Stern angegeben ist.

Die Definition der Suchbegriffe darf sich über mehrere Datenfelder in mehreren Tabellen erstrecken. Der Tabellenname muss immer im ersten Parameter angegeben sein.

Der Befehl QUERY ohne bzw. mit Tabellenname als einzigem Argument ruft den Standardsucheditor auf. Wurde zuvor QUERY mit * aufgerufen, wird diese nun ausgeführt. Dadurch können mehrere Suchabläufe in einer Schleife zusammengesetzt werden, die dann mit QUERY ohne * abgeschlossen werden.

Wichtige Punkte

Der Befehl QUERY ändert die aktuelle Auswahl und lädt den ersten Datensatz der Auswahl. Ist die Tabelle im Lese/Schreib-Modus, sperrt 4D diesen Datensatz, falls er noch nicht von einem anderen Benutzer gesperrt wurde.

Mit QUERY können Sie nicht mit Rechenformeln suchen. Benutzen Sie dazu den Befehl QUERY BY FORMULA.

4D zeigt Ihnen den Suchablauf während der Suche an. Wird das Ablaufthermometer angezeigt, kann der Benutzer die Suche mit der Schaltfläche Stop unterbrechen. Mit den Befehlen MESSAGES ON, MESSAGES OFF können Sie diese Anzeige an- bzw. abschalten. Bricht der Anwender die Suche ab, wird OK auf 0 gesetzt, sonst auf 1.

QUERY zwischen zwei Werten (z.B. >5 und <10) wird als Sonderfall angesehen und optimiert ausgeführt.

Query sucht - sofern vorhanden- zuerst nach indizierten Datenfeldern. So läuft die Suche bei indizierten Feldern optimiert ab.

Eine Suche nach Datenfeldern in einer verknüpften Tabelle ist immer sequentiell, d.h. ohne Index.

Den Datenfeldern muss immer der Tabellenname vorangestellt werden.

4D Server: Wenden Sie den Befehl QUERY BY FORMULA im Server-Betrieb vorsichtig an, da er erheblich langsamer ist. Vergleichen Sie dazu auch die Beschreibung dieses Befehls.

Beispiele

5. Sie suchen in der Tabelle [People] alle Personen mit dem Namen Maier. Das Datenfeld Name ist indiziert. Die Suche verläuft daher sehr schnell:

   QUERY([People];[People]Last Name="Maier")

Zur Erinnerung: Diese Suche unterscheidet nicht zwischen "Maier", "maier" und "MAIER", etc. Wollen Sie Groß- und Kleinschreibung voneinander unterscheiden, verwenden Sie die ASCII Codes für eine genauere Suche.

6. Sie suchen in der Tabelle [People] alle Personen mit dem Namen Maier und dem Vornamen Franz. Das Datenfeld Last Name ist indiziert, das Datenfeld First Name nicht. Die Suche erfolgt in zwei Schritten: Die folgende Methode sucht zuerst alle Maier im indizierten Datenfeld Last Name. Im zweiten Schritt sucht sie dann alle Personen mit dem Vornamen Franz. Die zweite, sequentielle Suche geht nur über die schon vorher gefundene Auswahl. Der Zeitverlust ist daher sehr gering.


   QUERY ([People]; [People]Last Name = "maier"; *)  
                           ` Finde alle Personen mit dem Nachnamen Maier
   QUERY ([People]; & ; [People]First Name = "franz")  ` und dem Vornamen Franz

7. Dieses Beispiel sucht nach den Namen Maier oder Huber. Das Datenfeld Last Name ist indiziert und wird für beide Suchläufe verwendet.

   QUERY ([People]; [People]Last Name="maier"; *) 
                  ` Finde alle Personen mit Nachnamen Maier…
   QUERY ([People]; | ; [People]Last Name="huber") ` ...oder Huber

8. Folgendes Beispiel findet alle Personen ohne Firmenname. Gesucht wird nach Eingaben mit leeren Datenfeldern (leerer String).

   QUERY ([People]; [People]Company="") ` Finde alle Personen ohne Firma

9. Folgendes Beispiel findet alle Personen mit dem Nachnamen Maier, die in einer Firma in München arbeiten. Der zweite Suchlauf kann ein Datenfeld aus einer anderen Tabelle verwenden, da die Tabelle [People] durch eine Viele-zu-Eine Verknüpfung mit der Tabelle [Company] verbunden ist:

   QUERY ([People]; [People]Last Name = "Maier"; *)
                               ` Finde alle Personen mit Nachnamen Maier,
   QUERY ([People]; & ; [Company]City = "München")    
                               ` die in einer Firma in München arbeiten.

10. Folgendes Beispiel findet alle Personen mit einem Nachnamen zwischen A (inkl.) und M (inkl.):

   QUERY ([People]; [People]Name < "n") ` Finde alle Personen von A bis M

11. Folgendes Beispiel findet alle Personen, die im Raum München oder Nürnberg wohnen (Postleitzahlengebiet 8 oder 9):

   QUERY ([People]; [People]PLZ Code = "8@"; *) 
                         ` Finde alle Personen im Raum München…
   QUERY ([People]; | ; [People]PLZ Code = "9@")  ` ...oder Nürnberg

12. Folgendes Beispiel sucht in einem indizierten Unterdatenfeld. Diese Suche ergibt keine Auswahl von Unterdatensätzen, sondern von Datensätzen, deren Unterdatensätze das Suchkriterium erfüllen:

   QUERY ([People]; [People]Children'Name = "Karin") 
                        ` Finde alle Personen, die Kind mit Namen Karin haben

13. Folgendes Beispiel sucht nach einer bestimmten Rechnungsnummer:

   vFind:=Request("Finde Rechnungsnummer:") 
                        ` Erhalte Rechnungsnummer vom Benutzer
   If (OK = 1) ` Der Benutzer hat auf OK geklickt
      QUERY ([Invoice]; [Invoice]Number = vFind)  
                        ` Finde Rechnungsnummer der Variablen vFind
   End if

14. Folgendes Beispiel findet alle 1997 ausgestellten Rechnungen. Gesucht wird nach den Datensätzen, die nach dem 31.12.96 und vor dem 1.1.98 eingegeben wurden:

   QUERY ([Invoice]; [Invoice]In Date > !31.12.96!; *) 
                            ` Finde Rechnungen nach 31.12.96…
   QUERY ([Invoice]; &; [Invoice]In Date < !1.1.98!)    ` und vor 1.1.98

15. Folgendes Beispiel findet alle Beschäftigten, deren Gehalt zwischen 1.000 Euro und 3.000 Euro liegt. Personen mit einem Gehalt gleich 1.000 Euro sollen in der Auswahl enthalten sein. Personen, deren Gehalt gleich 3.000 Euro ist, sollen nicht mehr enthalten sein.:

   QUERY ([Employee]; [Employee]Salary >= 1000; *) 
                              ` Finde Beschäftige mit einem Gehalt zwischen… 
   QUERY ([Employee]; & ; [Employee]Salary < 3000) ` ... 1.000 Euro und 3.000 Euro

16. Folgendes Beispiel findet alle Beschäftigten in der Marketingabteilung, deren Gehalt über 4.000 Euro liegt. Die Tabellen [Employee] und [Dept] sind miteinander verknüpft. Das Datenfeld [Dept]Name ist zwar indiziert. Dies ist aber trotzdem keine indizierte Suche, da die Verknüpfung für jeden Datensatz in der Tabelle [Employee] aktiviert werden muss:

   QUERY ([Employee]; [Employee]Salary > 4000; *)  
                     ` Finde Beschäftige mit einem Gehalt über 4.000 Euro und...
   QUERY ([Employee]; & ; [Dept]Name = "Marketing")  ` ... in der Marketingabteilung sind.

17. Folgendes Beispiel sucht nach Informationen aus der Variablen myVar.

   QUERY ([Laws]; [Laws]Text = myVar) ` Find alle in myVar enthaltenen Gesetze

Die Suche kann, je nach dem Wert von myVar, ganz verschiedene Ergebnisse liefern. Zum Beispiel:

Ist myVar gleich"Copyright@", enthält die Auswahl alle Gesetze, die mit Copyright beginnen.

Ist myVar gleich "@Copyright@", enthält die Auswahl alle Gesetze, die das Wort Copyright enthalten.

Referenz

QUERY SELECTION.


4D - Documentation   Français   English   German   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next