BeeBase

Programmable relational database
with graphical user interface Support This Project
This page is also available in Deutsch English

Documentation

La documentation ci-dessous fait partie de la distribution de BeeBase. Elle est également disponible sous forme de PDF.


[ << ] [ >> ]           [Sommaire] [Table des matières] [Index] [ ? ]

4. Tutoriel

Création d'une base généalogique.

Ce chapitre contient une brève formation décrivant l'utilisation basique de BeeBase. Au fil de ces travaux dirigés un petit projet permettant la gestion de son arbre généalogique est développé. Après avoir appliqué toutes les étapes de ce cours, vous pourrez trouver le projet qui en résulte `FamilyTree.bbs' dans le répertoire `Demos' de votre installation de BeeBase.


4.1 Comment fonctionne BeeBase

On peut dire que BeeBase fonctionne dans deux modes différents : l'édition d'enregistrements et l'édition de structure.

Le mode d'édition d'enregistrements vous permet d'ajouter, de changer ou de supprimer des enregistrements.

Le mode d'édition de structure vous permet de modifier la mise en page de votre base de données ainsi que les tables et champs qu'elle contient.

En outre, il y a l'éditeur de programme où vous saisissez les fonctions du programme qui seront exécutées automatiquement lors de l'entrée des données ou explicitement lors d'un clic sur un bouton du programme.


4.2 Pour commencer un Projet : l'éditeur de structure

Pour créer une base de données, vous devez d'abord définir son contenu. Pour cela, il faut ouvrir l'éditeur de structure en choisissant `Éditeur de structure' dans le menu `Projet'. Voici les trois différentes sections que vous y trouverez :

`Tables'
Ajouter, changer ou supprimer les tables de votre projet.

`Champs'
Ajouter, changer ou supprimer les champs de la table sélectionnée.

`Affichage'
Indiquer la disposition graphique de votre base de données, c.-à-d. la façon dont elle devra être affichée à l'utilisateur.


4.3 Ajouter une table

Tout d'abord nous avons besoin d'une table, appuyez sur le bouton `Nouveau' situé sous la liste de la section `Table'. Vous verrez alors une fenêtre s'ouvrir pour vous demander de saisir quelques données :

`Nom'
Le nom de la table. Le nom doit commencer par une lettre majuscule et peut se composer d'un maximum de 20 caractères. Le nom peut être changé plus tard. Dans ce cours nous définissons le nom `Personne' puisqu'il va contenir les noms de toutes les personnes dans cette base de données.

`Nombre d'enregistrements'
Une table peut soit contenir un seul enregistrement, soit un nombre illimité. Dans notre cas il faut le positionner « illimité » puisque nous allons ajouter plus d'une personne.

`Déclencheurs'
L'ajout et la suppression des enregistrements peuvent être contrôlés par des fonctions utilisateur. C'est ici que vous pouvez indiquer la fonction à exécuter. Puisque nous n'avons encore écrit aucune fonction utilisateur, nous laissons les champs vides.

Quand c'est fait, cliquez juste sur le bouton `OK' et vous aurez votre première table, `Personne'.


4.4 Ajouter un champ

Maintenant nous avons besoin d'un champ de type chaîne pour cette table, appuyez sur le bouton `Nouveau' dans la section Champs. Les champs ont également besoin de quelques réglages :

`Nom'
Comme pour une table : la première lettre doit être en majuscule et peut se composer au maximum de 20 caractères. Nous définissons le nom de ce champ à `Nom' car il contiendra les noms des personnes que nous sommes sur le point d'ajouter.

`Type'
Ici nous choisissons le type de champ désiré. Il en existe un certain nombre, mais pour ce champ nous choisirons d'utiliser le type Texte.

`Longueur maximum'
Vous pouvez définir le nombre maximum de caractères qu'un utilisateur pourra écrire dans la chaîne. Choisissons 30.

`Valeur initiale'
Il est possible qu'un champ utilise une valeur initiale à chaque nouvel enregistrement que vous ajoutez, entrez ici cette valeur. Laissez cette ligne vide pour notre exemple.

`Déclencheur'
Un champ peut également déclencher l'exécution d'une fonction utilisateur. Par exemple, lorsque vous entrez un nom, vous pouvez avoir une fonction utilisateur qui vérifie si ce nom existe déjà. Nous laissons ce champ vide.


