HOWTO développement Sashipa

 

 Filtrer la liste d'un fkField.

Vous avez deux tables qui se référencent mutuellement et vous souhaitez que le fkField de l'une propose uniquement les lignes de l'autre table qui sont concernées.

 

Voyons un exemple concret : nous avons des Groupes de Personnes, et pour chaque groupe une personne responsable. Voici le script SQL des tables (ici avec la syntaxe pour HSQL) :

  CREATE TABLE Groupe (
    Id_Groupe integer not null primary key,
    Nom_Groupe varchar(100) not null,
    Ref_Personne_Responsable integer
  );
  CREATE TABLE Personne (
    Id_Personne integer not null primary key,
    Ref_Groupe integer not null,
    Nom_Personne varchar(100) not null,
    Prenom_Personne varchar(100),
    FOREIGN KEY (Ref_Groupe) REFERENCES Groupe (Id_Groupe)
  );
  ALTER TABLE Groupe ADD CONSTRAINT fkgrp_pers 
    FOREIGN KEY (Ref_Personne_Responsable) REFERENCES Personne (Id_Personne);

Les clefs étrangères sont donc croisées : une personne référence un groupe et un groupe référence une (ou zéro) personne.

Dans la fiche du Groupe on aimerait choisir la personne responsable parmis les personnes référençant le groupe seulement.

En fait sans rien faire c'est le comportement par défaut puisque un fkField tente toujours d'utiliser le filtre courant. En revanche, il faut bloquer le choix de la personne responsable lors de l'ajout; autrement le fkField contiendrait la totalité des personnes. Voici un exemple :

  <screen name='SCtblGroupe'>
    <title>Fiche Groupe</title>
    <formSet>
      <cardForm db='dbBase'>
        <title>Fiche Groupe</title>
        <location x='10' y='10' />
        <cardSchemaTableRef schemaTable='tblGroupe' updateAfterInsert='yes' 
                            multipleInsert='no' queries='sudi' />
        <fieldContainer>
          <textField>
            <schemaColumnRef schemaColumn='tblGroupe_Nom_Groupe' />
          </textField>
          <comboBoxFkField>
            <schemaFkRef schemaFk='fk_tblGroupe_Personne' />
            <go screen='SCtblPersonne' />
            <choose screen='SCtblPersonne' schemaFk='fk_tblPersonne_tblGroupe' />
            <selectQueryBuilder>
              <castFilterSet stuckWhenNoFilter='yes' />
            </selectQueryBuilder>
          </comboBoxFkField>
        </fieldContainer>
      </cardForm>
      
      <listForm db='dbBase' doubleClicScreen='SCtblPersonne' delete='yes'>
        <!-- ... -->
      </listForm>
    </formSet>
  </screen>

Remarques :

  • On peut utiliser un comboBoxFkField (et non un readOnlyTextFkField) puisque un groupe contient un nombre raisonnable de personnes.

  • L'attribut stuckWhenNoFilter='yes' signale que le champ est bloqué quand la fiche n'est pas filtrée. Donc en pratique en mode ajout.

  • Le contenu de la listForm et les choix du fkField seront toujours similaires.

  • L'attribut schemaFk='fk_tblPersonne_tblGroupe' affectera une valeur par défaut au champ travaillant sur la clef étrangère 'fk_tblPersonne_tblGroupe' dans la fiche de la personne.

 

Dans la fiche de la Personne, il faut spécifier que le fkField de la clef étrangère qui référence le groupe, est insensible aux filtres. Autrement le fkField ne proposera que les groupes référençant la personne, ce qui revient à empècher toute modification !

  <screen name='SCtblPersonne'>
    <title>Fiche Personne</title>
    <formSet>
      <cardForm db='dbBase'>
        <title>Fiche Personne</title>
        <location x='10' y='10' />
        <cardSchemaTableRef schemaTable='tblPersonne' updateAfterInsert='yes' 
                            multipleInsert='no' queries='sudi' />
        <fieldContainer>
          <readOnlyTextFkField filterSensitive='no'>
            <schemaFkRef schemaFk='fk_tblPersonne_tblGroupe' />
            <go screen='SCtblGroupe' />
            <choose screen='SItblGroupe_For_tblPersonne' />
          </readOnlyTextFkField>
          <textField>
            <schemaColumnRef schemaColumn='tblPersonne_Prenom_Personne' />
          </textField>
          <textField>
            <schemaColumnRef schemaColumn='tblPersonne_Prenom_Personne' />
          </textField>
        </fieldContainer>
      </cardForm>
    </formSet>
  </screen>

© 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.