SET QUERY DESTINATION

4D - Documentation   Français   English   German   English   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 11 (Geändert)


SET QUERY DESTINATION (Zieltyp{; Zielobjekt})

ParameterTypBeschreibung
ZieltypNumerisch0  aktuelle Auswahl
1  Menge
2  temporäre Auswahl
3  Variable
ZielobjektString | VariableName 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:

KonstanteTypWert
Into current selectionLange Ganzzahl0
Into setLange Ganzzahl1
Into named selectionLange Ganzzahl2
Into variableLange Ganzzahl3

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

ZieltypZielobjekt
ParameterParameter
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 SELECTION

QUERY BY EXAMPLE

QUERY BY FORMULA

QUERY BY SQL

QUERY SELECTION BY FORMULA

QUERY SELECTION WITH ARRAY

QUERY WITH ARRAY

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.

Anwendung des Befehls

Highlight Selection


4D - Documentation   Français   English   German   English   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next