4.5 Afficher le projet

Après avoir cliqué sur le bouton `OK' vous pourrez noter quelques changements dans la section d'affichage. Choisissez `Fenêtre Principale' dans la liste déroulante en haut de la section d'affichage. Vous verrez ce que la fenêtre principale propose : actuellement seulement la table `Personne'. Si vous revenez de nouveau sur `Fiche de table', vous pourrez voir comment la table `Personne' se présente. Actuellement elle affiche un onglet avec un champ.

Double-cliquez maintenant sur l'`Personne' en haut de la liste, dans la section d'affichage ; une fenêtre doit s'ouvrir vous permettant de définir la façon dont cet onglet doit être affiché :

`Titre'
Le titre d'une table peut être différent de son nom. Notre table s'appelle `Personne' mais ici nous pourrions aussi bien mettre `C'EST LA TABLE PERSONNE !' si nous préférions.

`Arrière-plan'
L'arrière-plan peut être modifié selon votre goût.

`Gadgets'
Ici, nous pouvons définir les gadgets que nous désirons voir sur l'onglet.

Appuyez sur le bouton `OK' et double-cliquez sur `Nom' dans la liste de la section d'affichage. La fenêtre `affichage du champ' apparaît, elle contient les réglages sur la façon dont le champ `Nom' va être affiché.

`Titre'
Les mêmes que pour l'onglet. La chaîne que vous entrez ici est ce que vous voyez réellement lorsqu'on est en mode édition d'enregistrements.

`Raccourci clavier'
Permet de placer une lettre qui peut être utilisée pour sauter vers ce champ, lorsqu'on est en mode édition d'enregistrements. Pour sauter vers un champ vous devez maintenir la touche Alt (Windows, Mac OS et Linux) ou la touche Amiga et appuyer sur la lettre.

`Début'
Cochez la case début pour sauter vers ce champ toutes les fois qu'un nouvel enregistrement est ajouté. Dans notre cas nous voulons toujours, ou la majeure partie du temps, présenter d'abord le premier nom dans un nouvel enregistrement. Donc, cochez la case début.

`Lecture seule'
À cocher si le champ est en lecture seule. Laissez tel quel.

`Poids'
Décide dans quelle proportion de l'espace disponible ce champ devra être visible (en concurrence avec d'autres champs). Par exemple, si trois chaînes de 50 caractères se trouvent dans une fenêtre n'offrant qu'une place limitée de 100 caractères, ce nombre décidera combien d'espaces la chaîne obtiendra par rapport aux autres. Le laisser à 100.

`Arrière-plan'
Les mêmes que pour l'onglet.

`Info bulle'
Ici vous pouvez écrire n'importe quel texte qui vous paraît utile pour un utilisateur. Une infobulle apparaît lorsque la souris est maintenue quelques secondes au-dessus d'un champ. Saisissez ceci `Si vous avez besoin d'aide, appelez l'auteur au 112'.

Quittez l'éditeur de structure (choisissez `Quitter l'éditeur de structure' dans le menu `Projet') et vous serez de nouveau en mode édition d'enregistrements où vous verrez à quoi ressemble vraiment la base de données. Vous verrez le titre qui correspond à la chaîne que vous avez choisie dans la section d'affichage de l'onglet. Le compteur d'enregistrement devrait indiquer `#0/0' puisque nous n'avons pas encore ajouté d'enregistrement. À la suite, se trouve un bouton filtre et deux boutons flèches. Au-dessous, vous devriez avoir le champ `Nom' avec le texte que vous avez pu écrire dans la section d'affichage de ce champ. Si dans la section d'affichage, vous n'avez changé aucun texte, alors l'onglet devrait s'appeler `Personne', et le champ de type chaîne `Nom'. Déplacez la souris au-dessus de la chaîne champ `Nom' et laissez-la pendant quelques secondes. Si vous avez écrit quelque chose dans la bulle d'aide, ce texte devrait paraître dans une fenêtre flottante.


4.6 Ajouter deux champs de type référence

Maintenant nous ajouterons deux champs référence. Les champs référence sont un peu différents des autres champs. Car leur nom pourrait impliquer qu'ils se réfèrent à des enregistrements. Ce sera plus compréhensible, lorsque dans un moment vous l'essayerez par vous-même.

