Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
SET QUERY DESTINATION
|
SET QUERY DESTINATION ( Zieltyp {; Zielobjekt {; Zielzeiger}} ) | ||||||||
Parameter | Typ | Beschreibung | ||||||
Zieltyp | Lange Ganzzahl |
![]() |
0=aktuelle Auswahl, 1=Menge, 2=temporäre Auswahl, 3=Variable | |||||
Zielobjekt | String, Variable |
![]() |
Name der Menge, temporären Auswahl oder Variablen | |||||
Zielzeiger | Zeiger |
![]() |
Zeiger auf die lokale Variable, wenn Zieltyp=3 | |||||
Der Befehl SET QUERY DESTINATION gibt an, 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 named selection | Lange Ganzzahl | 2 |
Into set | Lange Ganzzahl | 1 |
Into variable | Lange Ganzzahl | 3 |
Zieltyp | Zielobjekt |
Parameter | Parameter |
0 (aktuelle Auswahl) | Parameter weglassen |
1 (Menge) | Den Namen einer Menge übergeben (bestehend oder neu) |
2 (temp. Auswahl) | Den Namen einer temporären Auswahl übergeben (bestehend oder neu) |
3 (Variable) | Eine numerische Variable (definiert) oder einen leeren String "" zum Verwenden des Parameters Zielzeiger übergeben. |
Beispiele:
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.
Hinweise:
SET QUERY DESTINATION(Into variable;$vlResult)
Hinweis: Bei dieser Syntax muss die Variable $vlResult definiert sein, sonst wird ein Fehler zurückgegeben.
Oder:
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.
Hinweis: Die zweite Syntax vereinfacht die Verwendung dieses Befehls zusammen mit GET QUERY DESTINATION
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:
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,
` initialisiere Rolodex und ein Boolean Array, das
` uns mitteilt, ob eine Suche für den entsprechenden Buchstaben
` ausgeführt wurde oder nicht.
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)
` Bei einem Klick auf die Registerkarte prüfe, ob die
` entsprechende Suche ausgeführt wurde oder nicht.
If(Not(abQueryDone{asRolodex}))
` Wenn nicht, leite die nächste Suche zur temporären Auswahl
SET QUERY DESTINATION(Into named selection;"temp")
` Führe die Suche aus
QUERY([Phone Book];[Phone Book]Last name=asRolodex{asRolodex}+"@")
` Stelle den normalen Suchmodus wieder her
SET QUERY DESTINATION(Into current selection)
` Verwende die gefundenen Datensätze
USE NAMED SELECTION("temp")
COPY NAMED SELECTION([Phone book];"Rolodex+asRolodex{asRolodex})
` Wird dieser Buchstabe wieder gewählt, wird die Suche nicht erneut ausgeführt
abQueryDone{asRolodex}:=True
Else
` Verwende die vorhandene temporäre Auswahl, um die Datensätze zum gewählten Buchstaben anzuzeigen
USE NAMED SELECTION("Rolodex"+asRolodex{asRolodex}
End if
:(FORM Event=On Unload)
` Erscheint das Formular nicht auf dem Bildschirm
` Lösche die angelegten temporären Auswahlen
For($vlElem;1;26)
If(abQueryDone{$vlElem})
CLEAR NAMED SELECTION("Rolodex"+asRolodex{$vlElem})
End if
End for
` Lösche die zwei nicht mehr benötigten Arrays
CLEAR VARIABLE(asRolodex)
CLEAR VARIABLE(abQueryDone)
End case
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
` ...
GET QUERY DESTINATION
QUERY
QUERY BY EXAMPLE
QUERY BY FORMULA
QUERY BY SQL
QUERY SELECTION
QUERY SELECTION BY FORMULA
QUERY WITH ARRAY
SET QUERY LIMIT
Produkt: 4D
Thema: Suchen
Nummer:
396
Geändert: 4D v11 SQL
Geändert: 4D v13
4D Programmiersprache ( 4D v20 R7)