HOWTO développement Sashipa

 

 ListForm avancé : Deux clefs étrangères référençant la même table.

Vous avez une table contenant deux clefs étrangères qui référencent toute deux la même table. Dans un listForm, vous souhaitez afficher les informations référencées par ces deux clefs étrangères, à la fois.

 

Voyons un exemple concret : nous avons des Personnes, chaque personne est originaire d'un Pays et habite dans un Pays (le même ou non). Voici le script SQL des tables (ici avec la syntaxe pour HSQL) :

  CREATE TABLE Pays (
    Id_Pays integer not null primary key,
    Nom_Pays varchar(100) not null
  );
  CREATE TABLE Personne (
    Id_Personne integer not null primary key,
    Nom_Personne varchar(100) not null,
    Prenom_Personne varchar(100),
    Ref_Pays_Origine integer,
    Ref_Pays_Habitant integer,
    FOREIGN KEY (Ref_Pays_Origine) REFERENCES Pays (Id_Pays),
    FOREIGN KEY (Ref_Pays_Habitant) REFERENCES Pays (Id_Pays)
  );

La table Personne a ici deux clefs étrangères référençant la table Pays.

 

Dans la liste (le formulaire listForm) des personnes, nous voulons afficher le pays d'origine et le pays d'habitation. Voici un exemple :

  <listForm db='dbBaseGroupes' doubleClicScreen='SCtblPersonne' delete='yes'>
    <title>Liste des Personnes</title>
    <bounds x='10' y='10' w='700' h='500' />

    <selectQueryBuilder type='list'>
      <fromStatementBuilder>
        <mainInstanceTable schemaTable='tblPersonne' />
        <fkJoin join='left'>
          <instanceFk schemaFk='fk_tblPersonne_tblPays_RefPaysOrigine' />
          <referencedInstanceTable schemaTable='tblPays' nickName='paysOrig' />
        </fkJoin>
        <fkJoin join='left'>
          <instanceFk schemaFk='fk_tblPersonne_tblPays_RefPaysHabitant' />
          <referencedInstanceTable schemaTable='tblPays' nickName='paysHabit' />
        </fkJoin>
      </fromStatementBuilder>
    </selectQueryBuilder>
    
    <instanceColumnList>
      <instanceColumn schemaColumn='tblPersonne_NomPersonne' />
      <instanceColumn schemaColumn='tblPersonne_PrenomPersonne' />
      <!-- Colonnes pays d'origine -->
      <instanceColumn schemaColumn='tblPays_Nom'>
        <title>Pays d'origine</title>
        <instanceTable schemaTable='tblPays' nickName='paysOrig' />
      </instanceColumn>
      <!-- Colonnes pays d'habitation -->
      <instanceColumn schemaColumn='tblPays_Nom'>
        <title>Pays d'habitation</title>
        <instanceTable schemaTable='tblPays' nickName='paysHabit' />
      </instanceColumn>
    </instanceColumnList>
    <insertScreen screen='SCtblPersonne' />
  </listForm>

Remarques :

  • On définit les deux jointures dans la requête selectQueryBuilder. Deux instances de la table référencée sont nécessaires, on leur donne donc deux surnoms différents (nickName.

  • Lors de la déclaration de la colonne, on spécifie un titre explicite. Autrement on verrait apparaître deux fois le titre de la schemaColumn, ce qui porterait à confusion.

  • On spécifie à quelle instance de table appartient la colonne. La première colonne tblPays_Nom fait partie de l'instance de table paysOrig et la deuxième fait partie de l'instance de table paysHabit.

© Copyright 2003 Sashipa-Melba Team. Ce document de la technologie Sashipa-Melba est sous licence GNU FDL Vous pouvez le copier et modifier librement les copies tant que cette mention apparaît clairement.