Entrez dans l'éditeur de structure et ajoutez deux autres champs à la table `Personne'. Cliquez sur le bouton `Nouveau' dans la section champ, la fenêtre nouveau champ s'ouvre, nommez le `Pere', et changez le type en `Référence'. Un champ Référence ne dispose que d'un réglage :

`Faire référence à'
Indique à quelle table le champ se rapporte. Il devrait déjà pointer vers `Personne'. Laissez-le comme ça et appuyez sur le bouton `Ok'.

Ajoutez un autre champ en cliquant sur le bouton `Nouveau' dans la section Champs, la fenêtre `Nouveau champ' s'ouvre. Nous nommons ce champ `Mere'. Positionnons son type de champ à une référence vers la table `Personne'.

Comme vous avez pu le noter, il y a maintenant trois champs dans la section Affichage. Cliquez sur `Pere' puis sur les boutons haut et bas placés juste à gauche. Ce qui aura pour effet de changer l'affichage et le positionnement de `Pere' dans le mode édition d'enregistrements. Mettez `Pere' en haut, `Nom' au milieu, et `Mere' en bas.

Après, nous indiquerons quel contenu les champs référence `Pere' et `Mere' devraient afficher dans les enregistrements référencés. Double-cliquez sur `Pere' dans la section d'affichage puis cliquez sur `Extras'. Ici nous choisissons d'afficher le champ `Nom', appuyez sur le bouton `Ok' et répétons le procédé pour le champ `Mere'.


4.7 Ajouter des enregistrements

Maintenant nous devons ajouter quelques enregistrements. Quittez l'éditeur de structure et entrez dans le mode édition d'enregistrements. Pour ajouter un nouvel enregistrement, choisissez `Nouvel enregistrement' dans le menu `Table' (sur Linux et Windows vous trouverez ce menu en maintenant pressé le bouton droit de la souris à l'intérieur de la fiche de table). Le curseur devrait maintenant sauter automatiquement au champ que nous avons placé un peu plus tôt comme étant au `Début' dans la section d'affichage de l'éditeur de structure. Ajoutez deux enregistrements, un avec le nom de votre père dans `Nom' et un autre avec le nom de votre mère dans `Nom'. Ensuite, vous ajoutez un autre enregistrement avec votre propre nom dans `Nom'.

Maintenant il est temps de comprendre les champs Référence. Cliquez sur le bouton de sélection dans `Pere' et vous obtiendrez la liste de tous les enregistrements auquel ce champ Référence pourrait se rapporter. Choisissez le nom de votre père puis, suivre le même cheminement pour le bouton de sélection dans mère.

Maintenant, vous devriez avoir trois enregistrements, vous, votre père et votre mère. Dans votre enregistrement, le nom de votre père devrait être évidemment visible en haut dans `Pere' et le nom de votre mère devrait être en bas dans `Mere'. Vous pouvez passer en revue les enregistrements en appuyant sur Alt ainsi que sur les touches Haut et Bas.

Vous vous dîtes : « Mais hé, mes parents aussi ont/avaient des parents ! » Aussi, ajoutons encore quatre enregistrements, la troisième génération. Ajoutez juste les enregistrements un par un en écrivant leurs noms dans `Nom'. Si vous ne vous rappelez pas leurs noms écrivez juste `le père de mon père', `le père de ma mère' ou toute autre formule équivalente du même style. Vous pourrez alors naviguer dans tous les enregistrements et placer dans `Pere' et `Mere' les valeurs adéquates. Une fois cela fait, vous devriez avoir au moins sept enregistrements, votre enregistrement, l'enregistrement de vos parents et l'enregistrement de vos grands-parents.


4.8 Filtrer des enregistrements

Puisque nous avons maintenant quelques enregistrements avec lesquels nous pouvons travailler, nous pourrions essayer la fonction de filtrage. Le filtre peut trier les enregistrements que vous ne voulez pas montrer, ils resteront dans la base de données mais ils ne seront simplement pas affichés.

Pour éditer le filtre choisissez `Changer le filtre' dans le menu `Table'. Une fenêtre comportant des opérateurs apparaîtra, vous permettant de définir les conditions qu'un enregistrement doit remplir pour être affiché.

