Virtuelle Felder während des Join-Parsings beibehalten

In diesem Abschnitt:

Es gibt zwei Möglichkeiten, virtuelle Felder während des Join-Parsings beizubehalten. Sie können entweder KEEPDEFINES oder DEFINE FILE SAVE und DEFINE FILE RETURN verwenden.


Nach oben

x
Virtuelle Felder mit KEEPDEFINES ON beibehalten

Vorgehensweise:

Referenz:

Der Parameter KEEPDEFINES bestimmt, ob ein virtuelles Feld, das von einem DEFINE-Befehl für eine Hoststruktur oder eine verbundene Struktur erstellt wurde, beibehalten oder gelöscht wird, nachdem der JOIN-Befehl ausgeführt wurde. Dies gilt, wenn der Befehl DEFINE dem Befehl JOIN vorausgeht.

Die vorherigen virtuellen Felder bilden einen sogenannten Kontext. Bei jedem neuen Kontext wird eine neue Schicht oder Befehlsumgebung erstellt. Wenn Sie zum ersten Mal auf eine neue Umgebung zugreifen, stehen alle virtuellen Felder, die in der vorherigen Schicht definiert wurden, zur Verfügung. Das Überschreiben oder Leeren einer Definition eines virtuellen Feldes betrifft immer nur die aktuelle Schicht. Wenn Sie zur vorherigen Schicht zurückkehren, sind die Definitionen der virtuellen Felder dort intakt.

Neue DEFINE-Felder, die nach dem JOIN-Befehl ausgegeben wurden, bilden einen weiteren Kontext und erzeugen dadurch einen Kontextstapel. In jedem Kontext sind alle virtuellen Felder der vorherigen Kontexte ebenfalls verfügbar.

Ein Befehl JOIN CLEAR as_name entfernt alle Kontexte, die nach der Ausgabe von JOIN as_name erstellt wurden.

Bei auf DEFINE basierenden bedingten Joins muss KEEPDEFINES auf ON gestellt werden. Sie müssen dann alle virtuellen Felder erstellen, bevor Sie den auf DEFINE basierenden bedingten JOIN-Befehl ausgeben. Dies unterscheidet sich von herkömmlichen Joins, die auf DEFINE basieren, bei denen das virtuelle Feld nach dem JOIN-Befehl erstellt wird. Ein virtuelles Feld kann außerdem Teil der JOIN- oder WHERE-Syntax sein.

DEFINE-Befehle, die nach dem JOIN-Befehl ausgegeben wurden, ersetzen oder löschen die virtuellen Felder nicht, die vor dem Join erstellt wurden, da ein neuer Dateikontext erstellt wird.



x
Syntax: KEEPDEFINES verwenden
SET KEEPDEFINES = {ON|OFF}

Hierbei gilt:

ON
Behält das virtuelle Feld nach der Ausführung des JOIN-Befehls bei.
OFF
Löscht das virtuelle Feld, nachdem ein JOIN-Befehl ausgeführt wurde. Dieser Wert ist der Defaultwert.


x
Referenz: Verwendungshinweise für KEEPDEFINES

Virtuelle Felder, die definiert wurden, bevor KEEPDEFINES ON eingestellt wurde, sind nach einem JOIN-Befehl nicht mehr vorhanden.



Beispiel: Virtuelle Felder während des Join-Parsings mit KEEPDEFINES beibehalten

Das erste virtuelle Feld (DAYSKEPT) wird vor der Erstellung der Joins definiert, jedoch nach dem Einstellen von KEEPDEFINES auf ON. DAYSKEPT ist die Anzahl der Tage zwischen dem Rückgabedatum und dem Ausleihdatum für eine Videokassette:

SET KEEPDEFINES = ON
DEFINE FILE VIDEOTRK
DAYSKEPT/I5 = RETURNDATE - TRANSDATE;
END

Der ? DEFINE-Abfragebefehl zeigt, dass dies das einzige derzeit definierte virtuelle Feld ist:

? DEFINE
FILE     FIELD NAME                  FORMAT  SEGMENT   VIEW       TYPE
VIDEOTRK DAYSKEPT                    I5            4

Die folgende Anfrage druckt alle Transaktionen, für die die Anzahl der Tage zwei ist:

TABLE FILE VIDEOTRK
PRINT MOVIECODE TRANSDATE RETURNDATE DAYSKEPT
COMPUTE ACTUAL_DAYS/I2 = RETURNDATE-TRANSDATE;
WHERE DAYSKEPT EQ 2
END

