4D v16.3

QUERY

Home

 
4D v16.3
QUERY

QUERY 


 

QUERY ( {Tabellenname }{;}{ Suchbegriff {; *}} ) 
Parameter Typ   Beschreibung
Tabellenname  Tabelle in Tabelle, in der gesucht werden soll
Ohne Angabe Haupttabelle
Suchbegriff  Ausdruck in Operatoren und Suchbegriffe
Operator in Weiterer Suchbegriff folgt

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 und macht den ersten Datensatz der neuen Auswahl zum aktuellen 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 es ist die letzte Zeile einer komplexen Suche (siehe Beispiel 2). Der Sucheditor sieht folgendermaßen aus:

Weitere Informationen dazu finden Sie im Abschnitt Sucheditor des Handbuchs 4D Designmodus.

Der Benutzer baut die Suche auf und klickt dann auf die Schaltfläche Suche oder wählt im DropDown-Menü links oben den Eintrag Suche in Auswahl, um die Suche auszuführen. Läuft die Suche ohne Unterbrechung, wird die Systemvariable OK auf 1 gesetzt. Klickt der Benutzer auf die Schaltfläche Abbrechen, beendet QUERY ohne eine Suche auszuführen und setzt die Systemvariable OK auf 0 (Null).

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

 QUERY([Products])

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 nachfolgend.

Folgende Zeile sucht in der Tabelle [People] nach Nachnamen, die mit “a” beginnen:

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

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

Hinweis: Die Interpretation des Zeichens @ in Suchläufen lässt sich über eine Option in den Voreinstellungen ändern. Weitere Informationen dazu finden Sie im Abschnitt Vergleichsoperatoren.

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#

Der Operator ist optional und wird bei einer einfachen oder mehrfachen Suche nicht für den ersten Aufruf von QUERY verwendet. Lassen Sie ihn in einer mehrfachen Suche weg, wird standardmäßig UND (&) verwendet.

  • Datenfeld ist das Datenfeld, auf das sich die Suche bezieht. Das Feld kann aus einer anderen Tabelle stammen, wenn es zur Eine-Tabelle gehört, die über eine automatische oder manuelle Verknüpfung mit Tabellenname verknüpft ist.
  • 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<=
Enthält Schlüsselwort%

Sie können den Vergleichsoperator auch als alphanumerischen Ausdruck anstatt als Symbol definieren. In diesem Fall müssen Sie die einzelnen Ausdrücke in der Suchkette durch Strichpunkt voneinander trennen. Auf diese Weise können Sie z.B. durch Variieren des Vergleichsoperators konfigurierbare Suchläufe erstellen oder individuell auf den Benutzer abgestimmte Suchoberflächen. Weitere Informationen dazu finden Sie im Beispiel 21.

Wert wird mit dem Wert in Datenfeld verglichen. Der Wert kann jeder Ausdruck sein, der denselben Datentyp wie Datenfeld bewertet. Der Typ von Wert wird nur einmal, und zwar bei Beginn der Suche bewertet und nicht für jeden Datensatz. Suchen Sie eine Zeichenkette, die eine bestimmte Buchstabenkombination enthält (eine Suche mit "enthält"), setzen Sie die Buchstaben zwischen zwei Klammeraffen @, beispielsweise @mburg@. Beachten Sie, dass solch eine Suche wegen der kompakten Datenspeicherung nur teilweise vom Index profitiert.
Eine Enthält-Suche ist nur für Datenfelder vom Typ Alpha oder Text verfügbar. Weitere Informationen dazu finden Sie im Abschnitt Vergleichsoperatoren.

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

  • In der ersten Suchzeile darf kein Operator stehen.
  • In den folgenden Zeilen kann der Suchbegriff mit einem Operator beginnen. Lassen Sie ihn weg, wird standardmäßig UND (&) verwendet.
  • 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.

Hinweis: Jede Tabelle behält ihre eigene aktuell festgelegte Suche. So können Sie gleichzeitig komplexe Suchläufe erstellen, und zwar eine pro Tabelle. Zum Festlegen der Tabelle müssen Sie den Parameter Tabellenname verwenden oder die Standardtabelle setzen.

Egal, wie eine Suche definiert wurde, gilt folgendes:

  • Bei länger dauernden Suchläufen zeigt 4D automatisch eine Meldung mit einem Ablaufbalken. Mit den Befehlen MESSAGES ON, MESSAGES OFF können Sie diese Anzeige an- bzw. abschalten. Wird das Ablaufthermometer angezeigt, kann der Benutzer die Suche mit der Schaltfläche Stop unterbrechen. Ist die Suche abgeschlossen, wird OK auf 1 gesetzt. Wird die Suche abgebrochen, wird OK auf 0 (Null) gesetzt.
  • Sind indizierte Datenfelder angegeben, wird zuerst nach diesen Datenfeldern gesucht. So läuft die Suche bei indizierten Feldern optimiert ab. d.h. sie benötigt am wenigsten Zeit. Bei Suchläufen mit AND (&) verwendet der Befehl zusammengesetzte Indizes.

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 Zeichen-Codes für eine genauere Suche.

