Maintien de champs virtuels lors de l'analyse de jointures

Dans cette section :

Il y a deux façons de maintenir les champs virtuels lors de l'analyse de jointures. Une façon consiste à utiliser KEEPDEFINES, et la deuxième façon consiste à utiliser DEFINE FILE SAVE et DEFINE FILE RETURN.


Haut de page

x
Maintien de champs virtuels avec KEEPDEFINES

Comment :

Référence :

Le paramètre KEEPDEFINES détermine si un champ virtuel créé par la commande DEFINE pour un hôte ou une structure jointe est retenu ou supprimé après l'exécution de la commande JOIN. Il s'applique lorsque la commande DEFINE précède la commande JOIN.

Les champs virtuels précédents composent ce qu'on appelle un contexte. Tous les nouveaux contextes créent une nouvelle couche ou un nouvel environnement de commande. En entrant dans le nouvel environnement pour la première fois, tous les champs virtuels définis dans la couche précédente sont disponibles dans la nouvelle couche. Le remplacement ou l'effacement d'une définition de champ virtuel n'ont une incidence que sur la couche actuelle. En revenant à la couche précédente, ces définitions de champ virtuel sont toujours intactes.

Des nouveaux champs DEFINE lancés après la commande JOIN composent un autre contexte, et génère par conséquent une pile de contextes. Dans chaque contexte, tous les champs virtuels des contextes précédents sont accessibles.

Une commande JOIN CLEAR as_name supprime tous les contextes qui ont été créés après le lancement de la commande JOIN as_name.

En ce qui concerne les jointures conditionnelles basées sur DEFINE, la définition KEEPDEFINES doit être mise à ON. Vous devez par la suite créer tous les champs virtuels avant de lancer la commande JOIN conditionnelle basée sur DEFINE. Cela diffère des jointures basées sur DEFINE traditionnels où le champ virtuel est créé après la commande JOIN. En plus, un champ virtuel peut faire partie des syntaxes JOIN et WHERE.

Les commandes DEFINE lancées après la commande JOIN ni remplacent, ni effacent les champs virtuels créés avant la jointure, puisqu'un nouveau contexte de fichier est créé.



x
Syntaxe : Utiliser KEEPDEFINES
SET KEEPDEFINES = {ON|OFF}

où :

ON
Retient le champ virtuel après l'exécution d'une commande JOIN.
OFF
Efface le champ virtuel après l'exécution d'une commande JOIN. Il s'agit de la valeur par défaut.


x
Référence : Notes d'utilisation pour KEEPDEFINES

Les champs virtuels définis avant d'activer KEEPDEFINES (ON) ne sont pas préservés après une commande JOIN.



Exemple : Maintien de champs virtuels lors de l'analyse de jointures avec KEEPDEFINES

Le premier champ virtuel, DAYSKEPT, est défini avant le lancement de jointures, mais après avoir mis KEEPDEFINES à ON. DAYSKEPT représente le nombre de jours entre la date de retour et la date de location d'une bande vidéo :

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

Le ? ? DEFINE montre que le seul champ virtuel défini jusqu'ici est DAYSKEPT :

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

La requête suivante imprime toutes les transactions dans lesquelles le nombre de jours de location est deux :

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

Les premières lignes de sortie montrent que chaque date de retour est deux jours après la date de transaction.

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

La source de données VIDEOTRK est maintenant jointe à la source de données MOVIES. Le ? ? DEFINE montre que la jointure n'a pas effacé le champ virtuel DAYSKEPT :

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

Ensuite, un nouveau champ virtuel, YEARS, est défini pour la jointure de VIDEOTRK et MOVIES :

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

Le ? ? DEFINE montre que le champ virtuel créé avant la jointure n'a pas été effacé par ce nouveau champ virtuel parce que celui-là est dans un autre contexte :

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

Ensuite, le champ DAYSKEPT est redéfini afin qu'il soit le nombre de jours réels plus un.

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

Le ? DEFINE montre qu'il y a deux versions du champ virtuel DAYSKEPT. Cependant, YEARS a été effacé parce qu'il était dans le même contexte (après la jointure) que la nouvelle version de DAYSKEPT, et la commande DEFINE n'a pas spécifié l'option ADD :

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

