Le modèle d'objet SCRITERE
SCRITERE est un modèle destiné à faciliter la recherche d'informations. L'interface utilisateur est en général constituée d'un bandeau contenant les différents critères de recherche et d'une liste affichant les enregistrements de la table principale. Oxygène++ fournit deux modèles qui dérivent de SCRITERE. Ces modèles CHOIX et ACCES sont ceux préconisés pour la programmation orientée composant.
Les points forts du modèle SCRITERE sont les suivants :
- L'ergonomie du modèle est particulièrement intuitive pour l'utilisateur
- La programmation est très simple
- Les critères de filtre sont déduits directement de l'écran
- Les filtres peuvent être transmis de façon simple à un autre objet
- La simple modification de l'écran permet d'ajouter de nouveaux critères de recherche
Liste des déclarations standards
Nom Désignation
AIDE Fichier d'aides
ECRAN Ecran utilisé
BASE Base de données
à utiliser
TABLE Table à lire
LIBELLES Table de libellés
REP_OBJ Répertoire
de recherche des objets
SOCIETE Code de la
société
VARIABLES Liste des variables
utilisées
PARAMETRES Liste des paramètres
formels
SRC_MODELE Fichier source
contenant des modèles
Liste des variables héritées et contexte de table
Nom Désignation
CodeListe Code
de la liste
CodeClassement Critère
de classement de la liste
LISTEINDEX Contexte sur les champs indexés de la table
Liste des méthodes spécialisées
Nom Désignation
REMPLIT_CLASSEMENT Met
en mémoire la liste des champs indexés
ANALYSE_ECRAN Analyse
les extensions de l'écran
AJOUTE_CRITERE Ajout
par programme d'un critère
ANALYSE_SAISIE Analyse
de l'action de l'utilisateur
ACTIVE_REQUETE Positionne
les filtres sur la table principale
COMPARE_REQUETE Compare
les critères pour optimiser
POSITIONNE_REQUETE Positionne
la liste avant réaffichage
ACTIVE_REQUETE_DEFINITIVE Transmet
les filtres vers un autre objet
Fonctionnement du modèle
Les déclarations BASE et TABLE définissent la table principale utilisée par l'objet. C'est sur la table principale que les filtres de recherches seront posés.
La déclaration ECRAN est également indispensable. L'écran utilisé devra contenir au minimum une liste affichant les données de la table principale.
Au lancement de l'objet, une analyse de la structure de l'écran est déclenchée pour mettre en mémoire la liste des différents critères de recherche. Ces critères sont directement définis depuis l'éditeur d'écrans d'Oxygène++. Chaque contrôle (zone, case à cocher, combobox, etc) est susceptible de définir un critère de recherche.
A l'exécution, les actions de l'utilisateur sont analysées pour déterminer si elles modifient les filtres en cours. Si tel est le cas, les nouveaux filtres sont activés et la liste est actualisée. L'extension GererCaractere définie au niveau de l'écran permet d'activer l'actualisation de la liste à chaque frappe de caractère.
Définition des critères de recherche :
L'éditeur d'écrans d'Oxygène++ permet un stockage d'informations libres appelées "extensions". C'est cette fonctionnalité qui va permettre de définir les critères de recherche utilisés par SCRITERE. Pour définir les extensions d'un contrôle, il faut effectuer un clic-droit sur le contrôle (depuis l'éditeur d'écrans) et choisir la commande "Extension" du menu contextuel.
Le critère de recherche est défini grâce aux quatre mots clés que sont 'CodeChamp', 'Operateur', 'CodeVariable' et 'Tout'.
'CodeChamp' indique le code du champ sur lequel s'effectue l'opération de recherche.
'Operateur' définit l'opérateur utilisé. Les valeurs autorisés sont EgalA, InferieurA, SuperieurA, ApartirDe, JusquA, DebutePar, NeDebutePasPar, DifferentDe, Contient.
'CodeVariable' précise la variable contenant la valeur recherchée. Cette information est facultative. Si elle n'est pas définie le système prend automatiquement la variable définie sur le contrôle d'écran courant.
'Tout' fournit la valeur pour laquelle aucun filtre ne doit être activé. La plupart du temps cette extension n'est pas utilisée, car le cas vide correspond au cas où tous les enregistrements doivent être affichés.
Exemple n° 1 :
CodeChamp=CODE
Operateur=DebutePar
CodeVariable=VPREFIXE
Dans l'exemple ci-dessus, la table principale sera automatiquement filtrée comme si on avait tapé le code suivant :
DebutRequete TABLE
Si VPREFIXE<>"" Alors
Filtre CODE, DebutePar, VPREFIXE
FinSi
FinRequete
Exemple n° 2 : avec utilisation de l'extension "Tout"
CodeChamp=CODE
Operateur=EgalA
CodeVariable=VPREFIXE
Tout=*
Programmation correspondante :
DebutRequete TABLE
Si VPREFIXE<>"*" Alors
Filtre CODE, EgalA, VPREFIXE
FinSi
FinRequete
Les déclarations standards
BASE et TABLE :
Ces déclarations sont indispensables, elles définissent la table principale sur laquelle seront posés les filtres déduits de l'écran.
ECRAN :
Indique le nom de l'écran utilisé par l'objet SCRITERE. L'écran doit contenir un contrôle de type "liste" affichant les informations de la table principale.
|
- Notez ici, que les critères de recherche peuvent également être définis dans des écrans secondaires manipulés par les instructions EmpilerEcran et DepilerEcran du langage. |
Les variables héritées du modèle
CodeListe :
Cette variable héritée définit le code de la liste à actualiser lorsque les critères de recherche sont modifiés. Si rien n'est précisé, le code "LST" est pris par défaut.
CodeClassement :
Cette variable héritée permet d'indiquer le classement à utiliser par défaut au démarrage de l'objet. Il peut être forcé par programme.
|
- l'utilisation d'un classement précisé directement dans les propriétés de la liste est ici déconseillé, car il entrerait en conflit avec celui choisi par le modèle.
- Même remarque pour l'instruction Classement du langage. |
Les méthodes spécialisées du modèle
Méthode REMPLIT_CLASSEMENT :
Dans certain cas, on souhaite permettre à l'utilisateur de choisir lui-même le critère de classement. La méthode REMPLIT_CLASSEMENT est appelée par la méthode AVANT_DEBUT, elle met dans le contexte mémoire LISTEINDEX la liste des champs séquentiels indexés de la table principale.
Pour exploiter cette table mémoire, il suffit d'ajouter dans l'écran un contrôle de type 'Combobox' sur le contexte de table 'LISTEINDEX' (avec les colonnes LISTEINDEX.CODE et LISTEINDEX.LIBEL). La liste sera alors automatiquement classée sur le critère choisi par l'utilisateur.
Méthode ANALYSE_ECRAN :
Cette méthode ne doit pas être redéfinie. Elle analyse les extensions des contrôles de l'écran afin de mettre en mémoire la liste des filtres susceptibles être activés suivant les actions de l'utilisateur.
Méthode AJOUTE_CRITERE :
Paramètres :
Chaine code_champ
Chaine code_operateur
Chaine code_variable
Chaine valeur_tout // facultative
Elle permet d'ajouter par programme un critère de recherche qui n'a pas été défini dans l'écran. Cette méthode est particulièrement utile lorsque l'un des critères est implicite pour l'utilisateur ou lorsqu'une zone de l'cran travaille sur plusieurs filtres. Appeler cette méthode dans la méthode DEBUT.
|
- Dans un modèle SCRITERE, l'utilisation des instructions Filtre, Requete, DebutRequete, SuppFiltre et Classement ne doivent pas être utilisés sur la table principale. En effet, ces instructions perturberaient les automatismes du modèle.
- Par contre, l'utilisation de l'instruction "Rejeter" dans l'événement SELECTION associé à la liste est autorisée. |
Exemple :
AppliquerMethode AJOUTE_CRITERE ("CODE, "DebutePar", "VPREFIXE")
Méthode ANALYSE_SAISIE :
Les méthodes génériques du modèle ont été redéfinies afin que toute action utilisateur déclenche la méthode ANALYSE_SAISIE. Celle-ci détermine si la zone en cours est susceptible de modifier un critère de recherche. Si tel est le cas, elle fait appel à la méthode ACTIVE_REQUETE.
Méthodes ACTIVE_REQUETE et COMPARE_REQUETE :
La méthode ACTIVE_REQUETE est chargée de poser les filtres, de forcer le classement et d'actualiser la liste si les criteres de recherche ont évolué. Elle fait appel à la méthode COMPARE_REQUETE pour éviter de faire des affichages inutiles. Elle appelle également la méthode POSITIONNE_REQUETE juste avant l'affichage de la liste.
Méthode POSITIONNE_REQUETE :
Selon la nature des données traitées il est préférable de se positionner en début ou en fin de fichier. Le programmeur doit redéfinir POSITIONNE_REQUETE pour effectuer le positionnement adapté à son logiciel. Le positionnement sera fait en utilisant les instructions classiques telles que PositionnerDebut et PositionnerFin.
Par défaut, aucun positionnement n'est effectué. Le système conserve alors la position courante (sauf si elle ne correspond plus aux critères de recherche).
Methode ACTIVE_REQUETE_DEFINITIVE :
On a souvent besoin de transmettre à un autre objet les choix faits par l'utilisateur. Le modèle SCRITERE propose ici une solution astucieuse destinée à positionner les filtres sur un contexte de table appartenant à un autre objet.
L'objet qui souhaite récupérer les filtres du modèle SCRITERE doit prendre la main dans sa propre méthode INIT et procéder de la façon suivante :
Methode INIT
AppliquerDefaut INIT
AppliquerMethodeAppelant
ACTIVE_REQUETE_DEFINITIVE ("CLIENT")
FinMethode
Explications :
L'instruction AppliquerMethodeAppelant n'est utilisable que dans la méthode INIT. Elle rappelle automatiquement une méthode de l'objet appelant. Dans notre cas, la méthode en question reçoit en paramètre une chaîne indiquant le code du contexte sur lequel le filtre sera posé. Bien évidemment, le code du contexte passé doit faire référence à la même table que celle manipulée par l'objet SCRITERE. Si tel est le cas, la méthode ACTIVE_REQUETE_DEFINITIVE se charge de positionner les filtres et l'objet appelé n'a plus qu'à exploiter les données comme il l'entend.
Ce mécanisme est en général utilisé pour récupérer les filtres d'un objet à l'autre par exemple pour imprimer les données visualisées à l'écran sans passer en paramètre tous les critères de filtres et surtout sans reprogrammer le mécanisme du modèle SCRITERE.
Une autre technique pour transmettre des filtres est de les traduire en requête SQL et de passer cette chaîne en paramètre : utilisez les intrusctions LitRequeteSql et PoseRequeteSql.