Die ersten paar Zeilen der Ausgabe zeigen, dass jedes Rückgabedatum zwei Tage nach den Transaktionsdatum liegt:

MOVIECODE  TRANSDATE  RETURNDATE  DAYSKEPT  ACTUAL_DAYS
---------  ---------  ----------  --------  -----------
001MCA     91/06/27   91/06/29           2            2
692PAR     91/06/27   91/06/29           2            2
259MGM     91/06/19   91/06/21           2            2

Nun wird die VIDEOTRK-Datenquelle mit der MOVIES-Datenquelle verbunden. Die ? DEFINE-Abfrage zeigt, dass der Join das virtuelle Feld DAYSKEPT nicht gelöscht hat:

JOIN  MOVIECODE IN VIDEOTRK TO ALL MOVIECODE IN MOVIES AS J1
? DEFINE
FILE     FIELD NAME                  FORMAT  SEGMENT   VIEW       TYPE
VIDEOTRK DAYSKEPT                    I5            4

Danach wird ein neues virtuelles Feld (YEARS) für den Join zwischen VIDEOTRK und MOVIES definiert:

DEFINE FILE VIDEOTRK
YEARS/I5 = (TRANSDATE - RELDATE)/365;
END

Die ? DEFINE-Abfrage zeigt, dass das virtuelle Feld, das vor dem Join erstellt wurde, von diesem neuen virtuellen Feld nicht gelöscht wurde, da es sich in einem separaten Kontext befindet:

? DEFINE
FILE     FIELD NAME                   FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK DAYSKEPT                     I5            4
VIDEOTRK YEARS                        I5            5

Danach wird das Feld DAYSKEPT neu definiert, so dass es die Anzahl der tatsächlichen Tage plus eins widerspiegelt:

DEFINE FILE VIDEOTRK
DAYSKEPT/I5 = RETURNDATE - TRANSDATE + 1;
END

Die ? DEFINE-Abfrage zeigt, dass zwei Versionen des virtuellen Feldes DAYSKEPT vorhanden sind. YEARS wurde jedoch gelöscht, da es sich (nach dem Join) im selben Kontext befand, wie die neue Version von DAYSKEPT und der DEFINE-Befehl die Option ADD nicht angegeben hat:

? DEFINE
FILE     FIELD NAME                   FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK DAYSKEPT                     I5            4
VIDEOTRK DAYSKEPT                     I5            4

Dieselbe Anfrage verwendet nun die neue Definition für DAYSKEPT. Beachten Sie, dass die Anzahl der Tage zwischen dem Rückgabedatum und dem Transaktionsdatum tatsächlich ein und nicht zwei Tage ist, da die Definition von DAYSKEPT geändert wurde:

MOVIECODE  TRANSDATE  RETURNDATE  DAYSKEPT  ACTUAL_DAYS
---------  ---------  ----------  --------  -----------
040ORI     91/06/20   91/06/21           2            1
505MGM     91/06/21   91/06/22           2            1
710VES     91/06/26   91/06/27           2            1

Nun ist J1 gelöscht. Die Neudefinition von DAYSKEPT wird ebenfalls gelöscht:

JOIN CLEAR J1
? DEFINE
FILE     FIELD NAME                   FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK DAYSKEPT                     I5            4

Die Reportausgabe zeigt, dass die ursprüngliche Definition von DAYSKEPT nun wirksam ist:

MOVIECODE  TRANSDATE  RETURNDATE  DAYSKEPT  ACTUAL_DAYS
---------  ---------  ----------  --------  -----------
001MCA     91/06/27   91/06/29           2            2
692PAR     91/06/27   91/06/29           2            2
259MGM     91/06/19   91/06/21           2            2

Nach oben

x
Virtuelle Felder mit DEFINE FILE SAVE und RETURN beibehalten

Der Befehl DEFINE FILE SAVE bildet einen neuen Kontext für virtuelle Felder, der dann mit DEFINE FILE RETURN entfernt werden kann. Genaueres finden Sie unter Temporärfelder erstellen.



Beispiel: Virtuelle Felder mit DEFINE FILE SAVE und RETURN beibehalten

Mit dem folgenden Befehl können Sie virtuelle Felder innerhalb eines Dateikontexts beibehalten:

SET KEEPDEFINES=ON

Der folgende Befehl definiert das virtuelle Feld A für die Datenquelle VIDEOTRK und platziert es in den aktuellen Kontext:

DEFINE FILE VIDEOTRK
 A/A5='JAWS';
 END