Dans ce petit exemple, nous utiliserons la commande LIKE, qui vous laisse comparer un champ avec un motif. Appuyez une fois sur le bouton LIKE vers la droite et double-cliquez sur `Nom' dans la liste à gauche et le (LIKE Nom ) devrait apparaître dans la chaîne juste au-dessus des boutons `Ok' et `Annuler'. Ensuite vous écrivez "*a*" de manière à ce que le texte entier devienne (LIKE Nom "*a*"). Ceci signifie que BeeBase devrait afficher tous les enregistrements qui contiennent la lettre `a' n'importe où dans le `Nom'.

Appuyez sur le bouton `Ok' et vous pourrez noter que les enregistrements ne contenant pas de `a' dans leur `Nom', ne seront plus visibles. Puisque la lettre `a' est très courante dans la plupart des langues et noms, tous les enregistrements pourraient encore être affichés, mais vous pouvez essayer d'autres lettres pour faire fonctionner le filtre de façon plus visible.

Comme expliqué précédemment, le bouton `F' sur l'onglet indique si le filtre est actif ou pas. Enfin, lorsque vous aurez fini vos essais, quittez le filtre de sorte que tous les enregistrements soient visibles.


4.9 Interroger des enregistrements

Maintenant que nous avons un peu joué avec la fonction de filtrage, nous nous tournons vers le dispositif de requête de BeeBase. Des requêtes peuvent être utilisées pour afficher les données d'une base selon certains critères.

Choisissez `Requêtes' dans le menu `Programme' ; l'éditeur de requête s'ouvre. Maintenant une fenêtre avec quelques boutons en haut et deux plus grandes zones au-dessous apparaissent. La chaîne en haut à gauche permet d'écrire le nom de la requête que vous voulez créer.

`Exécuter'
Compile et lance la requête.

`Imprimer'
Imprime le résultat de la requête dans un fichier ou sur votre imprimante.

`Charger et Enregistrer'
Vous permet de charger et enregistrer chacune des requêtes.

La première grande zone permet d'écrire la requête. La deuxième grande zone permet d'afficher le résultat.

Maintenant produisons une liste de toutes les personnes que nous avons filtrées précédemment. Écrire : `Personnes avec un A dans leur nom' dans la chaîne en haut à gauche. C'est le titre pour cette requête. Dans la grande zone supérieure, taper :

 
SELECT Nom FROM Personne WHERE (LIKE Nom "*a*")

Maintenant si vous lancez cette requête en appuyant sur le bouton `Exécuter' il produira une liste de toutes les personnes avec la lettre `A' dans leur nom. Essayez de changer la lettre pour voir différents résultats.

Il est temps de présenter la commande AND. Appuyez sur le bouton de sélection juste à gauche du bouton `Exécuter' dans l'éditeur de requêtes. Choisissez alors `Nouveau' et nommez-la `Personnes dont le nom contient les lettres A et S'. Écrivez alors

 
SELECT Nom FROM Personne WHERE
(AND (LIKE Nom "*a*") (LIKE Nom "*s*"))

Notez que nous employons toujours la commande LIKE pour le choix des enregistrements contenants les lettres `A' ou `S' dans leurs noms, mais la commande AND exige que LES DEUX critères LIKE soient vérifiés. Par conséquent, seuls les enregistrements comportant les DEUX lettres `A' et `S' dans leur nom sont affichés lorsque la requête est exécutée.


4.10 Ajouter une table avec un mémo et un champ de type bouton

Il y a deux manières de choisir et de montrer la base de données. Une autre manière d'afficher les données consiste à écrire un programme. Pour afficher les données, nous pouvons utiliser un type de champ appelé Mémo.

Entrez dans l'éditeur de structure et appuyez sur le bouton `Nouveau' dans la section table. Nommez la nouvelle table `Controle' et placez son nombre d'enregistrements à `Exactement un'. Pressez et maintenez le bouton de la souris sur la nouvelle table, puis déplacez le curseur juste un peu au-dessus du milieu de la table `Personne' et enfin relâchez le bouton de la souris. Dans la section table, `Controle' devrait maintenant être en haut, suivi de `Personne'.

Assurez-vous que la table `Controle' est sélectionnée, et appuyez sur le bouton `Nouveau' dans la section Champs. Placez le type du nouveau champ sur `Mémo' et donnez-lui le nom `Resultat'. Cliquez sur le bouton `Ok' puis ajoutez un autre champ à la table `Controle' en appuyant de nouveau sur le bouton `Nouveau' dans la section Champs. Cette fois, choisissez le type `Bouton' et appelez le `Ascendance'.

