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.

 

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