Der folgende Befehl erstellt einen neuen Kontext und speichert das virtuelle Feld B in diesem Kontext:

DEFINE FILE VIDEOTRK SAVE
 B/A5='ROCKY';
 END
? DEFINE

Die Ausgabe der ? DEFINE-Abfrage listet die virtuellen Felder A und B:

FILE     FIELD NAME                FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK A                         A5
VIDEOTRK B                         A5

Der folgende DEFINE-Befehl erstellt das virtuelle Feld C. Alle zuvor definierten virtuellen Felder werden gelöscht, da die Option ADD im DEFINE-Befehl nicht verwendet wurde:

DEFINE FILE VIDEOTRK
 C/A10='AIRPLANE';
 END
? DEFINE

Die Ausgabe der ? DEFINE-Abfrage zeigt, dass C das einzige definierte virtuelle Feld ist:

FILE     FIELD NAME                FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK C                         A10

Der folgende JOIN-Befehl erstellt einen neuen Kontext. Da KEEPDEFINES auf ON gestellt ist, wird das virtuelle Feld C vom JOIN-Befehl nicht gelöscht:

JOIN MOVIECODE IN VIDEOTRK TAG V1 TO MOVIECODE IN MOVIES TAG M1 AS J1
? DEFINE

Die Ausgabe der ? DEFINE-Abfrage zeigt, dass das Feld C noch immer definiert ist:

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK C                          A10

Der nächste DEFINE-Befehl erstellt das virtuelle Feld D im neuen Kontext, der vom JOIN-Befehl erstellt wurde:

DEFINE FILE VIDEOTRK SAVE
 D/A10='TOY STORY';
 END
? DEFINE

Die Ausgabe der ? ? DEFINE-Abfrage zeigt, dass die virtuellen Felder C und D definiert sind:

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK C                          A10
VIDEOTRK D                          A10

Der Befehl DEFINE FILE RETURN löscht das virtuelle Feld D, das im aktuellen Kontext erstellt wurde (nach dem JOIN):

DEFINE FILE VIDEOTRK RETURN
END
? DEFINE

Die Ausgabe der ? ? DEFINE-Abfrage zeigt, dass das virtuelle Feld D gelöscht wurde, C aber noch immer definiert ist:

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE 
VIDEOTRK C                          A10

Der folgende DEFINE FILE RETURN-Befehl löscht das virtuelle Feld C nicht, da das Feld C nicht mit einem DEFINE FILE SAVE-Befehl erstellt wurde:

DEFINE FILE VIDEOTRK RETURN
END
? DEFINE

Die Ausgabe der ? DEFINE-Abfrage zeigt, dass das Feld C noch immer definiert ist:

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE 
VIDEOTRK C                          A10

Hinweis: DEFINE FILE RETURN wird nur aktiviert, falls DEFINE FILE SAVE wirksam ist.


Nach oben

x
Segmente mit bedingten JOIN-Formeln prüfen

Der bedingte JOIN-Befehl kann auf alle Felder im verbundenen Segment und alle Felder im übergeordneten Segment sowie auf höhere Segmente auf dessen Pfad verweisen.

Diese Join-Formeln prüfen das Segment, auf dem sie sich befinden (untergeordnetes oder verbundenes Segment), wenn sie aktiv sind. Dies bedeutet, dass, falls kein untergeordnetes Segment die Bedingungen der Formel erfüllt, der Join die Regeln von SET ALL=OFF befolgt. Wenn kein untergeordnetes Segment vorhanden ist, befolgt der Join die Regeln von SET ALL=ON. Anders als bei WHERE-Phrasen in TABLE-Befehlen filtert JOIN_WHERE nicht automatisch das übergeordnete Segment, wenn SET ALL=ON gegeben ist.


Nach oben

x
WHERE-Kriterien in einem Join parsen

WHERE-Kriterien werden in einem Join nur wirksam, wenn eine TABLE-Anfrage auf ein Querverweissegment oder dessen untergeordnete Segmente verweist. Falls ein solcher Verweis nicht vorliegt, ist WHERE nicht wirksam.

Das Attribut AT wird verwendet, um das richtige übergeordnete Segment oder den Host mit dem richtigen untergeordneten Querverweissegment zu verbinden. Die Feldwerte, die als AT-Parameter eingesetzt werden, sind nicht für die Erstellung des Links verantwortlich. Sie dienen lediglich als Segmentverweise.

Hinweis: Sie erhalten ein kartesisches Produkt, wenn keine WHERE-Kriterien wirksam sind.


WebFOCUS