Modèle de variables ou de data structure

Depuis la 6.1, il est possible d’utiliser un nouveau mot-clef:TEMPLATE.

Dans le passé, pour qu’une variable/data structure hérite des attributs d’une , on faisait baser cette variable/DS sur une partie de pointer qui ne contenait pas de valeur particulière comme ci-dessous:

       dcl-ds inhert based(nihil);    
         entire char( 131072);
         chrstr char( 131072) pos(1);  
         r_option_1 char(1) pos(1);
         r_categorie_client char(1);
       end-ds;
...
       Dcl-s Option_produit Like(r_option_1 );
Héritage d'attributs de variable

TEMPLATE permet d’utiliser une  variable/data structure comme modèle. Les variables utilisées dans vos sources pourront hériter de ces attributs par les mots-clef LIKE et LIKEDS.

      Dcl-s entire char( 131072) TEMPLATE;
      Dcl-s chrstr char( 131072) TEMPLATE;  
      Dcl-s r_option_1 char(1) TEMPLATE;
      Dcl-s r_categorie_client TEMPLATE;

      Dcl-ds DS_modele TEMPLATE;
          r_option_1  char(4);
          r_Mod_produit_1 CHAR(10);
      End-ds;
...
      Dcl-ds Produit;
        code_produit char(4);
        Type_produit packed(2:0);
        Version likeds(DS_modele);
      End-ds;

      Dcl-s Option_produit Like(r_option_1 );
Héritage des attributs d'une Data Structure

 

 

Convertir des variables hexadécimales en caractères Convert Hex to Character (CVTHC)

Le problème rencontré est d’afficher une variable hexadécimale sur un écran (DSPF). Après moult recherche, j’ai trouvé l’API Convert Hex to Character (CVTHC)dans la catégorie IBM i Machine Interface.

Une table DB2 contient le champ spécial de type ROWID. Ce champ déclaré en SQLTYPE(ROWID) est transformé par le compilateur en CHAR(40) Varying CCSID(*HEX). Dans un écran, je souhaite afficher les différents champs d’un enregistrement de la table dont le ROWID mais ce type de variable n’existe pas en DDS.

La solution est d’extraire la valeur hexadécimal sous forme caractère. L’API  CVTHC permet de le faire (et vice versa).

D’abord, voici le prototype:

       /If defined(Cvthc)
       //---------------------------------------------------------
       // Convert Hex to Character
       dcl-pr cvthc extproc(*dclcase);
        *n pointer value; // receiver pointer
        *n pointer value; // source pointer
        *n int(10) value; // receiver length
       end-pr;
       /endif 

Il faut déclarer la variable d’entrée ( valeur à convertir) dans le source RPGLE

       // Gestion du ROWID
       Dcl-s g_Rowidlots SQLTYPE(ROWID);  

et celle de sortie (valeur convertie) dans l’écran.

     A            ZROWIDLOTS    84   O 24  4COLOR(WHT)     

Ensuite voici comment elle est utilisé en RPGLE:

cvthc(%addr(zrowidlots): %addr(g_rowidlots): %Len(g_rowidlots)*2);  //make hex 

Sur l’écran nous obtenons:

Autre lien décrivant son utilisation:

Utilizing MI Functions in RPG Programs

 

RÉINGÉNIERIE DE CODE RPG 5e étape – Indicateurs DSPF

Dans ce cadre, une  autre modernisation possible est d’utilisé le mot clé INDARA au niveau fichier dans le DDS.

     A                                      DSPSIZ(27 132 *DS4)
     A                                      MSGLOC(27)
     A                                      PRINT
     A                                      HELP
     A                                      HLPPNLGRP('PGMF01' PGMF01)
     A                                      HLPTITLE('Aide générale -
     A                                      sur PGMF01')
     A                                      ALTHELP(CA01)
     A                                      INDARA
     A                                      REF(LOTS)     

Cela permet de lier une DS utilisable dans le source RPG ILE qui contiendra une version plus explicite des indicateurs utilisés dans le DSPF.

Dans le source RPG ILE, nous déclarerons cette DS au niveau du fichier DSPF avec le mot clé Indds.

       dcl-f PGMF01FM workstn sfile(sfl01 :wran01) infds(dssfl1) indds(IndDs);

Exemple de déclaration de la DS en elle-même:

       Dcl-ds IndDs;
        Rollup Ind Pos(2);
        Sflnxtchg Ind Pos(8);
        Zoptpr Ind Pos(20);
        Znomred Ind Pos(30);
        Sflend Ind Pos(7);
        Sfldsp Ind Pos(4);
        Sfldspctl Ind Pos(5);
        Sflclr Ind Pos(6);
        Sflend_no_rollup Ind Pos(7);
        Sflinz_Msgf Ind Pos(10);
        Sflend_Msgf Ind Pos(09);
       End-ds;     

RÉINGÉNIERIE DE CODE RPG 1re étape RPG III vers RPG ILE
RÉINGÉNIERIE DE CODE RPG 2e étape – Code en commentaire
RÉINGÉNIERIE DE CODE RPG 3e étape Indicateurs Fichier
RÉINGÉNIERIE DE CODE RPG 4e étape – Touches de fonction