La même requête utilise maintenant la nouvelle définition pour DAYSKEPT. Notez que le nombre de jours entre la date de retour et la date de transaction est en effet un jour et non pas deux, à cause du changement dans la définition de DAYSKEPT :

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

J1 est effacé. La redéfinition de DAYSKEPT est aussi effacée :

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

La sortie de rapport montre que la définition originale de DAYSKEPT est maintenant activée.

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

Haut de page

x
Maintien de champs virtuels avec DEFINE FILE SAVE et RETURN

La commande DEFINE FILE SAVE forme un nouveau contexte pour les champs virtuels, qui peut être supprimé par la suite avec DEFINE FILE RETURN. Pour plus de détails, reportez-vous à Création de champs temporaires.



Exemple : Maintien de champs virtuels avec DEFINE FILE SAVE et RETURN

La commande suivante vous permet de maintenir des champs virtuels dans le contexte d'un fichier :

SET KEEPDEFINES=ON

La commande suivant définit le champ virtuel A pour la source de données VIDEOTRK et le met dans le contexte actuel :

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

La commande suivante crée un nouveau contexte et sauvegarde le champ virtuel B dans ce contexte :

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

La sortie de la commande DEFINE liste les champs virtuels A et B :

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

La commande DEFINE suivante crée le champ virtuel C. Tous les champs virtuels déjà définis sont effacés car l'option ADD n'a pas été utilisée dans la commande DEFINE :

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

La sortie de la commande ? DEFINE montre que C est le seul champ virtuel défini :

FILE     FIELD NAME                FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK C                         A10

La commande JOIN suivante crée un nouveau contexte. Comme KEEPDEFINES est mis à ON, le champ virtuel C n'est pas effacé par la commande JOIN :

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

La sortie de la commande ? DEFINE montre que le champ C est toujours défini :

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE
VIDEOTRK C                          A10

La prochaine commande DEFINE crée le champ virtuel D dans le nouveau contexte créé par la commande JOIN :

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

La sortie de la commande DEFINE montre que les champs virtuels C et D sont définis :

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

La commande DEFINE FILE RETURN efface le champ virtuel D créé dans le contexte actuel (après la commande JOIN) :

DEFINE FILE VIDEOTRK RETURN
END
? DEFINE

La sortie de la commande ? DEFINE montre que le champ virtuel D a été effacé, mais C est toujours défini :

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE 
VIDEOTRK C                          A10

La commande DEFINE FILE RETURN suivante n'efface pas le champ virtuel C car le champ C n'a pas été créé en utilisant la commande DEFINE FILE SAVE :

DEFINE FILE VIDEOTRK RETURN
END
? DEFINE

La sortie de la commande ? DEFINE montre que le champ virtuel C est toujours défini :

FILE     FIELD NAME                 FORMAT  SEGMENT   VIEW         TYPE 
VIDEOTRK C                          A10

Remarque : DEFINE FILE RETURN n'est activée que lorsque DEFINE FILE SAVE est activée.


Haut de page

x
Présélection de segments avec les expressions JOIN conditionnelles

La commande conditionnelle JOIN peut faire référence à tous les champs dans un segment joint et à tous les champs dans un segment parent, ou qui se trouvent à un niveau supérieur du chemin du parent.

Lorsqu'elles sont activées, ces expressions jointes présélectionnent le segment sur lequel elles hébèrgent (le segment enfant ou joint). C'est-à-dire, si aucun segment enfant réussit le test défini par l'expression, la jointure suit les règles de SET ALL=OFF, ou SET ALL=ON quand aucun segment enfant existe. Contrairement aux phrases WHERE dans les commandes TABLE, la présélection de JOIN_WHERE n'effectue pas automatiquement la présélection du segment parent lorsque SET ALL=ON.


Haut de page

x
Analyse de critères WHERE dans une jointure

Les critères WHERE ne prennent effet dans une jointure que lorsqu'une référence de la requête TABLE est faite vers un segment avec référence croisée ou vers ses enfants. Si aucune référence est faite, le critère WHERE n'a pas d'effet.

L'attribut AT est utilisé pour lier le segment parent ou l'hôte corrects au segment enfant ou avec référence croisée corrects. Les valeurs de champ utilisées comme paramètre AT ne sont pas utilisées pour créer le lien. Elles sont utilisées simplement en tant que références de segment.

Remarque : si aucun critère WHERE n'est activé, vous recevez un produit cartésien.


WebFOCUS