Vous avez des application 5250 que vous avez décidé d’améliorer en les passant de 80 colonnes à 132 colonnes
c’est au niveau de votre écran que vous devez indiquer cette taille par le mot clé DSPSIZ(27 132 *DS4) .
Quand vous affichez votre écran sur une unité écran de type 3477 tout va bien mais quand vous l’affichez sur une unité écran de type 3179, vous avez une erreur d’entrée sortie.
Comment faire pour éviter ce plantage ?
Bien sur définir toutes les unités écrans en 132, mais on ne maitrise par forcément toujours cette démarche, beaucoup de systèmes étant en auto-configuration.
Voici une première solution minimaliste qui évitera le plantage, et qui enverra un message dans la log
Exemple.
dcl-f
VOTREECRAN WORKSTN
usropn ;
open(e) VOTREECRAN ;
if %error ;
// si erreur on considère que c’est la taille
dsply ‘Vous devez être en 132*27’ ;
// votre traitement ici
endif ;
c’est simple et efficace
Mais vous pouvez faire quelque chose d’un peu plus propre
En effet on peut avoir un mélange dans un dspf que vous allez créer
En indiquant les 2 mots clés dans votre source
Vous devez impérativement indiquer *DS4 en premier
A DSPSIZ(27 132 *DS4 –
A 24 80 *DS3)
La problématique est de trouver la taille de votre unité écran, pour l’instant il n’existe pas de vue SQL qui fasse un DSPDEVD, vous devrez utiliser les API fournies par IBM :
ici QDCRDEVD elle a un format DEVD0600 qui contient cette information.
le source de l’écran avec ses 2 formats
A*%%TS SD 20240308 152030 PLB REL-V7R4M0 5770-WDS
A* attention 132 doit être en premier
A* le premier fixe l'affichage maxi
A DSPSIZ(27 132 *DS4 -
A 24 80 *DS3)
A* Format à afficher en cas de taille 80
A R FMT80
A*%%TS SD 20240308 152030 PLB REL-V7R4M0 5770-WDS
A CA12(12)
A 5 11'Format de l''écran'
A DSPATR(UL)
A 6 11'Ecran 80'
A 7 2'F12=Retour'
A COLOR(BLU)
A* Format à afficher en cas de taille 132
A R FMT132
A*%%TS SD 20240308 152030 PLB REL-V7R4M0 5770-WDS
A CA12(12)
A 5 70'Format de l''écran'
A DSPATR(UL)
A 6 70'Ecran 132'
A 8 2'F12=Retour'
A COLOR(BLU)
Le source du programme
On a créé une procédure interne que vous pouvez facilement externaliser dans un programme de service par exemple, (dans notre exemple, il y a une variable globale liée à la SDS … )
**free
Ctl-Opt DFTACTGRP(*NO) ;
// Test d'une procédure pour déterminer la taille de l'écran DEVD
Dcl-f RTVDEVTYPE WORKSTN ;
// Contient 2 formats
// fmt132 de taille 132
// fmt80 de taille 80
// Information du Job
dcl-ds *N PSDS;
JOB Char(10) Pos(244);
end-ds;
// Variables globales
Dcl-S w_type Char(10);
// 3477 taille 132
// 3179 taille 80
// en interactif, le travail = nom de l'écran
//
w_type = getdevtyp('*') ;
If w_type = '3477' ;
exfmt fmt132 ;
Else;
exfmt fmt80 ;
EndIf;
*inlr = *on ;
// Récupération du type de l'écran
//
Dcl-Proc Getdevtyp Export;
Dcl-PI Getdevtyp Char(10);
Inp_Device Char(10) Const;
End-PI;
// Prototypes de la l'API QDCRDEVD récupération des attributs
// d'une unité
Dcl-PR QDCRDEVD ExtPgm('QDCRDEVD');
Rcvar Like(Rcvar);
Varlen Like(Varlen);
Format Like(Format);
Device Like(Device);
Apierr Like(Apierr);
End-PR;
Dcl-DS Apierr;
Bytprv BinDec(8:0) Pos(1) Inz(216);
Bytavl BinDec(8:0) Pos(5) Inz;
Errorid Char(7) Pos(9) Inz;
Reserved Char(1) Pos(16) Inz;
ErrorDesc Char(200) Pos(17) Inz;
End-DS;
Dcl-S device Char(10) INZ;
// Format pour unité écran
Dcl-S Format Char(8) Inz('DEVD0600');
Dcl-S Rcvar Char(5000) Inz;
Dcl-S Varlen BinDec(4:0) Inz(5000);
Dcl-S typ_dev Char(10) INZ;
// Si * on considère l'écran en cours
if Inp_Device = '*' ;
Device = JOB; // attention variable globale
else ;
Device = Inp_Device;
endif ;
// Appel API systéme
CallP QDCRDEVD(
Rcvar
:Varlen
:Format
:Device
:Apierr
);
If BytAvl = 0;
// Lecture position du type de DSP
typ_dev = %Subst(Rcvar:175:10);
EndIf;
Return typ_dev;
End-Proc Getdevtyp;
Remarque :
Il y a sans doute d’autres solutions, mais vous pouvez vous contenter de l’une des deux citées ci dessus.
Il peut y avoir quelques subtilités mais globalement ça fonctionne bien.