HOWTO développement Sashipa

 

 Rendre le contenu d'un listForm dépendant d'un champ.

Dans un écran, vous souhaitez que le contenu d'un listForm soit dépendant de champs du même écran.

 

Nous voulons que lorsque l'utilisateur ajoute une personne ou modifie son nom, une listForm affiche immédiatement et sur le même écran, toutes les personnes du même nom. Ainsi l'utilisateur pourra éviter d'insérer des doublons.

Techniquement, il s'agit d'intégrer manuellement le comportement d'un researchForm à partir du champ d'un cardForm. Je recommande auparavant de lire la FAQ qui détaille le fonctionnement des selectQueryBuilder.

Voici le code. Pour le cardForm, rien de changé. On se contente de nommer les champs concernés par la recherche. Ici le nom :

  <cardForm db='dbDemo'>
    <title>Fiche d'une personne</title>
    <location x='10' y='10' />
    <cardSchemaTableRef schemaTable='tblPersonne' updateAfterInsert='no' 
                        multipleInsert='yes' queries='sudi' />
    <fieldContainer>
      <textField name='fieldNom'>
        <schemaColumnRef schemaColumn='tblPersonne_Nom' />
      </textField>
      ...

Dans le même écran (screen) nous ajoutons le listForm :

  <listForm db='dbDemo' doubleClicScreen='SCtblPersonne' 
            delete='no' disabledWhenInsert='no' displayRowCount='no'>
    <title>Liste des personnes du même nom</title>
    <bounds x='10' y='350' w='610' h='180' />

    <selectQueryBuilder>
      <castFilterSet filterSensitive='no' />
      <fromStatementBuilder>
        <mainInstanceTable schemaTable='tblPersonne' />
      </fromStatementBuilder>
      <whereStatementBuilder>
        <criteriaBuilder mode='or' emptyAction='stuck'
                         defaultSubEmptyAction='stuck' >
          <researchCriteria>
            <castSchemaValue>
              <instanceColumn schemaColumn='tblPersonne_Nom' />
            </castSchemaValue>
            <fieldRef field='fieldNom' />
          </researchCriteria>
        </criteriaBuilder>
      </whereStatementBuilder>
    </selectQueryBuilder>

    <instanceColumnList>
      <instanceColumn schemaColumn='tblPersonne_Nom' letterCount='20' />
      <instanceColumn schemaColumn='tblPersonne_Prenom' letterCount='20' />
    </instanceColumnList>
  </listForm>

Explications :

  • Par défaut, lorsqu'il existe un formulaire de type cardForm dans un écran, tous les autres formulaires se désactivent lors de l'ouverture en mode ajout. Ici nous souhaitons annuler ce comportement : disabledWhenInsert='no'.

  • La requête n'est pas sensible au filtre de l'écran (filterSensitive='no') ce qui évite les effets de bords lors de l'ouverture en mode modification-consultation.

  • Dans la clause Where, on ajoute un élément researchCriteria qui génèrera un critère SQL faisant correspondre la colonne Personne.Nom avec le champ fieldNom. Ce critère bloque la requête ('stuck') lorsque le champ est vide : le listForm sera vide tant que le champ n'est pas rempli.

 

Remarque importante : un champ nommé doit obligatoirement être déclaré avant d'être référencé par un researchCriteria. Donc pensez à écrire votre cardForm avant d'écrire le listForm, dans le code Sashipa de votre écran.

De plus, la portée du nom d'un champ est celle de l'écran (screen) ou à défaut du formulaire (form) dans lequel il a été déclaré. Il est impossible de référencer un champ déclaré dans un formulaire lui-même référencé.