4D v16.3

SET QUERY DESTINATION

Home

 
4D v16.3
SET QUERY DESTINATION

SET QUERY DESTINATION 


 

SET QUERY DESTINATION ( Zieltyp {; Zielobjekt {; Zielzeiger}} ) 
Parameter Typ   Beschreibung
Zieltyp  Lange Ganzzahl in 0=aktuelle Auswahl, 1=Menge, 2=temporäre Auswahl, 3=Variable
Zielobjekt  String, Variable in Name der Menge, temporären Auswahl oder Variablen
Zielzeiger  Zeiger in 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

Im optionalen Parameter Zielobjekt geben Sie das Ziel der Suche gemäß folgender Tabelle an:

ZieltypZielobjekt
ParameterParameter
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 (bestehend oder neu) 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:

  • Existiert bisher keine temporäre Auswahl, wird sie automatisch am Ende des Suchlaufs angelegt.
  • Dieser Befehl behandelt temporäre Auswahlen wie der Befehl CUT NAMED SELECTION, d.h. es werden nur Referenzen beibehalten. Wurde die temporäre Auswahl verwendet, besteht sie nicht länger.

 SET QUERY DESTINATION(Into variable;$vlResult)

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:

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

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



Siehe auch 

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

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Suchen
Nummer: 396

This command can be run in preemptive processes

 
GESCHICHTE 

Geändert: 4D v11 SQL
Geändert: 4D v13

 
ARTIKELVERWENDUNG

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