|
HOWTO Accueil
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>
|
Top
© 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.
|