Académique Documents
Professionnel Documents
Culture Documents
1 Introduction
CODASYL ("Conference on Data Systems and Languages") est le sigle d'une conférence qui a
donné naissance à des travaux pour définir un nouveau type de SGBD, le "SGBD Codasyl", né en
1971. En 1978 apparaissent les premières réalisations: IDS2 (Bull), TOTAL (Cincom), IDMS
(Culliname), ADABAS (Software AG), …
2 Modèle réseau
Rappel: un modèle est un ensemble des concepts qui permettent de décrire la structure conceptuelle
d'une base de données.
Le modèle de données de Codasyl est de type "réseau". Il comprend trois concepts proches de ceux
du modèle entité association:
- le type d'article, qui est semblable au type d'entité (ou au "record" COBOL),
- le type de set, qui est l'équivalent d'un type d'association binaire, non cyclique, sans attribut et de
cardinalités 0:n - 0:1 ou 0:n - 1:1,
- les attributs qui, comme en entité association, peuvent être complexes et/ou multivalués (comme
en COBOL).
1 1
U se W ord 6.0 c o r l a ter t o
vi e w Ma ci n t
o sh pi ctu re.
Possède est un type de set, qui est représenté par une flèche ayant pour cible le type d'article de
cardinalité maximum 1 dans l'association.
Le type d'article origine du set est appelé le "propriétaire" du set. Le type d'article cible du set est
appelé le type "membre" du set.
Au niveau des occurrences on représente souvent le set par une liste fermée. Par exemple, pour le
diagramme réseau ci-dessus:
U se W ord 6 .0c or l ater to
Jean est le propriétaire d'un set Possède dont AX et 405 sont les membres.
Cette liste symbolise le fait que les articles membres d'un set (plus précisément d'une occurrence de
set) sont ordonnés. AX est le premier membre du set Possède de Jean, 405 en est le second et
dernier membre.
vi ew Macintosh pi cture.
La plupart des exemples de ce chapitre se réfèrent à cette base dont le schéma Codasyl est donné en
annexe.
La requête:
"Quel docteur le malade numéro 130 a-t-il consulté en janvier 1990 ?"
s'écrirait en une seule instruction dans un langage relationnel. Dans un langage navigationnel,
l'utilisateur doit écrire un programme comportant des instructions d'un langage de programmation
et des requêtes au SGBD, et qui décrit chacune des étapes élémentaires pour accéder à l'information
voulue, ainsi que leur enchaînement.
3 3
4 Langage de définition des données: LDD de CODASYL
La déclaration d'un type d'article se fait par la phrase "RECORD ....", qui définit le nom du type
d'article, son implantation (dans quel fichier et sous quelle organisation), et ses attributs.
La liste des attributs (simples ou complexes, monovalués ou multivalués, a priori facultatifs) est
décrite comme en Cobol à l'aide de numéros qui indiquent le niveau de l'attribut. La clause
"OCCURS ..." signale un attribut multivalué et le nombre maximum de valeurs. Par exemple, un
type d'article Personne avec un nom, des prénoms et une date de naissance serait décrit en Codasyl
de la façon suivante:
RECORD NAME IS Personne
........définition du fichier et du mode de placement (voir ci-dessous).....
02 nom TYPE CHARACTER 25
02 prénoms TYPE CHARACTER 25 OCCURS 3 TIMES
02 date
03 jour TYPE INTEGER
03 mois TYPE INTEGER
03 année TYPE INTEGER
Tous les articles d'un même type sont stockés dans le même fichier, mais un fichier peut contenir
un ou plusieurs types d'articles. Stocker dans un même fichier plusieurs types d'articles est efficace
dans le cas où l'application utilise très fréquemment en même temps des articles de ces différents
types.
Il existe deux façons différentes de placer les articles d'un type donné dans un fichier: le placement
aléatoire qui favorise les accès sélectifs selon la clé de l'article, et le placement groupé qui favorise
les accès à l'ensemble des membres de chaque occurrence d'un type de set. Dans un même fichier
peuvent cohabiter plusieurs types d'articles placés selon des modes différents.
Exemple: soit un fichier du personnel organisé en CALC et dont la clé des articles est le nom de la
personne.
Insérer < Dupont, Jean, 38 ans, 10.000 F,…>
Supposons que la fonction de calcul appliquée à "Dupont" donne en résultat 3, et que le fichier soit
dans l'état suivant (un carré grisé représente un article):
4 4
U se Word 6. 0c or later t o
L'insertion de Dupont coûte 2 accès disques (lecture de la page n° 3 et sa réécriture), car il y a assez
de place pour mettre l'article Dupont dans la page n°3.
Par contre, l'insertion d'un article <Valois,…> dont la fonction de calcul donne 4 en résultat (la
page n° 4 est pleine), coûte plus cher en accès disques :
- lecture de la page n° 4 pour s'apercevoir qu'elle est pleine,
- alors diverses techniques peuvent être utilisées, telles que :
- associer à la page 4, par chaînage (ce qui implique au moins une écriture), une
page de débordement où sera mis l'article <Valois…>
- avoir une zone de débordement globale dans laquelle sont mis tous les articles qui
ne tiennent pas dans "leur" page. Dans ce cas, il faut associer à chaque page une liste
des articles qui sont en débordement.
Les fichiers aléatoires nécessitent d'être périodiquement réorganisés quand le pourcentage de
débordement devient trop important et que les performances baissent.
Déclaration de l'organisation "CALC" en Codasyl:
RECORD NAME IS nom-type-article
LOCATION MODE IS CALC USING nom-attribut-clé
[DUPLICATES NOT] WITHIN nom-fichier.
La clause facultative "DUPLICATES NOT" interdit l'existence dans le type d'article de deux
articles de même clé (la clé est un identifiant). Si la clause est absente, l'interdiction est levée (la clé
n'est pas un identifiant).
Si le type d'article M est organisé en VIA le set S dans le même fichier que P, on aura
l'organisation suivante dans les pages du fichier:
U se Wo rd 6 .0 c or l a te r to
Si le type d'article M est organisé en VIA le set S dans un autre fichier que P, on aura l'organisation
suivante dans les pages des deux fichiers (en supposant taille_fichier_M = 2*taille_fichier_P) :
fichier de P :
U se Wo rd 6.0c o r l a te r to
vi e w Ma ci nto sh p ic t
u r e.
fichier de M :
U se W o rd 6 .0c o r l a ter to
Une occurrence de set est une liste ordonnée des articles membres correspondant à un propriétaire.
La plupart du temps, les SGBDs Codasyl implémentent cette liste par des pointeurs: du propriétaire
vers le premier membre, de chaque membre vers le membre suivant, et du dernier membre vers le
6 6
propriétaire. Le chainage peut être simple ou double (dans les deux sens). Pour optimiser le passage
d'un membre vers son propriétaire, le SGBD peut aussi rajouter à chaque membre un pointeur vers
le propriétaire.
Une autre façon d'implanter les occurrences de set consiste à ce que le SGBD associe à chaque
article propriétaire une table de pointeurs vers ses membres, et à chaque article membre un pointeur
vers son propriétaire.
Attention: cette implémentation des occurrences de set est indépendante de l'organisation des types
d'articles. Par exemple, un type d'article peut être placé en CALC, tout en étant membre d'un set et
donc lié par le chainage du set aux autres articles membres de la même occurrence du set.
Structure:
SET nom-type-set
OWNER nom-type-article-propriétaire
MEMBER nom-type-article-membre.
Contraintes d'intégrité:
- INSERTION AUTOMATIC : lors de l'instruction "insérer un membre", le SGBD crée le
membre et le rattache automatiquement au set (en insérant le membre dans la liste des
membres de ce propriétaire). C'est l'équivalent d'une contrainte d'intégrité référentielle.
- INSERTION MANUAL : lors de l'instruction "insérer un membre", le SGBD crée le membre
mais ne le rattache pas au set.
- RETENTION MANDATORY : le membre ne peut être détaché du set (l'instruction
DISCONNECT est interdite).
- RETENTION OPTIONAL : cas contraire.
- [DUPLICATES NOT nom-attribut] : c'est une déclaration facultative qui signifie qu'il ne peut
pas exister deux membres pour un même propriétaire avec la même valeur pour cet attribut.
Chemin d'accès :
Il existe deux types d'information qui permettent de définir comment accéder aux articles d'un set:
le choix de l'occurrence du set et le choix de l'ordre des membres dans chaque occurrence du set.
7 7
Exemple: SET passe
SET SELECTION IS THRU passe OWNER IDENTIFIED BY CLAC KEY
Exemple: SET donne
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY
THEN THRU emploie WHERE OWNER IDENTIFIED BY nom-service
THEN THRU donne WHERE OWNER IDENTIFIED BY nom-docteur.
5 Sous-schéma CODASYL
Un sous-schéma est une partie du schéma qui intéresse un groupe d'utilisateurs. Un sous-schéma
Codasyl contient certains types d'articles, éventuellement renommés avec certains attributs
éventuellement renommés, et certains types de sets éventuellement renommés.
Ces sous-schémas assurent une certaine confidentialité des données et simplifient la vue qu'ont les
utilisateurs de la base de données (en ne leur montrant qu'une partie des types d'articles et de sets).
8 8
Use Word 6.0c or later to
La définition d'un sous-schéma Codasyl se fait à l'aide d'instructions du langage de définition des
données que nous ne détaillerons pas.
9 9
6 Langage de manipulation des données (LMD) CODASYL
6.1 Principes
- Zone de communication = zone formatée au format des types article du sous-schéma (ou schéma)
ouvert par le programme + variable SGBD-STATUS
- Programme utilisateur en LMD Codasyl + langage de programmation (par exemple Cobol).
Le programme utilise pour les lectures / écritures via le SGBD la zone de communication.
- Pointeurs courants pour ce programme, gérés par le SGBD.
Le LMD Codasyl permet d'accéder aux articles grâce aux instructions FIND dont il existe plusieurs
variantes. Le résultat de toute instruction FIND est que certains pointeurs sont positionnés sur
l'article accédé, mais l'article n'est pas transféré en mémoire centrale. Pour le lire l'utilisateur doit
employer une seconde instruction, l'instruction GET.
Tout type d'article organisé en CALC selon un attribut-clé peut être accédé sélectivement selon cet
attribut-clé par l'instruction "FIND ANY nom-type-article". La valeur de l'attribut-clé doit
auparavant avoir été chargée dans la zone de communication.
Codasyl permet de travailler sur tout type d'article comme sur un fichier séquentiel, à l'aide des
instructions "FIND FIRST nom-type-article" et "FIND NEXT nom-type-article".
Codasyl permet de balayer séquentiellement tous les articles membres d'une occurrence de set
(l'occurrence courante) à l'aide des instructions "FIND FIRST nom-type-article WITHIN nom-set"
et "FIND NEXT nom-type-article WITHIN nom-set".
Codasyl permet de passer d'un membre quelconque d'un set à son propriétaire à l'aide de
l'instruction "FIND OWNER WITHIN nom-set". Cette instruction agit dans l'occurrence courante
du type de set.
Exemple: Quels sont les médecins qui ont ordonné du xxx au malade 130; on veut les noms du
médecin et de l'hôpital.
Malade . numéro-malade := 130
FIND ANY Malade
FIND FIRST Consultation WITHIN passe
Tant que SGBD-STATUS = "ok" faire
si Consultation. prescription = xxx alors
début
FIND OWNER WITHIN donne /* positionne sur le docteur */
GET docteur /* transfert le docteur en mémoire
centrale*/
afficher le docteur
FIND OWNER WITHIN emploie /* positionne sur le service*/
FIND OWNER WITHIN constitué /* positionne sur l'hôpital */
GET HOPITAL /* transfert l'hôpital en mémoire centrale*/
afficher l'hopital
finsi
FIND NEXT Consultation WITHIN passe
Fin tant que
Les instructions de lecture et de mise à jour (autres que celle d'insertion d'un nouvel article)
travaillent toutes sur l'article référencé par le pointeur programme. Il arrive que certains
programmes nécessitent de traiter (lire, mettre à jour, ...) un article qui ne soit pas le dernier
accédé; ils doivent donc accéder un article qui n'est plus l'article courant du programme. Pour
pouvoir repositionner les pointeurs sur cet article, Codasyl offre deux solutions :
- l'instruction "FIND CURRENT nom-type-article" qui accède à l'article référencé par le
pointeur du type d'article et qui repositionne donc sur cet article le pointeur programme et les
pointeurs des sets qui passent par cet article;
- la mémorisation et la mise à jour directement par le programme utilisateur des pointeurs grâce
aux instructions suivantes :
nom-variable := CURRENT OF nom-type-article
qui met dans la variable (ni affichable ni modifiable par le programme utilisateur) la valeur
du pointeur du type d'article;
FIND nom-type-article BY DATABASEKEY nom-variable
qui accède à l'article référencé par la valeur contenue dans la variable, et qui met donc à jour
les pointeurs programme, type d'article et ceux des types de set qui passent par cet article.
6.2.6 Recherche d'un membre d'un propriétaire, sur valeur d'un attribut.
Cette fonction est non élémentaire en ce sens qu'elle peut être obtenue par un programme utilisateur
employant d'autres instructions FIND plus simples (celles des § 6.2.1 et 6.2.3). Elle permet de:
13 13
- choisir une occurrence particulière d'un type de set,
- rechercher dans cette occurrence de set les articles qui satisfont une condition du type "attribut =
valeur".
L'utilisateur appelle cette fonction grace aux deux instructions:
"FIND nom-type-article WITHIN [CURRENT OF] nom-set USING nom-attribut"
"FIND DUPLICATE WITHIN [CURRENT OF] nom-set USING nom-attribut".
Si la clause CURRENT OF est présente, alors le SGBD effectue sa recherche dans l'occurrence
courante du set, sinon il choisit l'occurrence du set d'après la clause SET SELECTION du set.
Exemple: Liste des consultations où l'on a prescrit le médicament xxx au malade numéro 130.
Malade . numéro-malade := 130
Consultation. prescription := xxx
FIND Consultation WITHIN passe USING prescription.
/* La clause SET SELECTION de passe a permis au SGBD de choisir l'occurrence du
set passe du malade 130 */
Tant que SGBD-STATUS = "ok" faire:
GET Consultation
traitement de la consultation
FIND DUPLICATE WITHIN passe USING prescription
Fin tant que
L'instruction "FIND Consultation WITHIN passe USING prescription" lance, dans le SGBD, la
recherche du bon propriétaire du set passe (le malade 130), puis parmi les membres de ce
propriétaire la recherche de la première consultation telle que prescription = xxx.
L'instruction "FIND DUPLICATE WITHIN passe USING prescription" recherche dans la même
occurrence du set passe la consultation suivante répondant à la même condition.
L'instruction FIND positionne les pointeurs, mais ne lit pas. Les lectures se font par l'instruction
"GET nom-type-article" qui lit l'article courant du programme.
Lors d'une instruction "STORE nom-type-article" le SGBD effectue les actions suivantes :
1) Le SGBD cherche dans le schéma dans quel fichier et avec quelle organisation est ce type
d'article, il calcule l'adresse de la page où écrire l'article (si CALC par formule de calcul; si VIA
par recherche du propriétaire).
2) Le SGBD cherche dans le schéma les types de sets dont l'article est propriétaire. S'il en trouve,
il initialise ces sets à vide (en général par un pointeur pointant l'article lui-même).
3) Le SGBD cherche dans le schéma les types de set dont l'article est membre avec insertion
automatique. S'il en trouve, il cherche l'occurrence définie par la SET SELECTION et y insère
l'article selon l'ordre du set (clause ORDER ...): mise à jour des chaînages de ces sets pour y
insérer le nouveau membre en bonne place.
L'instruction STORE a donc pour paramètres (qui sont mis par l'utilisateur dans la zone de
communication SGBD-utilisateur) les valeurs des attributs de l'article à écrire, et de tous les
attributs qui servent aux SET SELECTION ..... des sets dont l'article est déclaré membre à
INSERTION AUTOMATIQUE, et à leurs clauses ORDER ... .
STORE, en résultat, positionne les pointeurs programme, type d'article, et des types de set passant
effectivement par cet article sur l'article inséré. Pour les sets dont le type d'article est déclaré
membre avec la clause INSERTION MANUAL, le pointeur set est mis à nul.
Exemple: Changer un docteur de service : Dupont du service chirurgie de La Pitié passe au service
des urgences.
Hôpital. nom-hopital := "La Pitié"
Service. nom-service := "Chirurgie"
Docteur. nom-docteur := "Dupont"
FIND Docteur WITHIN CURRENT OF Emploie USING nom-docteur
/* le docteur voulu est pointé par le pointeur courant programme */
DISCONNECT Docteur FROM emploie /* détache l'article courant du set emploie de
l'article "chirurgie" */
Service. nom-service := "urgences"
CONNECT Docteur TO emploie /* rattache le docteur au set emploie des urgences* /
Solution 1:
Selon la clause RETENTION :
- Si le set a pour clause "RETENTION OPTIONAL" les membres sont détachés,
- Si le set a pour clause "RETENTION MANDATORY" l'instruction ERASE est refusée.
Le positionnement des pointeurs après une instruction ERASE se fait de la façon suivante:
- les pointeurs programme, type d'article et des types de sets passant par ce type d'article sont mis à
nul (Ø),
- afin de permettre au programme utilisateur de continuer son exécution en balayant le type d'article
ou le set, le SGBD conserve, pour le type d'article et pour les sets dont l'article était
effectivement membre, deux valeurs : la référence des articles précédant et suivant l'article
supprimé. Les instructions FIND NEXT/PRIOR ... peuvent donc être utilisées après un ERASE.
L'instruction "INVOKE nom_schéma (ou nom sous-schéma)" ouvre la base de données ou un sous-
schéma de la base de données et initialise la zone de communication utilisateur-SGBD.
16 16
7 Optimisation d'un schéma Codasyl
Définir un schéma Codasyl comporte deux étapes principales: définir la structure réseau
conceptuelle, puis choisir une structure optimale éventuellement redondante (avec des types
d'articles ou de set ou des attributs supplémentaires qui accélereront les accès) et son implantation
(choix des fichiers et des modes de placement). La méthode pour concevoir un schéma Codasyl
peut se résumer en:
1 Faire le diagramme entité association.
2 Traduire le diagramme entité-association en diagramme réseau (non optimisé).
3 Répertorier les requêtes de l'application, avec leur fréquence.
4 Définir les chemins d'accès fréquents sur le diagramme réseau.
5. En déduire:
- le diagramme réseau optimisé (ajout de types d'article, types de set, attributs)
- le schéma complet en LDD Codasyl.
Les points 4 et 5 sont précisés dans les paragraphes suivants.
Il s'agit de définir, pour chaque type d'article et type de set, les accès les plus fréquents. Les types
d'accès à répertorier sont les suivants:
- types d'accès pour un type d'article:
- accès sélectif sur valeur d'un attribut
- balayage séquentiel du type article [selon tel ordre]
- types d'accès pour un type de set:
- passer au membre suivant [selon tel ordre]
- chercher un membre selon la valeur d'un attribut
- remonter au propriétaire.
Exemple: étudions uniquement les trois types d'articles Hôpital, Service et Docteur de la base de
données Gest-Consult ainsi que les sets qui les relient. On suppose que les requêtes les plus
fréquentes sont les suivantes :
- Service xx de l'hôpital Z (fréquence 100/jour)
- Hôpitaux de telle ville (fréquence 10/jour)
- Le docteur de nom Y, dans quel service et quel hôpital travaille-t-il ? (fréquence 1/jour)
Type d'article
Cas 1 : le type d'article a un seul chemin d'accès fréquent, qui est par valeur d'attribut. la solution
est d'organiser ce type d'article en CALC avec pour clé cet attribut.
Cas 2 : le type d'article a un seul chemin d'accès fréquent qui est par descente de set. La solution est
d'organiser ce type d'article en VIA selon le set.
Cas 3 : le type d'article A a plusieurs chemins d'accès fréquents, soit par valeur d'attribut, soit par
set, soit par les deux. La solution est d'organiser le type d'article selon le chemin de plus forte
fréquence, et d'ajouter pour chaque autre chemin d'accès du type par valeur d'attribut un type
d'article B représentant cet attribut et un type de set B A. B sera organisé en CALC.
Exemple : on accède très fréquemment à l'Hôpital et par son nom et par sa ville. Hôpital sera
CALC sur son nom, et un article Ville est créé, CALC sur nomville; un set "Situation" relie Ville
(propriétaire) à Hôpital (membre) en regroupant tous les hôpitaux d'une même ville.
U se Word 6.0c or late r to
Cas 4 : accès séquentiel ordonné fréquent (seul ou en plus d'autres chemins d'accès)
Exemple : la liste alphabétique des docteurs est une requête fréquente.
Il faut ajouter un set "d'ordre" avec clause "ORDER INSERT BY........". Ce set est "mono
occurrence" (il a une seule occurrence); son propriétaire est un type d'article "bidon", sans attribut,
à une seule occurrence; c'est le "RECORD SYSTEM" prédéclaré par le SGBD.
Type de set
S'il y a accès fréquent depuis un membre du set à son propriétaire pour connaître la valeur d'un
attribut du propriétaire, deux cas se présentent:
- soit l'accès est déjà rapide (parce que le type d'article membre est placé en VIA ce set dans le
même fichier ou parce que le SGBD implante les sets avec dans chaque membre un pointeur vers le
propriétaire), dans ce cas il n'y a rien à faire;
- soit l'accès n'est pas rapide, alors pour l'optimiser une solution est de répéter cet attribut dans tous
les membres; ce qui a l'inconvénient de générer des informations redondantes, et donc des
problèmes de mise à jour pour maintenir leur cohérence.
18 18
ANNEXE 1
LANGAGE DE DEFINITION DES DONNEES CODASYL (simplifié)
WITHIN nom-fichier
INTEGER
{
[ {numéro nom-att2 [TYPE IS REAL }] [OCCURS nb TIMES] }...] .
CHARACTER nb
{
INSERTION IS AUTOMATIC } {
RETENTION IS MANDATORY }
MANUAL OPTIONAL
FIRST
LAST
{
[ORDER IS INSERT NEXT }].
PRIOR
SORTED BY { ASCENDING nom-att3}.... [DUPLICATES NOT]
DESCENDING
END-SCHEMA .
Légende
19 19
[a] : signifie que a est facultatif,
{ a }: signifie que l'une des deux options a ou b (ou exclusif) doit être choisie,
b
[a].... : signifie que la spécification a peut être répétée zéro, une ou plusieurs fois,
{a}.... : signifie que la spécification a doit être répétée une ou plusieurs fois.
Dans les clauses du LDD et du LMD, les mots non soulignés peuvent être omis.
20 20
LANGAGE DE MANIPULATION DES DONNEES CODASYL (simplifié)
INVOKE {nom-schéma }.
nom-sous-schéma WITHIN nom-schéma
READY {nom-area}... .
FINISH {nom-area}.... .
FIRST
FIRST
NEXT
GET nom-article .
STORE nom-article .
MODIFY nom-article .
21 21
SGBD-STATUS est une variable contenant la réponse du SGBD, de valeurs possibles: OK, erreur
d'argument, début/fin de type d'article, pas trouvé, type de set/d'article non initialisé, set vide,
article non rattaché au set, c'est le propriétaire du set, fichier saturé, erreur d'entrée/sortie disques,...
22 22
ANNEXE 2: EXEMPLE DE SCHEMA CODASYL
Gest-Consult
Diagramme réseau:
Use Word 6.0c or later to
SCHEMA gest-consult .
RECORD Hopital
LOCATION MODE IS CALC USING nom-hopital
DUPLICATES ARE NOT ALLOWED WITHIN f-hop
02 nom-hopital TYPE CHARACTER 25
02 adresse-hopital
03 numéro TYPE INTEGER
03 rue TYPE CHARACTER 25
03 code-postal TYPE INTEGER
03 ville TYPE CHARACTER 25
.... .
RECORD Service
LOCATION MODE IS VIA constitué WITHIN f-hop
02 nom-service TYPE CHARACTER 20
02 nombre-lits TYPE INTEGER
02 nom-chef TYPE CHARACTER 20
.... .
RECORD Docteur
LOCATION MODE IS VIA emploie WITHIN f-doc
02 nom-docteur TYPE CHARACTER 20
02 catégorie TYPE CHARACTER 15
02 adresse-docteur
.... .
23 23
RECORD Malade
RECORD Consultation
SET constitué
OWNER IS Hopital
MEMBER IS Service
INSERTION IS AUTOMATIC RETENTION IS MANDATORY
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY .
SET emploie
OWNER IS Service
MEMBER IS Docteur
INSERTION IS AUTOMATIC RETENTION IS OPTIONAL
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY
THEN THRU emploie WHERE OWNER IDENTIFIED BY nom-service
ORDER IS INSERT SORTED BY ASCENDING nom-docteur DUPLICATES NOT .
SET donne
OWNER IS Docteur
MEMBER IS Consultation
INSERTION IS AUTOMATIC RETENTION IS MANDATORY
SET SELECTION IS THRU constitué OWNER IDENTIFIED BY CALC KEY
THEN THRU emploie WHERE OWNER IDENTIFIED BY nom-service
THEN THRU donne WHERE OWNER IDENTIFIED BY nom-docteur
ORDER IS INSERT SORTED BY ASCENDING date .
SET passe
OWNER IS Malade
MEMBER IS Consultation
INSERTION IS AUTOMATIC RETENTION IS MANDATORY
SET SELECTION IS THRU passe OWNER IDENTIFIED BY CALC KEY
ORDER IS INSERT LAST .
24 24
END-SCHEMA .
25 25