Pour améliorer l'aspect de la base de données, dans la section d'affichage, cliquez une fois sur `Ascendance' ainsi que sur le bouton `haut'.


4.11 Programmation d'une ascendance avec BeeBase

Maintenant nous avons un bouton qui peut exécuter un programme et un mémo pour y afficher des données. Il est donc temps d'entrer dans l'éditeur de programme. Pour cela, il faut choisir `Editer' à partir du menu `Programme'. L'éditeur de programme à trois boutons :

`Compiler & Fermer'
Il fait juste cela. Il compile le programme et sort de l'éditeur de programme.

`Compiler'
Compile les programmes mais reste dans l'éditeur de programme.

`Rétablir'
Rétablit tous les changements pour revenir à l'état initial lors de votre entrée dans l'éditeur de programme.

Toutes les fonctions de programme que vous écrirez résideront dans cette fenêtre, nous devrons les distinguer. Dans BeeBase c'est la commande DEFUN qui le fait. Tout ce qui est entre les deux parenthèses fera partie, dans cet exemple, de la fonction ascendance :

 
(DEFUN ascendance ()

; C'est la parenthèse de la fin de DEFUN
)

À cet effet nous écrivons maintenant la première fonction qui produira, dans la base de données, un arbre généalogique de la personne courante et plaçons le résultat dans le champ `Resultat'. Cette fonction ascendance comporte en fait trois fonctions :

 
; Le programme ascendance

(DEFUN ascendance ()
    (SETQ Controle.Resultat (ascendance2memo (getascendance Personne NIL) 0 3))
)


; Le programme getascendance

(DEFUN getascendance (personne:Personne niveau:INT)
    (IF (AND personne (OR (NULL niveau) (> niveau 0)))
        (LIST personne.Nom
            (getascendance personne.Pere (1- niveau))
            (getascendance personne.Mere (1- niveau))
        )
    )
)


; Le programme ascendance2memo

(DEFUN ascendance2memo (ascendance:LIST indent:INT niveau:INT)
    (IF (> niveau 0)
        (+
            (ascendance2memo (NTH 1 ascendance) (+ indent 8) (1- niveau))
            (IF pedigree (SPRINTF "%*s%s\n" indent "" (FIRST ascendance)) "\n")
            (ascendance2memo (NTH 2 ascendance) (+ indent 8) (1- niveau))
        )
        ""
    )
)

En écrivant ce programme, assurez-vous que toutes les parenthèses se trouvent où elles devraient être. Un nombre de paranthèses inexact est l'erreur la plus commune lorsque BeeBase compile votre programme. Le message d'erreur de BeeBase serait alors probablement `Erreur syntaxique' . Cliquez sur le bouton `Compiler & fermer' et la fenêtre se ferme, ce qui signifie qu'il n'y a eu aucune erreur lors de la compilation.

Ne vous inquiétez pas trop si au début, vous ne comprenez pas toutes les fonctions. Il y a un chapitre complet (voir Programmation de BeeBase) contenant la liste de toutes les fonctions avec leur description détaillée.

Maintenant nous avons un programme à exécuter, mais d'abord nous devons assigner la fonction programmée au bouton `Ascendance'. Pour cela, il faut entrer dans l'éditeur de structure, choisir `Controle' dans la section Table et double-cliquer sur le champ `Ascendance' dans la section Champs. Cliquez alors le bouton de sélection `Déclencheur'. Dans cette liste, toutes les fonctions de votre programme seront énumérées, à ce moment, il devrait y avoir trois fonctions : ascendance, getascendance et ascendance2memo. Double-cliquez sur ascendance pour que le bouton `Ascendance' déclenche cette fonction, puis appuyez sur le bouton `Ok' et quittez l'éditeur de structure.

Maintenant si tout est fait correctement, un clic sur le bouton `Ascendance' affichera l'ascendance de la personne sélectionnée. Essayez de changer la personne pour voir différentes ascendances.


4.12 Programmation de la liste des enfants d'une personne avec BeeBase

Le prochain ajout sur cette base de données exige encore plus d'enregistrements, vous devriez ajouter vos frères et soeurs. Si vous n'en avez pas, écrivez `Ma soeur fictive 1', `Mon frère fictif 1' qui naturellement devront être placés de façon à avoir les mêmes parents que vous.

