Version 11 (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 4D anweisen, wo das Ergebnis einer nachfolgenden Suche für den aktuellen Prozess abgelegt werden kann.
Im Parameter Zieltyp geben Sie den Typ an. 4D bietet unter dem Thema Suchen 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
QUERY BY SQL
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 einen Reiter 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 BY SQL, QUERY SELECTION, QUERY SELECTION BY FORMULA, QUERY WITH ARRAY, SET QUERY LIMIT.