HOWTO développement Sashipa

 

 ResearchForm avancé : Rechercher le contenu d'un champ dans plusieurs colonnes.

Vous avez un formulaire de recherche qui contient deux champs pour deux colonnes de la table de recherche, mais vous souhaitez qu'il n'y ait qu'un seul champ pour saisir et que la valeur saisie soit recherchée dans les deux colonnes.

 

Comment faire

Prenons le cas de la table Contact de la base DemoContact : on souhaite rechercher à la fois dans ContactNom et dans ContactPrenom la valeur saisie dans un champ. Voici le code :

  <researchForm>
    <title>Recherche de Contacts</title>
    <location x='10' y='10' />
    <fieldContainer>
      <textField name='fieldNomPrenom'>
        <label>Nom ou prénom</label>
        <schemaColumnRef schemaColumn='cta_ContactNom' />
      </textField>
      <comboBoxFkField><schemaFkRef schemaFk='fk_cta_Profession' /></comboBoxFkField>
    </fieldContainer>
    <listFormRef listForm='FLContact'>
      <redefineBounds x='0' y='100' />
    </listFormRef>

    <researchFormCriteriaBuilder mode='and' defaultSubEmptyAction='ignore' 
                                 emptyAction='stuck'>
      <excludedFieldsFromAutoResearch>
        <fieldRef field='fieldNomPrenom' />
      </excludedFieldsFromAutoResearch>

      <criteriaBuilder mode='or' defaultSubEmptyAction='stuck' emptyAction='ignore'>
        <researchCriteria>
          <castSchemaValue>
            <instanceColumn schemaColumn='cta_ContactNom' />
          </castSchemaValue>
          <fieldRef field='fieldNomPrenom' />
        </researchCriteria>
        <researchCriteria>
          <castSchemaValue>
            <instanceColumn schemaColumn='cta_ContactPrenom' />
          </castSchemaValue>
          <fieldRef field='fieldNomPrenom' />
        </researchCriteria>
      </criteriaBuilder>
    </researchFormCriteriaBuilder>

  </researchForm>

Explication : tout d'abord on donne un nom au champ sur lequel on va travailler : ici fieldNomPrenom.

La logique du formulaire de recherche est contenue dans l'élément researchFormCriteriaBuilder, qui crée des critères de recherche par défaut si l'on ne spécifie rien. Mais ici on rajoute deux éléments :

  • Une liste de champs exclus de la création de critères par défaut : l'élément excludedFieldsFromAutoResearch. On y met tous les champs dont on veut définir nous-même les critères de recherches.

  • Un élément criteriaBuilder qui contient tous les critères de recherche que l'on souhaite rajouter. Notez qu'un criteriaBuilder peut en contenir plusieurs autres.

Dans notre cas on exclue le champ fieldNomPrenom de la génération automatique de critère de recherche. Puis on définit un criteriaBuilder qui séparera ses sous-critères par un OU logique (mode='or'). On crée deux sous-critères de type researchCriteria. Le premier va rechercher le contenu du champ fieldNomPrenom dans la colonne cta_ContactNom. Le deuxième va rechercher le contenu de ce même champ dans la colonne cta_ContactPrenom.

Note concernant la déclaration du textField fieldNomPrenom : ce champ n'est pas lié à la colonne cta_ContactNom, pas plus qu'à cta_ContactPrenom. Néammoins, on spécifie tout de même un élément schemaColumnRef : schemaColumn='cta_ContactNom'. Cette déclaration ne sert qu'à donner au champ le type de donnée qu'il doit gérer. On peut donc lui donner indifféremment l'une ou l'autre des colonnes manipulées.

 

Comment ça marche

Pour info, voici comment ça fonctionne :

L'élément researchFormCriteriaBuilder crée un criteriaBuilder qui englobe celui créé éventuellement manuellement, et ceux créés par défaut pour les champs non exclus. Il ne lui reste alors qu'à ajouter ce criteriaBuilder à la requête du listForm (ou listFormRef) résultat.

 

Info pratique

Si vous souhaitez vous assurer que la requête générée est la bonne, vous pouvez spécifier un fichier journal pour vos requêtes SELECT :

<architecture guiType='application'>
  <dbAccessStage database='dbContact' architecture='clientDatabase'>
    <!-- HSQLDB (by jdbc) -->
    <dbConnection dbmsType='HSQLDB' type='jdbc'>
      <!-- ... -->
    </dbConnection>
    <dbAccessLog>
      <filenameLogMain>Melba_Main.log</filenameLogMain>
      <filenameLogUpdate>Melba_Update.log</filenameLogUpdate>
      <filenameLogSelect>Melba_Select.log</filenameLogSelect>
    </dbAccessLog>
  </dbAccessStage>
  <languageDefinitionSet mainLanguageDefinition='french'>
    &frenchDefinition;
  </languageDefinitionSet>
</architecture>

Toute requête SELECT exécutée sera alors tracée dans le fichier Melba_Select.log . Dans votre application, faite une recherche. Ensuite, éditez ce fichier et vous retrouverez votre requête en fin de fichier.

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