Version 6.5 (Geändert)
SET QUERY DESTINATION (Zieltyp{; Zielobjekt})
Parameter | Typ | Beschreibung | |
Zieltyp | Numerisch | 0 aktuelle Auswahl | |
1 Menge | |||
2 temporäre Auswahl | |||
3 Variable | |||
Zielobjekt | String | Variable | Name der Menge, | |
temporären Auswahl oder Variablen |
Beschreibung
Mit dem Befehl SET QUERY DESTINATION können Sie 4th Dimension anweisen, wo das Ergebnis einer nachfolgenden Suche für den aktuellen Prozess abgelegt werden kann.
Im Parameter Zieltyp geben Sie den Typ an. 4th Dimension bietet folgende vordefinierten Konstanten:
Konstante | Typ | Wert |
Into current selection | Lange Ganzzahl | 0 |
Into set | Lange Ganzzahl | 1 |
Into named selection | Lange Ganzzahl | 2 |
Into variable | Lange Ganzzahl | 3 |
Im optionalen Parameter Zielobjekt geben Sie das Ziel der Suche gemäß folgender Tabelle an:
Zieltyp | Zielobjekt |
Parameter | Parameter |
0 (aktuelle Auswahl) | Ohne Parameter. |
1 (Menge) | Übergeben Sie den Namen einer Menge (bestehend oder neu) |
2 (temp. Auswahl) | Übergeben Sie den Namen einer temporären Auswahl |
(bestehend oder neu) | |
3 (Variable) | Übergeben Sie eine numerische Variable (bestehend oder neu) |
Hinweis: Im Client/Server-Betrieb können Sie als Ziel der Suche keine lokalen Mengen verwenden (Der Name beginnt mit dem Dollarzeichen $). Solche eine Menge wird auf Client-Rechnern erstellt, wenn Suchläufe auf dem Server ausgeführt werden. Weitere Informationen dazu finden Sie im Abschnitt Mengen.
SET QUERY DESTINATION(Into current selection)
legt alle Datensätze eines Suchlaufes in eine neue aktuelle Auswahl der betreffenden Tabelle.
SET QUERY DESTINATION(Into set;"mySet")
legt alle Datensätze eines Suchlaufes in die Menge "mySet". Die aktuelle Auswahl und der aktuelle Datensatz der betreffenden Tabelle bleiben unverändert.
SET QUERY DESTINATION(Into named selection;"myNamedSel")
legt alle Datensätze eines Suchlaufes in die temporäre Auswahl "myNamedSel". Die aktuelle Auswahl und der aktuelle Datensatz der betreffenden Tabelle bleiben unverändert.
SET QUERY DESTINATION(Into variable;$vlResult)
legt die Anzahl der Datensätze in die Variable $vlResult. Die aktuelle Auswahl und der aktuelle Datensatz der betreffenden Tabelle bleiben unverändert.
Warnung: SET QUERY DESTINATION beeinflusst alle nachfolgenden Suchläufe im aktuellen Prozess. Sie MÜSSEN deshalb einen Aufruf von SET QUERY DESTINATION (Zieltyp#0) immer mit dem Aufruf von SET QUERY DESTINATION(0) gegensteuern, damit der normale Suchmodus wiederhergestellt wird.
SET QUERY DESTINATION ändert nur das Verhalten der Suchbefehle:
QUERY
SET QUERY DESTINATION hat keinen Einfluss auf andere Befehle, die die aktuelle Auswahl verändern können, wie z.B. ALL RECORDS, RELATE MANY usw..
Beispiele
1. Sie erstellen ein Formular, das die Datensätze aus eine Tabelle [Phone Book] anzeigt sowie eine Registerkarte asRolodex (mit den 26 Buchstaben des Alphabets) und ein Unterformular, das die Datensätze [Phone Book] anzeigt. Wählen Sie nun ein Tab aus der Registerkarte, erscheinen die Datensätze, die mit dem entsprechenden Buchstaben beginnen.
Die Tabelle [Phone Book] enthält eine ganze Reihe statischer Daten, so dass Sie nicht jedes Mal, wenn Sie ein Tab auswählen, einen Suchlauf starten müssen. So können Sie wertvolle Zeit für die Datenbank-Engine einsparen.
Sie legen die Suchläufe in temporären Auswahlen ab, die Sie bei Bedarf wiederverwenden können. Für die Registerkarte asRolodex schreiben Sie folgende Objektmethode:
` Objektmethode asRolodex Case of : (Form event=On Load) ` Bevor das Formular auf dem Bildschirm erscheint, ` initialisieren Sie die Kartei und ein Array vom Typ Boolean, ` das angibt, ob für den jeweiligen Buchstaben eine Suche ` durchgeführt wurde ARRAY STRING(1;asRolodex;26) ARRAY BOOLEAN(abQueryDone;26) For ($vlElem;1;26) asRolodex{$vlElem}:=Char(64+$vlElem) abQueryDone{$vlElem}:=False End for : (Form event=On Clicked) ` Wird ein Tab angeklickt, prüfe, ob die dazugehörige Suche ausgeführt wurde ` oder nicht If (Not(abQueryDone{asRolodex})) ` Falls nein, lege die nächste Suche in eine temporäre Auswahl SET QUERY DESTINATION(Into named selection;"Rolodex"+asRolodex{asRolodex}) ` Führe die Suche aus QUERY([Phone Book];[Phone Book]Last name=asRolodex{asRolodex}+"@") ` Stelle normalen Suchmodus wieder her SET QUERY DESTINATION(Into current selection) ` Wird dieser Buchstabe erneut ausgewählt, ` wird die Suche nicht erneut ausgeführt. abQueryDone{asRolodex}:=True End if ` Verwende temporäre Auswahl, um die Datensätze zum gewählten Buchstaben zu zeigen USE NAMED SELECTION("Rolodex"+asRolodex{asRolodex}) : (Form event=On Unload) ` Erscheint das Formular nicht mehr auf dem Bildschirm, ` Lösche die zuvor erstellte temporäre Auswahl For ($vlElem;1;26) If(abQueryDone{$vlElem}) CLEAR NAMED SELECTION("Rolodex"+asRolodex{$vlElem}) End if End for ` Lösche die beiden nicht mehr benötigten Arrays CLEAR VARIABLE(asRolodex) CLEAR VARIABLE(abQueryDone) End case
2. Mit der Projektmethode Unique values in diesem Beispiel können Sie die Einmaligkeit der Werte für jede Datensatzzahl in einer Tabelle prüfen. Der aktuelle Datensatz kann ein vorhandener oder ein neu erstellter Datensatz sein.
` Projektmethode Unique values ` Unique values ( Pointer ; Pointer { ; Pointer... } ) -> Boolean ` Unique values ( ->Table ; ->Field { ; ->Field2... } ) -> Ja oder Nein C_BOOLEAN($0) C_POINTER(${1}) C_LONGINT($vlField;$vlNbFields;$vlFound;$vlCurrentRecord) $vlNbFields:=Count parameters-1 $vlCurrentRecord:=Record number($1->) If ($vlNbFields>0) If ($vlCurrentRecord#-1) If ($vlCurrentRecord<0) ` Aktueller Datensatz ist ein ungesicherter neuer Datensatz (Datensatznr ist -3) ` so können wir die Suche stoppen, sobald mindestens ein Datensatz gefunden wurde SET QUERY LIMIT(1) Else ` Aktueller Datensatz ist ein vorhandener Datensatz, ` so können wir die Suche stoppen, sobald mindestens zwei Datensätze gefunden wurden SET QUERY LIMIT(2) End if ` Die Suche gibt das Ergebnis in $vlFound zurück ` ohne den aktuellen Datensatz oder die aktuelle Auswahl zu ändern. SET QUERY DESTINATION(Into variable;$vlFound) ` Führe Suche gemäß der festgelegten Anzahl Datensätze aus Case of : ($vlNbFields=1) QUERY($1->;$2->=$2->) : ($vlNbFields=2) QUERY($1->;$2->=$2->;*) QUERY($1->; & ;$3->=$3->) Else QUERY($1->;$2->=$2->;*) For ($vlField;2;$vlNbFields-1) QUERY($1->; & ;${1+$vlField}->=${1+$vlField}->;*) End for QUERY($1->; & ;${1+$vlNbFields}->=${1+$vlNbFields}->) End case SET QUERY DESTINATION(Into current selection) ` Stelle normalen Suchmodus wieder her SET QUERY LIMIT(0) ` Suchläufe sind nicht mehr begrenzt ` Bearbeite Suchergebnis Case of : ($vlFound=0) $0:=True ` Keine doppelten Werte : ($vlFound=1) If ($vlCurrentRecord<0) $0:=False ` Vorhandener Datensatz mit denselben Werten wie ungesicherter neuer Datensatz wurde gefunden Else $0:=True ` Keine doppelten Werte, es wurde nur genau derselbe Datensatz gefunden End if : ($vlFound=2) $0:=False ` Egal aus welchem Grund, die Werte wurden dupliziert End case Else If (<>DebugOn) ` Macht keinen Sinn, signalisiere, wenn Entwicklerversion TRACE ` WARNUNG! Unique values wird NICHT mit aktuellem Datensatz aufgerufen. End if $0:=False ` Keine Garantie für korrektes Ergebnis End if Else If (<>DebugOn) ` Macht keinen Sinn, signalisiere, wenn Entwicklerversion TRACE ` WARNUNG! Unique values wird OHNE Suchbedingung aufgerufen End if $0:=False ` Keine Garantie für korrektes Ergebnis End if
Haben Sie diese Projektmethode in Ihre Anwendung integriert, können Sie schreiben:
` ... If (Unique values (->[Contacts];->[Contacts]Company);->[Contacts]Last name; ->[Contacts]First name) ` Führe geeignete Aktionen für diesen Datensatz mit einmaligen Werten aus. Else ALERT("Es gibt bereits einen Contact mit diesem Namen in dieser Firma.") End if ` ...
Referenz
QUERY, QUERY BY EXAMPLE, QUERY BY FORMULA, QUERY SELECTION, QUERY SELECTION BY FORMULA, QUERY WITH ARRAY, SET QUERY LIMIT.