Version 11.2 (Geändert)
QUERY BY FORMULA ({Tabellenname}{; }{Formel})
Parameter | Typ | Beschreibung | |
Tabellenname | Tabelle | Tabelle, in der eine Datensatzauswahl | |
zurückgegeben wird | |||
Formel | Boolean | Suchformel |
Beschreibung
Der Befehl QUERY BY FORMULA sucht nach Datensätzen in Tabellenname. QUERY BY FORMULA ändert die aktuelle Auswahl Tabellenname für den aktuellen Prozess. Der erste Datensatz der neuen Auswahl ist nun der aktuelle Datensatz.
QUERY BY FORMULA und QUERY SELECTION BY FORMULA haben dieselbe Arbeitsweise. Der Unterschied liegt darin, dass QUERY BY FORMULA jeden Datensatz in der Tabelle durchsucht, während QUERY SELECTION BY FORMULA nur die Datensätze der aktuellen Auswahl durchsucht.
Beide Befehle wenden Formel auf jeden Datensatz der Tabelle bzw. der Auswahl an. Formel ist ein Boolean Ausdruck, der den Wert WAHR oder FALSCH hat. Bei WAHR wird der Datensatz in die neue Auswahl aufgenommen.
Formel kann einfach sein, z.B. ein Datenfeld mit einem Wert vergleichen; oder komplex, z.B. eine Berechnung durchführen oder eine Information in einer verknüpften Tabelle bewerten. Formel kann ein 4D Befehl sein oder eine selbst erstellte Methode bzw. ein Ausdruck. Bei Feldern vom Typ Text oder alphanumerisch können Sie auch mit dem Joker-Zeichen @ arbeiten und mit dem Operator "enthält Schlüsselwort" (%) für Volltextsuche. Weitere Informationen dazu finden Sie unter dem Befehl QUERY.
Wird der Parameter Formel nicht angegeben, erscheint der Standardsuchdialog.
Ist die Suche ausgeführt, wird der erste Datensatz der neuen Auswahl von der Festplatte geladen und der aktuelle Datensatz.
Diese Befehle führen je nach Suchtyp die gleichen Suchläufe wie mit dem Befehl QUERY aus. So führt z.B. die Anweisung QUERY BY FOR-MULA([mytable]; [mytable]myfield=value) dasselbe aus wie QUERY([mytable]; [mytable]myfield=value), d.h. sie kann auch den Index ver-wenden. 4D kann auch Suchläufe mit Teilen, die nicht-optimierbar sind, optimieren. Dazu werden zuerst die optimierbaren Teile ausgeführt und die Ergeb-nisse dann mit der restlichen Suche kombiniert. Beispiel: Die Anweisung QUERY BY FORMULA([mytable]; Length(myfield)=value) wird nicht optimiert. Die Anweisung QUERY BY FORMULA([mytable]; Length(myfield)=value1 | myfield=value2) wird dagegen teilweise opti-miert.
Diese Befehle führen standardmäßig "joins" wie SQL aus. Das heißt, es muss nicht zwingend eine automatische Verknüpfung zwischen Tabelle A und Tabelle B exi-stieren, um eine Anweisung vom Typ QUERY BY FOR-MULA([Tabelle_A];[Tabelle_A]Feld_X = [Tabelle_B]Feld_Y zu verwenden (siehe Beispiel 3).
Sind automatische Ver-knüpfungen vorhanden, die im Struktureditor angelegt wurden, werden sie in der Regel nicht verwendet, sondern nur in fol-genden Fällen:
- Wenn SuchFormel sich nicht in der Form {Feld; Vergleichsoperator; Wert} aufschlüsseln lässt.
- Wenn zwei Felder der gleichen Tabelle miteinander verglichen werden.
Hinweis: Zur Wahrung der Kompatiblilät, ist es möglich, die "joins" Mechanismen zu deaktivieren, entweder global über die Voreinstellungen (nur konver-tierte Datenbanken) oder pro Prozess über den Befehl SET DATABASE PARAMETER.
4D Server: Die Befehle laufen ab Version 11 auf dem Server, was ihre Ausführung optimiert. Beachten Sie jedoch, dass die Suche bei direkt über Formel aufgerufenen Variablen mit den Werten der Variablen des Client-Rechners berechnet werden.
Beispiel: Die Anweisung QUERY BY FORMULA([mytable]);[mytable]myfield=myvariable) läuft auf dem Server, jedoch mit dem Inhalt der Variablen myvariable des Client-Rechners.
Diese Vorgehensweise gilt jedoch nicht für Formeln mit Methoden, die ihrer-seits Variablen aufrufen. Der Wert dieser Variablen wird auf dem Server berechnet. In diesem Kontext ist die Verwendung der Option Auf Server ausführen sinnvoll, denn sie ermöglicht, dass eine Methode während der Übergabe von Parametern (Variablen) auf dem Server aus-geführt wird.
In früheren 4D Server Versionen wurden diese Befehle auf dem Client-Rechner ausgeführt. Zur Wahrung der Kompatibilität wird diese Arbeitsweise für konvertierte Datenbanken beibehalten. Es gibt jedoch eine Einstellung und einen Selektor im Befehl SET DATABASE PARAMETER, um konvertierte Datenbanken nach und nach an die Funktionsweise von Version 11 anzupassen.
Beispiele
1. Dieses Beispiel findet die Datensätze für alle Rechnungen, die - unabhängig vom Jahr - im Monat Dezember eingegeben wurden. Dazu wird die Funktion Month of auf jeden Datensatz angewandt. Diese Suche könnte sonst nur ausgeführt werden, wenn für Monat ein eigenes Feld eingerichtet würde:
QUERY BY FORMULA ([Invoice]; Month of ([Invoice]Entered) = 12) ` Finde Rechnungen, die im Dezember eingegeben wurden
2. Dieses Beispiel findet die Datensätze für alle Personen, deren Name mehr als 10 Zeichen enthält:
QUERY BY FORMULA ([People]; Length ([People]Name)>10) ` Finde Namen, die mehr als 10 Zeichen enthalten
3. Dieses Beispiel aktiviert SQL joins für eine spezifische Suche nach Formel:
$currentval:= Get database parameter(QUERY BY FORMULA Joins) SET DATABASE PARAMETER(QUERY BY FORMULA Joins;2) `SQL joins aktivieren `Alle Zeilen der Kundenrechnungen "ACME" suchen, `auch wenn die Tabellen nicht verknüpft sind. QUERY BY FORMULA([invoice_line] ; [invoice_line]invoice_id = [invoice]id & [invoice]client = "ACME") SET DATABASE PARAMETER(QUERY BY FORMULA Joins;$currentval)# `Die aktuellen Einstellungen wiederherstellen
Referenz
QUERY, QUERY BY SQL, QUERY SELECTION, QUERY SELECTION BY FORMULA.
Case-Sensitive Operations in 4th Dimension, Optimizing Searches with Hashes