, Format DSP *DS4 et *DS3

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.