Dieses Beispiel sucht in der Tabelle [People] alle Personen mit dem Namen Franz Maier. Das Datenfeld Last Name ist indiziert, das Datenfeld First Name nicht.

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

Beim Ausführen der Suche erfolgt eine indizierte Suche auf das Datenfeld Last Name, die Datensatzauswahl wird auf die Personen mit Namen Maier eingeschränkt. Dann wird in dieser Auswahl sequentiell nach dem Vornamen Franz gesucht. Der Zeitverlust ist daher sehr gering.

Dieses Beispiel nutzt automatisch die Vorteile des zusammengesetzten Indexes aus den Feldern [People]First Name+[People]Last Name (falls vorhanden) zur Suche der Datensätze für alle Personen mit Namen Franz Maier.

 QUERY([People];[People]First Name="franz";*) ` Suche alle Personen mit Vorname Franz
 QUERY([People];&;[People]Last Name="maier") ` mit Maier als Nachname

Weitere Informationen dazu finden Sie unter Zusammengesetzter Index.

Dieses Beispiel sucht nach den Namen Maier oder Huber. Das Datenfeld Last Name ist indiziert und wird für beide Suchläufe verwendet. Die Ergebnisse werden in interne Mengen gelegt und evtl. über eine Vereinigung kombiniert.

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

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

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.

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

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

Volltextsuche: Folgendes Beispiel such in der Tabelle [Products] nach Datensätzen, die im Feld Beschreibung das Wort “einfach” enthalten:

 QUERY([Products];[Products]Description%"einfach")
  ` Finde Produkte, deren Beschreibung das Wort einfach enthalten.

Folgendes Beispiel sucht nach einer bestimmten Rechnungsnummer:

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

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

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

Folgendes Beispiel findet alle Beschäftigten in der Marketing-Abteilung, deren Gehalt über 4.000 Euro liegt. Es wird zuerst im Datenfeld Salary gesucht, das es indiziert ist. Die zweite Suche verwendet ein Datenfeld aus einer anderen Tabelle. Das ist möglich, da die Tabellen [Employee] und [Dept]über eine automatische Viele-zu-Eine Verknüpfung verbunden sind:

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

Es gibt drei Tabellen, die über eine Viele-zu-Eine Verknüpfung verbunden sind: [City] -> [Department] -> [Region]. Die folgende Suche findet alle Regionen mit Städten, deren Name mit "Sankt" beginnt:

 QUERY([Region];[City]Name="Sankt@") ` Finde alle Regionen mit Städten, die mit "Sankt" beginnen.

Folgendes Beispiel sucht nach Informationen aus der Variablen myVar.

 QUERY([Laws];[Laws]Text =myVar) ` Finde 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.

Dieses Beispiel fügt je nach Wert der Variablen in einer komplexen Suche Zeilen hinzu oder nicht. So werden nur die für die Suche gültigen Kriterien berücksichtigt:

 QUERY([Invoice];[Invoice]Paid=False;*)
 If($city#"") ` Wurde eine Stadt angegeben.
    QUERY([Invoice];[Invoice]Delivery_city=$city;*)
 End if
 If($zipcode#"") ` Wurde eine Postleitzahl angegeben.
    QUERY([Invoice];[Invoice]ZipCode=$zipcode;*)
 End if
 QUERY([Invoice]) ` Ausführung der Suche nach dem angegebenen Kriterium

Dieses Beispiel zeigt die Verwendung des Vergleichsoperators als alphanumerischen Ausdruck. Sein Wert wird über ein PopUp-Menü definiert, das in einem eigenen Suchdialog angelegt wurde:

 C_TEXT($oper)
 $oper:=_popup_operator{_popup_operator} `$oper entspricht z.B. "#" oder "="
 If(OK=1)
    QUERY(Invoice];[Invoice]Amount;$oper;$amount)
 End if

Der Einsatz von Volltext-Indizes für Bilder kann Ihre Anwendungen signifikant beschleunigen:

 QUERY([PICTURES];[PICTURES]Photos %"Katzen") // Suche nach Fotos mit dem Schlüsselwort "Katzen"

Wurde die Suche korrekt ausgeführt, wird die Systemvariable OK auf 1 gesetzt.

Die Variable OK wird auf 0 (Null) gesetzt, wenn:

  • Der Benutzer im Suchdialog auf die Schaltfläche Abbrechen klickt,
  • Die Suche im Modus 'Suchen und Sperren' (siehe Befehl SET QUERY AND LOCK) mindestens einen gesperrten Datensatz gefunden hat. In diesem Fall wird auch die Systemmenge LockedSet aktualisiert.



Siehe auch 

Operatoren
QUERY SELECTION

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Suchen
Nummer: 277

Dieser Befehl ändert die Systemvariable OKDieser Befehl ändert die Systemmenge LockedSetDieser Befehl ändert den aktuellen DatensatzDieser Befehl ändert die aktuelle AuswahlThis command can be run in preemptive processes

 
GESCHICHTE 

Geändert: 4D v11 SQL

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)