Fil d’Ariane du forum – Vous êtes ici :ForumForums techniques: AS/400Récupérer format écran dans CLP ( …
Vous devez vous identifier pour créer des messages et des sujets.

Récupérer format écran dans CLP (24x80 ou 27x132)

Bonjour,

Savez-vous comment récupérer par une commande CLP le paramétrage d'affichage d'une session (24x80 ou 27x132), ceci afin d'anticiper un plantage lors de l'affichage d'un écran défini en 27x132 si l'utilisateur a une session configurée en 24x80, et de lui indiquer le problème.
Ou encore, suivant sa résolution, de lui afficher un écran 24x80 ou 27x132.
D'avance merci,

TomDarbon

Bonjour,

Regarde du côté de l'API QsnQryModSup. Un exemple ici.

Wilfrid.

Je vois au moins deux méthodes différentes. La première en utilisant l'INFDS associée au fichier écran, la seconde utilise deux APIs de la catégorie DSN (Dynamic Screen Manager).

En voici un exemple:

Méthode 1
---------
Note. Le fichier écran doit être ouvert.

* WSInfDS - Workstation INFormation Data Structure
d WSInfDS ds
d Num_Rows 152 153B 0
d Num_Columns 154 155B 0

d DisplaySize s 6A Varying

* Je place le code ci-dessous dans l'*INZSR :
c If Num_Rows = 27 and Num_Columns = 132
c Eval DisplaySize = '27x132'
c Else
c Eval DisplaySize = '24x80'
c EndIf

* Je teste ensuite la valeur de la variable DisplaySize quand
* j'ai besoin de savoir si j'ai affaire à un écran 24x80 ou 27x132.
c If DisplaySize = '27x132'
c ...
c Else
c ...
c EndIf

Méthode 2 (recommandée)
---------

Je place ces quatre procédures dans un PROGRAMME DE SERVICE,
puis je les appelle dans mon programme selon mes besoins.
NB : Prendre soin de bien respecter la casse des caractères dans
le nom des procédures externes.

Exemples d'appel des procédures
-------------------------------
/free

if Is27x132OK;
Le programme tourne dans une
session qui accepte le mode 27x132
endif;

if Is24x80OK;
Le programme tourne dans une
session qui accepte le mode 24x80
endif;

if ChkScrMode('4');
Je contrôle que le programme tourne
bien dans une session mode 27x132
endif;

if ChkScrMode('3');
Je contrôle que le programme tourne
bien dans une session mode 24x80
endif;

Procédures appelées à insérer dans un programme de service
----------------------------------------------------------

* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Credit goes to Douglas Handy
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Procedure to determine if device is capable of 27x132 mode
P Is27x132OK B Export

D Is27x132OK PI N
D Dummy 1A Options( *NoPass: *Omit )

C Return ChkScrMode( '4' )

P Is27x132OK E
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Procedure to determine if device is capable of 24x80 mode
P Is24x80OK B Export

D Is24x80OK PI N
D Dummy 1A Options( *NoPass: *Omit )

C Return ChkScrMode( '3' )

P Is24x80OK E
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Procedure to check if a given screen mode is valid. The
* first argument, Mode, can be '3' for 24x80 or '4' for 27x132.
P ChkScrMode B Export

D ChkScrMode PI N
D Mode 1A Const

D IsValid S 1A

D QryMode PR ExtProc( 'QsnQryModSup' )
D DspMode 1A Const
D IsValid N
D Handle 10I 0 Options( *Omit )
D ErrorDS Options( *Omit: *Varsize )
D Like( ApiErrorDS )

C Callp QryMode( Mode: IsValid: *Omit: *Omit )
C Return IsValid

P ChkScrMode E
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Procedure to retrieve current screen mode (3=24x80; 4=27x132)
P RtvScrMode B Export

D RtvScrMode PI 1A
D Dummy 1A Options( *NoPass: *Omit )

D RtvMode PR ExtProc( 'QsnRtvMod' )
D DspMode 1A
D Handle 10I 0 Options( *Omit )
D ErrorDS Options( *Omit: *Varsize )
D Like( ApiErrorDS )

D CurMode S 1A Inz( '0' )

C Callp RtvMode( CurMode: *Omit: *Omit )
C Return CurMode

P RtvScrMode E

La 1ère méthode, courte, dans le standard as400 donc facilement maintenable me plait bien, mais j'ai un petit souci.

J'ai fait un prog RPGLE dont le coding est ci-dessous, compile OK mais, que je sois dans une session 24x80 ou 27x132, les valeurs Num_Rows et Num_Columns valent toujours la valeur 6448, et j'ai un message "Cible pour opération numérique trop petite pour contenir résultat" sur le If.

As-tu une idée ?

*------------------------------------------------
* WSInfDS - Workstation INFormation Data Structure
d WSInfDS ds
d Num_Rows 152 153B 0
d Num_Columns 154 155B 0

*------------------------------------------------
c *entry plist
c parm pmode 1
c
c If Num_Rows = 24 and Num_Columns = 80
c Eval Pmode = '1'
c Else
c Eval Pmode = '2'
c EndIf
c
c eval *inlr = '1'

Faudrait voir à ne pas oublier de déclarer l'INFDS au niveau de la spécification F du fichier écran.

FMonEcran cf e workstn infds(WSInfDS)
La valeur 6448 contenue dans les variables de WSInfDS correspond à la valeur hexadécimale de 2 caractères espace X'4040', soit 16448 en base 10, tronquée du premier chiffre

OK, merci beaucoup pour tes éléments de réponse mais donc, ton exemple ne répond pas à mon problème.

En effet, j'ai ajouté la ligne en question, mais alors le programme plante d'emblée, puisqu'on se retrouve dans mon cas de figure original, à savoir :

Si le format en carte F est en 27x132 et qu'on a une configuration différente de la session active (24x80), nos programmes (le mien comme le tien) plantent qu'ils sont appelés, avec le message "CPF4169 reçu pendant OPEN sur fichier CMDMATMF "
avant même qu'on puisse faire le test sur le contenu de WSInfDS ... ce qui n'a donc aucun intérêt.

Mon problème initial reste donc entier : comment récupérer les caractéristiques de la session interactive courante (plus exactement le paramétrage effectué sous Client Access dans communication/configuration/type d'écran 24x80 ou 27x132), et particulièrement le format d'affichage ?

je n'ai pas client access (license pour session 5250 mais comme je suis pas en France,...le code Davinci je m'en calisse 🙂 mais c'est une autre histoire... 😎

Ce que Will et Phil ont donne est bon, tu n'a pas besoin de faire un open pour faire tes test a savoir si tu pu afficher en 27x132 ou non.
(Mais normalement tu devrais etre capable de tout gerer juste avec de bonnes definitions de tes DDS, je veu dire, en utilisant des ecrans compatibles dans les 2 modes *DS3 et *DS4...)

Il ya peut-etre une autre solution, dans un CL comme tu l'a demandé:
Le but etant d'avoir quelque chose a appelle qui me reponds oui tu peu afficher en 132 ou non.

il te faut d'abord creer un DSPF , he oui, ayant juste un sous-fichier de message comme ci-dessous (desole mais je maitrise pas bien encore le formattage de message)
A DSPSIZ(27 132 *DS4)
A R MS01 SFL
A SFLMSGRCD(27)
A MS1KEY SFLMSGKEY
A MC1PGMQ SFLPGMQ(10)
A R MC01
A SFLCTL(MS01)
A SFLSIZ(2)
A SFLPAG(1)
A OVERLAY
A SFLDSP
A SFLDSPCTL
A N30 SFLEND
A SFLINZ
A ERASE(MS01)
A MC1PGMQ SFLPGMQ(10)

Ensuite un clle ou cl qui va essayer d'afficher ce sous-fichier de message
comme ci-dessous

PGM PARM(&WIDESIZE)
DCLF FILE(DUMMYD)
DCL VAR(&WIDESIZE) TYPE(*LGL)
CHGVAR VAR(&MC1PGMQ) VALUE('GETSCRSIZE')
CHGVAR VAR(&WIDESIZE) VALUE('1')
SNDF RCDFMT(MC01)
MONMSG MSGID(CPF4169) EXEC(CHGVAR VAR(&WIDESIZE) +
VALUE('0'))
RETURN
ENDPGM

voila a toi de voir, normalement ca ne devrait pas etre visible pour l'usager, je pense ...

Bon c'est juste si tu es pressé sinon les bonnes méthodes sont celles decrites par wil et phil

Kapeu

Cher Kapeu2,

Génial !

Merci beaucoup pour ta solution toute conne, un peu bidouille mais qui marche, je n'avais pas pensé en effet à afficher un format 27x132 depuis le CL, ainsi on peut monitorer le message !
D'ailleurs, pas besoin de créer un fichier de message bidon, puisqu'il suffit de faire le SNDF sur le format que j'ai déjà créé en 27x132, et ça marche : seul le coding fourni en CLP est suffisant.

Je précise que vu mon appli (une saisie de commandes "pleine page" avec libellés longs d'articles et plusieurs colonnes tarifaires sur chaque ligne, avec gestion d'insertion de lignes vides ou de suppressions, etc...), il est hors de question de proposer des écrans de saisie en 80x24 : voilà pourquoi il est IMPERATIF que mes utilisateurs soient en 27x132.

Pour le reste, encore une fois, le coding fourni précédemment génère le message d'erreur avant même d'arriver sur la première ligne de code, donc je comprend pas trop tes explications "si tu fais juste un open du workstn declare en carte F tu peu faire tes tests pour savoir si tu pu afficher en 27x132 ou non." ... puisque le programme plante AVANT MEME de pouvoir faire un open.

Bref, merci à tous pour votre dévotion, mon problème est résolu, et mes utilisateurs vont enfin pouvoir avoir une belle petite fenetre leur indiquant qu'ils sont en mauvaise configuration écran, plutot qu'ils répondent 4 fois "C" pour sortir du programme.

Tom

Si on utilise la méthode 1 que j'ai publiée dans ce fil, on récupère le nombre de lignes et le nombre de colonnes du fichier écran déclaré sur la spécif F et dans les DDS et NON PAS les tailles d'écran que peut supporter l'UNITE ECRAN (la "carcasse").

Avec la méthode 2, on peut savoir si l'UNITE ECRAN est capable de supporter la taille 27x132 ou 24x80. Ce n'est pas la même chose et c'est plutôt complémentaire à la première méthode pour permettre de récupérer les tailles de format d'écran que l'unité peut supporter.

J'espère me faire bien comprendre. 🙂

OK Phil, pour la méthode 1 j'ai bien compris le principe, et te remercie, mais dans la pratique, sur le coding que tu as publié, je suis désolé mais ça génère un message d'erreur si ta session avec laquelle tu lances le programme est en 24x80, et le format que tu testes en 27x132, c'est-à-dire contient la ligne en DDS :

A DSPSIZ(27 132 *DS3)

Le fait de mettre en 1re ligne du prog RPGLE la carte F avec le format écran comme tu le stipules dans ton 2ème post implique que la première chose que fait le programme est justement un OPEN du fichier, et donc entraine l'erreur CPF4169. J'espère aussi etre bien clair sur ce problème, car c'est le noeud du problème.

Je te suggère de faire le test toi-même.

La méthode de Kapeu2 reste, pour régler mon problème, la seule méthode ultra simple, facile à lire, nécessitant 3 courtes lignes dans le CL ... et QUI MARCHE !

En clair :
DCLF FILE(CMDMATMF)
SNDF RCDFMT(CMDMATF1)
MONMSG MSGID(CPF4169) EXEC(GOTO MSG)

/* Appel d'un programme affichant une fenetre indiquant à l'utilisateur qu'il est en 24x80 au lieu de 27x132 */

MSG : CALL MSG_AFFICH