Cette version modifie les définitions des objets et nécessite donc une recompilation complète.
Ces fonctions permettent d'effectuer des calculs sur des nombres de longueur quelconque en assurant un résultat précis.
De nombreuses modifications ont à nouveau eu lieu dans les MPAGES, tout en gardant une compatibilité (presque) totale avec les anciennes définitions.
Pour un exposé détaillé et commenté il y a lieu de se reporter à la prochaine version des manuels.
Les mots-clés suivants sont supprimés: BPG2, SELECT_BPG_FN. Les notions qu'ils implémentaient sont remplacées par les notions plus générales de VIEWS explicitées plus bas.
Lorsque la position des champs de la LPG sont définis à partir du SCREEN de la APG, il faut que les
Si ce n'est pas le cas, le positionnement ne peut être réalisé.
D'autre part, une correction est effectuée si le premier champ ne débute pas en colonne 1 du SCREEN de la APG.
Un champ de la APG permet de visualiser le nombre de lectures dans l'ISAM : il suffit de lui donner l'attribut FLD_COUNT. Ce champ peut maintenant être de type STRING (un seul caractère sous forme d'hélice tournant d'un cran à chaque lecture). La variable globale MP_COUNT_FREQ permet de n'afficher ce champ qu'une fois toutes les MP_COUNT_FREQ lectures. Par défaut MP_COUNT_FREQ est fixé à 10.
Les lignes d'une MPAGE vides (fin de fichier) sont affichées dans la couleur de définition de la LPG et non dans la couleur DEFAULT.
Dans le cours de l'édition de la MPAGE les touches DELETE_1, INSERT_1 et ENTER_1 peuvent être utilisées (SCR_record_key()). Leur comportement diffère de celui de leur pendant INSERT, DELETE et ENTER :
On peut souhaiter que l'affichage des enregistrements à l'aide d'une MPAGE varie en fonction du contenu des enregistrements eux-mêmes. Ainsi, dans une même portefeuille financier, on peut avoir à la fois des obligations, des options, des actions, etc.
Il s'agira donc d'afficher ces informations dans des LPG différentes et de les éditer dans des BPG différentes. De plus, même si physiquement la base de données est la même, les champs définis dans l'ISAM, hormis ceux servant d'index, peuvent être vus totalement différemment selon le cas.
Entre le cas standard et ce cas complexe, toute une gamme de situations peut être imaginée: des produits que l'on veut différencier selon le code TVA en les affichant dans des couleurs distinctes, des dossiers qui sont clôturés ou ne le sont pas et doivent faire apparaître des informations différentes, etc.
Pour préciser les différents affichages des enregistrement, on définira:
La syntaxe de définition d'une VIEW est :
VIEW n {
[LPG page_defn]
[BPG page_defn | BC bc_defn]
[ISAM isam_defn]
}
Le numéro (n) de la VIEW l'identifie (en commençant à 1). Ce numéro sera retourné par la VIEW_FN et la VIEW_CREATE_FN.
La LPG est la PAGE qui remplace la LPG par défaut. De même pour le BPG ou le BC qui seront utilisés pour l'édition ou la visualisation d'un enregistrement.
L'ISAM n'est jamais ouvert: il ne sert qu'à définir une découpe en champs différente de celle de l'ISAM par défaut.
Lorsque différentes VIEW sont définies pour une MPAGE, il faut pouvoir, pour chaque record, déterminer la vue à utiliser, que ce soit pour la LPG, la BPG ou l'ISAM de définition.
La VIEW_FN est utilisée à cette fin. Ce sera toujours une fonction C qui retournera le numéro de la vue à exploiter pour l'affichage (LPG) ou l'édition (BPG ou BC) d'un enregistrement.
Une valeur de retour de 1 correspond à la vue VIEW 1, 2 à VIEW 2, etc. Pour toute autre valeur, les définitions par défaut, (LPG, BPG ou BC, ISAM) seront utilisées.
La VIEW_FN peut exploiter les valeurs du record de l'ISAM par défaut (celui défini par le mot-clé ISAM dans la définition de la MPAGE). Par exemple, pour distinguer deux records selon le chiffre d'affaire, on écrira :
VIEW_FN {C_FN return((is_cli_CHAFF < 500000L) ? 0 : 1)}
La vue par défaut sera utilisée si le chiffre d'affaire est inférieur à 500000 et VIEW 1 s'il est supérieur à cette valeur. Les deux vues pourraient dans ce cas par exemple se distinguer uniquement au niveau de la couleur de la LPG.
Lorsque différentes VIEW sont définies pour une MPAGE, il faut pouvoir, lors de la création d'un nouveau record, déterminer à l'avance la vue à utiliser de façon à savoir quelle BPG ou quel BC utiliser pour la création.
La VIEW_CREATE_FN est utilisée à cette fin. Ce sera toujours une fonction C qui retournera le numéro de la vue à exploiter pour l'affichage (LPG) ou l'édition (BPG ou BC) d'un enregistrement. En général, cette fonction C affichera un MENU et, selon la valeur de retour de ce menu, retournera un numéro de vue.
Selon la valeur de retour, les traitements seront différents :
Par exemple, en supposant que deux types de records peuvent être créés dans la base de données, l'un correspondant à des valeurs, l'autre à un commentaire, on aura :
MENU mn_choice {
line 10 col 60
OPTION "Ligne de valeurs"
OPTION "Ligne de commentaire"
}
MPAGE mp_valeurs {
LPG lpg_valeurs
BPG bpg_valeurs
ISAM is_valeurs
VIEW_CREATE_FN {C_FN return(MN_edit(mn_choice) - 1);}
VIEW 1 {LPG lpg_comment BPG bpg_comment ISAM is_comment}
}
Au lancement de la lecture des records pour remplir une MPAGE, l'écran des LPG est vidé. En effet, dans le cas des MPAGE avec SCAN, on peut attendre un certain temps avant que tout l'écran ne soit rempli, et on conservait dans l'écran les enregistrements provenant de la lecture précedente.
Le temps d'attente lors du remplissage d'une MPAGE avec SCAN pouvant être très long, l'utilisateur peut interrompre le processus en pressant la touche ESCAPE.
Le mot-clé HELP dans la définition d'une MPAGE définit le sujet qui doit être affiché si la touche HELP est pressée pendant l'édition de la MPAGE.
Le mot-clé COMMENT suivi d'un texte indique le commentaire à afficher pendant l'édition de la MPAGE (déplacement dans les LPG seulement).
Si les FNKEYS contiennent également des commentaires, ceux-ci sont ajoutés au COMMENT de la MPAGE.
De plus, en tapant un espace, un MENU reprenant toutes les touches définies et leur commentaire est affiché dans le coin supérieur gauche de la APG.
Comme la MPAGE affiche plusieurs records simultanément, un certain nombre sont conservés en mémoire (BUF_SIZE). Comme les LPG peuvent contenir des champs CODEISAM, à chaque affichage d'une ligne, il faut relire un ou plusieurs ISAM pour compléter la PAGE.
Pour éviter les lenteurs dues à ce processus (répété en permanence), on conserve en mémoire le contenu des LPG.
Cependant, pour les applications pour lesquelles la mémoire est une denrée précieuse, on peut souhaiter ne pas conserver le contenu des LPG en mémoire : c'est l'objet de ce mot-clé.
Ainsi "LPG_MEM No" permet de gagner de la mémoire, mais génère une perte de temps. Par défaut, les LPG sont conservées en mémoire.
Cette option peut être globalisée par GLOBAL {MP_LPG_MEM Yes | No}.
Lors du début de la recherche, il se peut qu'aucun record ne soit trouvé. Dans ce cas, soit une création est automatiquement proposée (c'est le cas par défaut), soit aucun affichage ne peut être réalisé. Ce sera alors à l'utilisateur de presser INSERT pour en créer un nouveau ou ESCAPE pour quitter.
En spécifiant AUTO_CREATE No ou MP_AUTO_CREATE No, la création n'est pas proposée automatiquement.
Cette option indique si, lors de la création d'un nouvel enregistrement (INSERT), il faut initialiser les valeurs de la BPG en y plaçant celles définies dans le record de référence. Ce record est celui qui a permis de démarrer la recherche dans la MPAGE et provient donc soit de la APG, soit de la SPG si elle est définie.
Par défaut, ce n'est pas le cas. Dans le cas où un BC sert à la création d'un nouvel enregistrement, ce n'est jamais le cas.
On peut dorénavant définir un BC au lieu de la BPG et ce à la fois dans la définition normale de la MPAGE et dans les VIEWS. Lorsque ENTER ou INSERT est pressé, le BC est édité au lieu de la BPG.
L'édition des champs formattés est légèrement amélioré :
Cette fonction retourne des valeurs différentes selon la raison de la fin de l'édition :
Les BC constituent l'essentiel des améliorations apportées à la version 4.20. Certaines fonctionnalités de la version 2 sont notamment réintégrées comme la conservation des champs des LPG. D'autre part, de nombreuses facilités d'accès aux informations des LPG et LBC ont été imaginées.
La compatibilité avec les versions antérieures est quasi-totale, exception faite du remplacement de certains mots-clés récemment introduits.
Les mots-clés suivants sont supprimés suite à la généralisation introduite par les VIEW (cfr. infra):
Pour des raisons obscures, la END_FN de la BPG d'un BC était exécutée deux fois si la touche F10 était pressée. Elle n'est plus exécutée qu'une fois.
Tous les enregistrements des lignes de BC sont conservés en mémoire en permanence. Comme les LPG peuvent contenir des champs CODEISAM, à chaque affichage d'une ligne, il faut relire un ou plusieurs ISAM pour compléter la LPG.
Pour éviter les lenteurs dues à ce processus (répété en permanence), on peut conserver en mémoire le contenu des LPG. C'est dorénavant le cas par défaut.
Cependant, pour les applications pour lesquelles la mémoire est une denrée précieuse, on peut souhaiter ne pas conserver le contenu des LPG en mémoire. Pour ce faire on indiquera
LPG_MEM No
dans la définition du BC ou
BC_LPG_MEM No
dans une section GLOBAL précédant la définition du BC. Dans ce dernier cas, cette valeur affectera tous les BC suivant la section GLOBAL.
Des #define sont généré par scr4_e pour permettre un accès direct aux valeurs des champs des LPG et des LBC. Ces #define sont construits comme suit :
bcname_ISFLDNAME(i),
et
bcname_pPAGEFLDNAME(i)
respectivement pour le champ ISFLDNAME de l'ISAM LBC et pour le champ PAGEFLDNAME de la PAGE LPG. Dans les deux cas, la valeur est celle du ième record du BC. Soit l'exemple suivant :
ISAM mylbc {
...
FIELD string 20 NAME nom
FIELD long NAME chaff
...
}
PAGE mylpg {
...
DEFAULTS {ISAM mylbc}
FIELD ISF nom NAME pgnom
FIELD ISF chaff NAME chaff
....
}
BC mybc {
LPG mylpg
LBC mylbc myidx
...
}
On peut utiliser (en cours d'édition du BC mybc) :
Cette dernière définition n'a des sens que si BC_LPG_MEM n'est pas fixé à NO.
Il est également possible d'accéder aux valeurs des champs des LPG et LBC via des fonctions :
Le nombre de lignes du BC courant peut être obtenue par la fonction BC_nb_lbcs(bc).
On peut donc aisément effectuer une totalisation et la placer dans la LINK_FN du BC (voir définitions dans l'exemple précédent) :
MYBC_link()
{
int i;
long tot = 0L;
for(i = 0 ; i < BC_nb_lbcs(mybc) ; i++)
tot += mybc_CHAFF(i);
apg_mybc_TOTAL = tot;
PG_display_flds(apg_mybc);
}
La LINK_FN est exécutée lors de l'affichage de la APG et des LPG
Pour assurer une plus grande cohérence dans l'édition des BC, la touche ESCAPE quitte l'édition du BC que l'on se trouve dans l'édition des lignes du BC ou de la APG.
De plus, dans l'édition de la BPG (création ou édition d'une ligne), ESCAPE abandonne l'opération en cours mais reste en édition des lignes de BC.
Le mot-clé COMMENT suivi d'un texte indique le commentaire à afficher pendant l'édition du BC (déplacement dans les LPG seulement).
Si les FNKEYS du BC contiennent également des commentaires, ceux-ci sont ajoutés au commentaire.
De plus, en tapant un espace, un MENU reprenant toutes les touches définies et leur commentaire est affiché dans le coin supérieur gauche de la APG.
Le mot-clé HELP dans la définition d'un BC définit le sujet qui doit être affiché si la touche HELP est pressée pendant l'édition du BC.
Si un champ possède l'attribut FLD_COUNT dans une des PAGE de définition du BC, il doit être de type NATURAL ou INTEGER et il se comporte de la façon suivante :
On peut de cette façon faire apparaître automatiquement le nombre total de lignes et le numéro de chacune sans avoir à programmer une seule ligne.
On peut dorénavant introduire de nouvelles lignes dans un BC à n'importe quelle position : avant ou après la ligne courante, ou à la fin du BC.
Si on souhaite utiliser cette fonctionnalité, il faut introduire le mot-clé INSERT_LBC dans la définition du BC. Le MENU scr_bcie (qui peut être adapté par l'utilisateur) est affiché lorsque l'opérateur presse INSERT pour offrir le choix entre ces 3 possibilités.
L'introduction répétée de lignes entre deux lignes existantes conduit inévitablement à une limite : le numéro automatiquement assigné par SCR/AL1 au nouveau record doit se situer entre les deux qui l'entourent.
Lorsque cette situation se présente, les lignes sont toutes renumérotées par incrément de 20. Comme cette opération (plus complexe qu'il n'y paraît) peut prendre quelques secondes dans le cas d'un grand BC, un message est affiché pour indiquer à l'opérateur que la renumérotation des lignes est en cours.
Un interface identique à celui de MT ou de MMT à été construit pour faciliter l'édition des BC : des blocs de lignes de BC peuvent être marqués, copiés et détruits à l'aide des touches Alt+L, Alt+C et Alt+D. Les marques sont annulées par la touche Alt+U.
Comme les touches Alt+lettre sont souvent utilisées comme touches fonctions de l'application, on peut utiliser à la place Ctrl+lettre (comme c'est le cas dans MMT).
La copie peut se faire avant ou après la ligne courante, ou encore à la fin du BC. Le MENU scr_bcie est appelé si le mot-clé INSERT_LBC se trouve dans la définition du BC.
Comme dans le cas de l'insertion, une renumérotation automatique des lignes est effectuée au besoin.
La ligne placée sous la dernière ligne de BC est maintenant une ligne continue (semi-graphiques) ou lieu l'une ligne de moins. De plus, si on détruit l'unique ligne d'un BC, l'affichage est corrigé (deux lignes apparaissaient).
D'autre part, un peut spécifier le mot-clé SBAR dans la définition d'un BC. Dans ce cas un SCROLLBAR (semblable à celui des MENU) est placé à gauche des LPG (dans la première colonne de la APG). Le scrollbar comprend le même nombre de lignes qu'il y a de LPG et commence en face de la première LPG.
Le compilateur scr4_e vérifie que l'INDEX du LBC qui lie celui-ci au BC est bien NODUP.
L'édition reste possible même si tous les champs de la APG du BC sont output. Cela permet de n'avoir accès qu'aux lignes du BC.
Lors du début de l'édition des lignes d'un BC vide, une création de ligne est automatiquement proposée. Si la mot-clé AUTO_CREATE est défini dans le BC avec la valeur No, cela n'est plus le cas : c'est alors à l'utilisateur de presser INSERT pour en créer un nouveau ou ESCAPE pour quitter :
AUTO_CREATE YES | No
On peut globaliser cette option par le mot-clé
BC_AUTO_CREATE YES | No
défini dans une section GLOBAL.
On peut souhaiter que l'affichage des enregistrements à l'aide d'un BC varie en fonction du contenu des enregistrements eux-mêmes. Ainsi, dans une même facture, on peut avoir à la fois des valeurs et des commentaires.
Il s'agira donc d'afficher ces informations dans des LPG différentes et de les éditer dans des BPG différentes. De plus, même si physiquement la base de données est la même, les champs définis dans l'ISAM LBC, hormis ceux servant d'index, peuvent être vus totalement différemment selon le cas.
Pour préciser les différents affichages des enregistrement, on définira:
La syntaxe de définition d'une VIEW est :
VIEW n {
[LPG page_defn]
[BPG page_defn]
[ISAM isam_defn]
}
Le numéro (n) de la VIEW l'identifie (en commençant à 1). Ce numéro sera retourné par la VIEW_FN et la VIEW_CREATE_FN.
La LPG est la PAGE qui remplace la LPG par défaut. De même pour la BPG qui sera utilisée pour l'édition ou la visualisation d'une ligne du BC.
L'ISAM défini dans une VIEW n'est jamais ouvert: il ne sert qu'à définir une découpe en champs différente de celle de l'ISAM LBC défini dans le BC.
Lorsque différentes VIEW sont définies pour les lignes d'un BC, il faut pouvoir, pour chaque ligne, déterminer la vue à utiliser, que ce soit pour la LPG, la BPG ou l'ISAM de définition.
La VIEW_FN est utilisée à cette fin. Ce sera toujours une fonction C qui retournera le numéro de la vue à exploiter pour l'affichage ou l'édition d'une ligne du BC.
Une valeur de retour de 1 correspond à la vue VIEW 1, 2 à VIEW 2, etc. Pour toute autre valeur, les définitions par défaut, (LPG, BPG ou BC, ISAM) seront utilisées.
La VIEW_FN peut exploiter les valeurs du record de l'ISAM par défaut (celui défini par le mot-clé ISAM dans la définition de la MPAGE). Par exemple, pour distinguer deux records selon le chiffre d'affaire, on écrira :
VIEW_FN {C_FN return((is_cli_CHAFF < 500000L) ? 0 : 1)}
La vue par défaut sera utilisée si le chiffre d'affaire est inférieur à 500000 et VIEW 1 s'il est supérieur à cette valeur. Les deux vues pourraient dans ce cas par exemple se distinguer uniquement au niveau de la couleur de la LPG.
Lorsque différentes VIEW sont définies pour les lignes d'un BC, il faut pouvoir, lors de la création d'une nouvelle ligne, déterminer à l'avance la vue à utiliser de façon à savoir quelle BPG utiliser pour la création.
La VIEW_CREATE_FN est utilisée à cette fin. Ce sera toujours une fonction C qui retournera le numéro de la vue à exploiter pour la création (BPG) d'une ligne. En général, cette fonction C affichera un MENU et, selon la valeur de retour de ce menu, retournera un numéro de vue.
Selon la valeur de retour, les traitements seront différents :
Par exemple, en supposant que deux types de lignes peuvent être créés dans le BC, l'un correspondant à des valeurs, l'autre à un commentaire, on aura :
MENU mn_choice {
line 10 col 60
OPTION "Ligne de valeurs"
OPTION "Ligne de commentaire"
}
BC facture {
...
LPG lpg_valeurs
BPG bpg_valeurs
ISAM is_fact
VIEW_CREATE_FN {C_FN return(MN_edit(mn_choice) - 1);}
VIEW 1 {LPG lpg_comment BPG bpg_comment ISAM is_comment}
}
Les options AUTO_CREATE et LPG_MEM des BC et MPAGE peuvent être définies par défaut globalement dans une section GLOBAL :
Les implications de ces options sont commentées dans les modifications des MPAGE et des BC.
Les corrections apportées dans la version 4.19 à la gestion des #ifdef, #else et #endif peuvent au besoin être ignorées pour assurer la compatibilité avec les versions antérieures de SCR/AL1. Pour remettre les anciens traitements lors de la compilation de sources SCR/AL1, il suffit d'ajouter l'option -yyold comme paramètre à scr4_e.
Si le groupe de fonctions s_yy est exploité directement par le programmeur, celui-ci peut fixer la variable YY_OLD_DEF à une valeur non nulle pour conserver les anciens traitements.
La nouvelle option -yyold permet de reprendre les anciens traitements (erronés) des #ifdef, #else et #endif dans les sources SCR/AL1 (voir supra).
Correction de bug dans l'affichage des PAGE lorsque FLD_MEM n'est pas défini.
Copyright © 1998-2015 Jean-Marc Paul and Bernard PAUL - Envoyez vos remarques ou commentaires à bernard@xon.be