|
HOWTO Accueil
HOWTO développement Sashipa
Afficher une liste agrégée.
Dans une table, vous préférez dupliquer une information. Mais vous souhaitez
néanmoins afficher une liste agrégée de cette information dupliquée.
Préliminaire
Il n'y a pas de problème majeur à afficher une liste agrégée du moment que
chaque ligne est identifiée par une clef primaire. Il suffit alors de se
dépatouiller avec les selectQueryBuilder.
On peut ainsi afficher le nombre de pays à côté du libellé de chaque continent,
chaque ligne étant identifiée par la clef primaire du continent.
Le problème que nous traitons ici est celui des listes dont les données ne
correspondent pas à une clef primaire réelle.
Pour notre exemple, nous travaillerons sur une table de Boissons avec une
colonne de type texte Producteur. Donc potentiellement, si deux boissons ont
le même producteur, cette information sera dupliquée.
CREATE TABLE Boisson (
Id_Boisson integer not null primary key,
Nom_Boisson varchar(100) not null,
Producteur varchar(100)
);
|
Nous souhaitons maintenant offrir à notre utilisateur une liste de tous les
producteurs, puis une fiche d'un producteur avec la liste des boissons liées.
Déclarer une computedTable
Tout d'abord, nous déclarons une table calculée qui comportera une clef
primaire calculée, ce qui nous permettra d'utiliser la valeur agrégée
comme un filtre. Une computedTable est basée sur une requête, à
l'instar d'une vue SQL.
Dans l'élément environment, on rajoute nos tables calculées de cette
manière-ci :
...
</dbmsSet>
<computedTableSet>
<computedTable name='tblAgregatProducteur'>
<selectQuery db='dbDemo' distinctRequired='yes'>
<fromStatement>
<mainInstanceTable schemaTable='tblBoisson' />
</fromStatement>
</selectQuery>
<computedColumnList>
<computedColumn name='tblAgregatProducteur_Producteur' pk='yes'>
<instanceColumn schemaColumn='tblBoisson_Producteur' />
</computedColumn>
</computedColumnList>
</computedTable>
</computedTableSet>
</environment>
|
Une computedTable est constituée d'une selectQuery sans la clause Select,
ainsi que d'une liste des computedColumns qui sont disponibles depuis la table
calculée. Ces computedColumns sont nommées, et l'on indique laquelle
(ou lesquelles) font partie(s) de la clef primaire calculée. La clef primaire
calculée pourra être utilisée comme un filtre.
Créer une listForm basée sur une computedTable
Voici le code pour créer une listForm qui affiche l'ensemble des producteurs,
avec le nombre de boissons associées.
<listForm db='dbDemo' doubleClicScreen='SCtblAgregatProducteur' delete='no'>
<bounds x='10' y='10' w='500' h='300' />
<computedTableRef computedTable='tblAgregatProducteur' />
<instanceColumnList>
<instanceColumn schemaColumn='tblBoisson_Producteur' letterCount='38' />
<agregatInstanceColumn type='countStar' letterCount='6' sort='desc'>
<title>Nb Boissons</title>
</agregatInstanceColumn>
</instanceColumnList>
</listForm>
|
Remarques :
L'ajout et la suppression sont naturellement interdits, puisqu'un
producteur ne correspond pas à un enregistrement réel.
On référence la table calculée précédemment définie.
On crée les instances de colonnes que l'on souhaite, dans la mesure où
elles sont accessibles depuis les tables de la requête de la table
calculée. Notez qu'il est impossible de créer ici une requête propre à
la liste basée sur notre table calculée.
Le nombre de boissons est un agrégat de type 'count(*)' : c'est le type
'countStar'.
Créer un cardForm avec les champs d'une computedTable
Passons maintenant à l'écran qui affiche la fiche d'une donnée de notre
table calculée.
<screen name='SCtblAgregatProducteur'>
<title>Fiche Producteur</title>
<formSet>
<cardForm db='dbDemo'>
<title>Fiche Producteur</title>
<location x='10' y='10' />
<computedTableRef computedTable='tblAgregatProducteur' />
<fieldContainer>
<textField>
<computedColumnRef computedColumn='tblAgregatProducteur_Producteur' />
</textField>
</fieldContainer>
</cardForm>
<listFormRef listForm='FLtblBoisson'>
<title>Liste des boissons</title>
<bounds x='10' y='100' w='500' h='300' />
<selectQueryBuilder>
<castFilterSet autoCastFilter='no'>
<pkCastFilter>
<computedTableRef computedTable='tblAgregatProducteur' />
</pkCastFilter>
</castFilterSet>
</selectQueryBuilder>
</listFormRef>
</formSet>
</screen>
|
Remarques :
Le cardForm est nécessairement en lecture-seule, puisque l'enregistrement
affiché n'est pas une donnée d'une table réelle. Dans le champ sera
affichée la valeur d'une colonne calculée.
La listForm attend comme filtre une valeur de clef primaire de la table
calculée.
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.
|