Après cela, allez dans l'éditeur de programme et écrivez le nouveau programme :

 
; Le programme enfants compte le nombre d'enfants d'une personne.
; D'abord nous définissons les variables, p. ex. « noms » pour les noms des enfants.

(DEFUN enfants ()
    (LET ( (noms "") (count 0) (parent Personne) )

    ; Pour tous les enregistrements de la table Personne, faire :
    ; Si la variable parent apparaît comme père ou mère 
    ; dans un ou plusieurs enregistrements alors :
    ;   ajoutez le nom à la variable noms
    ;   incrémentez le compte de 1.

    (FOR ALL Personne DO
        (IF (OR (= parent Pere) (= parent Mere))
            (
                (SETQ noms (+ noms Nom "\n"))
                (SETQ nombre (1+ nombre))
            )
        )
    )

    ; Ensuite nous écrivons le résultat dans Controle.Resultat.
    ; Si la personne sélectionnée n'a aucun enfant, écrire une chaîne.
    ; Si elle a des enfants alors écrire une autre chaîne.

    (SETQ Controle.Resultat 
        (+ Personne.Nom (IF (> nombre 0)
            (+ " est fier d'être le parent de " (STR nombre) " enfant(s).")
            " n'a aucun enfant (pour le moment :-)."
        ))
    )


    ; Si les parents ont des enfants alors ajouter leurs noms.

    (IF (<> nombre 0)
        (SETQ Controle.Resultat 
            (+ Controle.Resultat "\n\n"
                (IF (= nombre 1)
                    "Le nom de l'enfant est :"
                    "Les noms des enfants sont :" 
                )
        "\n\n"
                noms
            )
        )
    )

    ; Parenthèse de fin de la commande LET.
    )

; Parenthèse de fin de DEFUN enfants 
)

Pour créer des variables, nous utilisons la commande LET. Les variables créées avec la commande LET sont locales et seulement visibles entre les parenthèses ouvrante et fermante de cette commande `LET'. Ainsi, toutes les commandes voulant accéder à ces variables doivent être placées à l'intérieur des parenthèses.

Tout ce dont nous avons besoin pour exécuter notre programme est un nouveau bouton programme. Par conséquent, entrez dans l'éditeur de structure et ajoutez un champ de type bouton dans la table `Controle'. Appelez-le `Enfants' et choisissez enfants comme fonction à déclencher.

Pour apporter un certain ordre dans la fiche de la table `Controle' il est maintenant temps de présenter les groupes. Tous les objets peuvent être ordonnés dans des groupes alignés verticalement ou horizontalement.

Dans la section d'affichage, cliquez sur `Ascendant' et Maj-cliquez sur `Enfants'. Ensuite cliquez sur le bouton `Groupe' sur la gauche. Maintenant les deux boutons de programme seront rassemblés et alignés verticalement dans un groupe. Cependant, comme nous voulons qu'ils soient alignés horizontalement, double-cliquez sur `VGroup' qui est apparu dans la section d'affichage. Une fenêtre s'ouvrira qui vous permettra modifier les réglages de ce groupe. Saisissez `Programmes' comme titre et cochez le bouton `Horizontal'.

À ce moment nous pouvons cacher le nom du champ `Resultat' dans la table `Controle'. Double-cliquez sur `Resultat' dans la section d'affichage et videz le champ titre. Ceci affichera le champ `Resultat' sans aucun titre.

Pour rendre les choses plus faciles, si nous ajoutons plus de programmes ou de champs dans la table `Controle', nous devrions placer `Resultat' et le groupe `Programmes' dans un groupe vertical. Soyez certain que vous avez seulement sélectionné `Programmes' et `Resultat' avec de cliquer sur `Groupe'. Cela place `Programmes' et `Resultat' dans un groupe vertical.

Quittez l'éditeur de structure et jetez un coup d'oeil au résultat. Appuyez sur le bouton `Enfants' pour voir le nombre et le nom des enfants de la personne courante.

Cet exemple peut très bien être étendu dans un programme généalogique complet. Les seules vraies limites sont votre imagination et la taille de votre disque dur.


[ << ] [ >> ]           [Sommaire] [Table des matières] [Index] [ ? ]

Ce document a été généré le 30 Septembre 2024 par texi2html