Link permet de définir un ensemble de liens entre différentes tables, ainsi qu'une abréviation unique, pour accéder à ces tables en une seule instruction. (exemple : Read).
Link class_p With liste_liens As class_l [ where_cl ] [ order_by_cl ]
Elément | Description | Restrictions |
class_p | classe désignant l'abréviation du fichier principal. | Le fichier doit être ouvert. |
liste_liens | Liste de liens, séparés par le caractère ','. | Nombre de liens<=12 |
lien | Définition d'un lien sous l'une des formes : | Aucune. |
clé | Désignation de la clé d'un fichier lié sous l'une des formes : | Le fichier lié doit être ouvert. |
id_clé | nom_de_variable désignant une clé | Aucune. |
exp_ind | Expression entière du nombre de parties de clés utilisées. Par défaut, toute la clé est utilisée. | 0<= exp_ind <=nombre de composantes de la clé (au plus 16). |
liste_expr_clé | Liste de expr_clé séparés par le caractère ';' et correspondant aux valeurs des sous-clés. | Au plus 16 sous-clés |
expr_clé | Expression quelconque portant sur | Compatible avec le type de la sous-clé suivant opérateur et fonctions. |
opérateurs | comparaison =, <, >, <=, >=, <> | Aucune. |
fonctions | Alphanumériques, numériques, dates | Suivant type. |
Alphanumérique | left$, right$, mid$, seg$, len, num$, ctrans, tolower, toupper, val, ascii, chr$, instr, pat, string$, space$, mid$, virebl. | Aucune. |
Numérique | abs, int, ar2, avg, var, prd. | Aucune |
Date | Aucune fonction n'est admise | |
Multi-type | find, max, min, sigma, uni. | Sauf sur type Date |
class_l | classe désignant une abréviation permettant d'accéder à l'ensemble des fichiers liés. | L'abréviation doit |
where_cl | Voir instruction Where | Aucune. |
order_by_cl | Voir instruction Where | Aucune. |
# Extrait d'un traitement donnant l'historique des produits par client :
# Ouverture des fichiers principal et liés, avec un critère de
# sélection sur le fichier PRODUIT
File HISTORIQUE [HIS], CLIENT [CLI], PRODUIT [PRO]
& Where [PRO]CLE >= [M:E]PRPRO & [PRO]CLE <= [M:E]DRPRO
#
# Définition des liens entre le fichier HISTORIQUE et le fichier
# PRODUIT d'une part, le fichier CLIENT d'autre part. Définition de
# l'abréviation de lien [LIEN] et de la pseudo-clé KEY1
Link [HIS] With [PRO]CODPRO = NUMPRO, [CLI]NUMCLI = NUMCLI
& As [LIEN]
& Order By Key KEY1 = [PRO]CLE;[CLI]CLE
#
# Utilisation immédiate
For [LIEN]KEY1
PRIHT += [HIS]PRIHT*(([HIS]TYPCOM = 1)-([HIS]TYPCOM = 2))
Next
# Déclaration de fichiers et définition d'un lien avec tri des
# factures par département des clients.
File FACTURE [FAK], CLIENT [CLI]
Link [FAK] With [CLI]NUMCOD = NUMCOD As [DEP]
& Order By Key DEPT = [F:FAK]ADFAC(2)
# Déclaration de fichiers et définition d'un lien avec tri des
# factures par département des clients.
File ATABLE [ATB], ATABIND [ATI]
Link [ATB] With [ATI]CODIND = CODFIC As [LNK]
& Where CODFIC = "AOBJET"
For [LNK]
Infbox [ATB]INTIT
Infbox [ATI]DESCRIPT
# Infbox [LNK]INTIT ok car champ de la table principale
# Infbox [LNK]DESCRIP planterait en variable inexistante car appartient à la table secondaire
Next
# Liens avec une constante
File ATABZON [ATZ], ATEXTE [ATX]
Link [ATZ] With [ATX]NUMERO=GLANGUE;[F:ATZ]NOLONG
& As [LNK]
& Where [F:ATZ]CODFIC = [M]ATB
# Liens avec utilisation de la fonction num$
Link [TRO] With
& [AXX]AXX0="TABROUALT";"TRODESAXX";GLANGUE;num$([F:TRO]ROUALT);""
Link permet de définir un ensemble de liens entre une table principale et des tables annexes ( jusqu'à 12 ).
Table principale et tables liées doivent avoir été ouvertes au préalable par un ordre File ou Local File.
Il est possible d'y préciser des critères de sélection et de tri, et de définir une abréviation (que nous appellerons abréviation de lien) pour accéder à l'ensemble de ces tables par une seule instruction Read ou For.
A chaque lecture sur l'abréviation de lien, la classe [F] de chaque table est chargée, la classe lien n'est chargée qu'avec les champs de la table principale. ( les champs des tables secondaires ne sont d'ailleurs pas connus dans cette abréviation). On utilisera donc la classe lien pour faire les lectures par Read ou For, les classes [F] pour lire ou alimenter les champs, l'abréviation des tables, pour faire les opérations d'écriture, de suppression par Write, Rewrite, Update, Delete.
Attention ! Ne pas pas utiliser l'abréviation de lien avec les instructions suivantes : Write, Rewrite, Update, Delete.
- Une jointure est de type extérieure gauche si l'on précise le caractère '=' : on lit l'enregistrement de la table principale qui n'a pas d'enregistrement lié dans la table secondaire.
Une jointure est de type stricte si l'on précise le caractère '~=' : on ne lit pas l'enregistrement de la table principale qui n'a pas d'enregistrement lié dans la table secondaire.
- La clause With de Link permet de définir le lien entre 2 tables. On utilise généralement un lien entre la table principale et la table secondaire.
- La clause Order By de Link permet de définir (ou de redéfinir) l'index de parcours du fichier principal lorsqu'on utilise l'abréviation de lien. Lors d'un Read (sur le fichier principal) avec cette abréviation, Adonix essaie de lire l'enregistrement correspondant du fichier principal, puis un enregistrement dans chaque fichier annexe en fonction de ce qui a été donné dans liste_liens. Si cette clause existe, seuls l'index y figurant est utilisable lors d'une opération sur le fichier. Se reporter à la documentation spécifique à cette clause pour plus de détails.
- Les clés utilisables avec l'abréviation de lien sont :
- Les clés utilisables avec l'abréviation de la table principale :
cette abréviation permet d'accéder à cette table principale (en lecture ou en écriture) en utilisant les clés définies en paramétrage, à moins qu'une clause Order by n'ait redéfini une clé sur cette table.
La clause Where permet de restreindre l'accès aux enregistrements des fichiers pour lesquels l'expression donnée est vérifiée. Elle ajoute une restriction supplémentaire aux éventuelles clauses Where définies sur les fichiers à lier (le cas échéant). Précisons que cette expression (sauf dans le cas où c'est le champ d'un fichier) est évaluée à l'ouverture de la table (contrairement aux versions précédentes). La liste des opérateurs et fonctions utilisables est limitée. Se reporter à la documentation spécifique à cette clause pour plus de détails.
- Il n'y a pas de classe [G] associées à l'abréviation de lien.
- L'abréviation de lien doit être unique. Si un fichier est déjà ouvert avec cette abréviation, il n'est pas refermé par Adonix mais un message d'erreur est généré. Le comportement de Link est alors équivalent à celui d'un Local File.
- On ne peut définir de lien que sur des tables situés sur le même serveur.
- On peut définir un filtre (par Filter) sur un fichier de lien.
- On peut définir un lien avec des niveaux hiérarchiques.
Sous SQL Server, il est impératif de déclarer les tables dans leur ordre de définition des clés de jointure.
Link [HIS] With ---> définition de l'abréviation [HIS]
& [CLI]CLE = [HIS]NUMCLI, ---> définition de l'abréviation [CLI]. utilisation possible de [HIS]
& [ADD]CLE = [CLI]CLIENT ---> définition de l'abréviation [ADD].utilisation possible de [HIS] [CLI]
- On peut définir un lien avec des constantes ( 32 maximum ).
File ATABZON [ATZ], ATEXTE [ATX]
Link [ATZ] With [ATX]NUMERO=GLANGUE;[F:ATZ]NOLONG ---> Utilisation de la variable globale GLANGUE comme constante
& As [LNK]
& Where [F:ATZ]CODFIC = [M]ATB
- On peut définir un Link d'une table sur elle-même, et ainsi associé 2 enregistrements d'une même table.
- lorsqu'on est sur une jointure est de type extérieure gauche, pour récupérer la classe [F] de la table principale qui n'a pas d'enregistrement lié dans la table secondaire, il ne faut pas avoir de critère dans la clause where sur un champ de la table secondaire. Dans ce cas, le système ne récupèrerait que les jointures strictes pour lesquelles la clause where est vérifiée.
- Le close de l'abréviation du link supprime le link. Le close de la table principale du link ferme cette table et la classe du link n'est plus disponible.
Soient la table AAA de champs A1, A2, A3 et la table BBB de champs B1, B2, B3 et de clef BBB0. Il y a deux manières d'écrire un Link entre ces deux tables sachant que la clause Where est A1=[L]C1 and A2=[L]C2. Dans tous les cas, la seconde solution est à privilégier devant la première.
1. Link [AAA] with[BBB]BBB0=A1;A2;A3 As [LNK]
For [LNK] Where A1=[L]C1 and A2=[L]C2
#
Next
2. Link [AAA] with [BBB]BBB0=[L]C1;[L]C2;A3 As [LNK]
For [LNK] Where A1=[L]C1 and A2=[L]C2
#
Next
Dans la première syntaxe, Oracle prend tous les enregistrements de BBB et n'élimine ceux en trop que quand il fait la jointure, alors que dans la seconde syntaxe, Oracle ne sélectionne tout de suite que les enregistrements de BBB souhaités.
A partir de la version 6, le Link supporte la fonction num$. (voir dans les exemples). Par contre, cela ne supporte pas la conversion date.
Une jointure est de type stricte si l'on précise le caractère '~='; dans ce cas, on ne récupère pas la classe [F] de la table principale qui n'a pas d'enregistrement lié dans la table secondaire .
On peut maintenant définir plusieurs liens sur une même table ( jusqu'à 8 ). Ceci implique que la définition d'un deuxième lien sur un fichier donné ne refermera plus le premier.
# les 2 classes [XXX] et [YYY] sont conservées.
Link [ABC] With ... As [XXX]
Link [ABC] With ... As [YYY]