, Copier vos données VIA DDM/DRDA

Vous connaissez tous DDM qui permet d’avoir un fichier qui pointe sur une système

Cette solution s’appui sur DRDA, donc DRDA devra etre configuré aujourdh’ui en IP

Cette solution est simple elle permet par exemple de mettre à jour des données d’un système vers un autre IBMi

Nous vous proposons un outil simple qui vous permettra de faire des copies dynamiques

La commande CPYRMTDTA

/* programme associé CPYRMTDTA */
CMD PROMPT(‘Copie data vers un IBMi’)

PARM KWD(FROMFILE) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(‘Fichier source’)
PARM KWD(FROMLIB) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(‘Bibliothèque source’)
PARM KWD(TOFILE) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(‘Fichier cible’)
PARM KWD(TOLIB) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(‘Bibliothèque cible’)
PARM KWD(RMTLOC) TYPE(*CHAR) LEN(30) MIN(1) +
PROMPT(‘Emplacement distant (RDB)’)

Le programme CLLE (à améliorer )

PGM (&FFILE &FLIB &TLIB &TFILE &RMT)/*——————————*/
/* Copier les données d’un fichier local vers un fichier distant */
/* en utilisant drda */
/* drda doit etre configurer sur le système distant */
/* et l’utilisateur en cours doit pouvoir s’authentifier */
/* */
/*——————————————————————*/
DCL &FFILE *CHAR 10
DCL &FLIB *CHAR 10
DCL &TFILE *CHAR 10
DCL &TLIB *CHAR 10
DCL &RMT *CHAR 30
INCLUDE SRCMBR(ERREUR1) SRCFILE(GCOMPILE/QCLSRC)
CHKOBJ &FLIB/&FFILE *FILE
DLTF FILE(QTEMP/RMTFILE)
MONMSG CPF2100
CRTDDMF FILE(QTEMP/RMTFILE) RMTFILE(&TLIB/&TFILE) +
RMTLOCNAME(&RMT *IP)
CPYF FROMFILE(&FLIB/&FFILE) TOFILE(QTEMP/RMTFILE) +
MBROPT(*REPLACE)
MONMSG CPF0000 EXEC(DO)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA(‘Copie +
fichier : ‘ *BCAT &FFILE *BCAT +
‘,impossible’) MSGTYPE(*ESCAPE)
ENDDO
INCLUDE SRCMBR(ERREUR2) SRCFILE(GCOMPILE/QCLSRC)

Remarque :

Bien sur vous devrez contrôler la sécurité, attention par exemple un profil *disabled peut se connecter en DRDA

Pour vous aidez, vous pouvez télécharger notre outil WRKSRVAUTE pour gérer vos postes d’authentifications :https://github.com/Plberthoin/PLB/tree/master/GTOOLS

, V7R6, la liste des commandes supprimées

APYJRNCHGX Appliquer modifs journal étend
CFGPMAGT Configure PM Agent
CFGPM400 Configure PM Agent
CHGDHCPSVR Change DHCP Server
CHGRTDA Change RouteD Attributes
CPYIGCSRT Copy DBCS Master Sort Table
MRGFORMD Fusionner description imprimé
STRAPF Démarrer APF
STRCGU Start CGU
STRRLU Démarrer Utilit maquette état
STRSDA Démarrer SDA
WRKPMRMTS Work With Remote Systems
WRKPMRPTO Work With Omissions
WRKPMSCH Work With Scheduled Jobs
WRKRTDCFG Work with RouteD Configuration

Remarque :

Sans surprise on retrouve bien SDA et RLU

, , Les profils _NC en V7R6

En V7R6 vous avez de nouveaux profils qui apparaissent avec l’extention _NC

QPGMR_NC
QSECOFR_NC
QSYSOPR_NC
QUSER_NC

C’est des profils qui ne sont pas modifiables, et ils n’ont pas de mot de passe

Et certains services ibm démarrent avec ceux ci

Conclusions :
Attention, par exemple, si vous avez customisé QUSER ou QPGMR vous pouvez avoir des surprises après migration

, Gestion des spools par ACS

Vous connaissez l’option ACS qui vous permet de gérer vos SPOOLs , c’est une alternative intéressante à la commande WRKSPLF et si vos utilisateurs ont beaucoup de spools à gérer, ca peut leurs simplifier la tache, n’hésitez pas à leurs donner l’option, c’est relativement intuitif .

Vous pouvez par exemple faire simplement un fichier PDF et le joindre à un mail .

Vous voulez simplifiez la vie de vos utilisateurs en leurs présentant cette option à la place d’un WRKSPLF dans vos applications existantes

Voici une ébauche de solution

Un programme de lancement

Vous devrez d’abord écrire un programme qui lance l’option ACS à partir de votre programme IBMi à base des commandes STRPCO et STRPCCMD

Voici un exemple RPGLE

**free                                                                         
// Ce programme permet de remplacer les commandes WRKSPLF par                  
// L'explorateur de spool ACS                                                  
// ici le javabundle est dans \Users\Public\IBM\ClientSolutions\               
//                                                                             
dcl-s cmd  CHAR(1024) ;                                                        
// démarrage de PCO                                                            
cmd ='STRPCO' ;                                                                
 exec sql call qsys2.qcmdexc(:cmd) ;                                           
// Démarrage de l'explorer de spools                                           
cmd =' +                                                                       
STRPCCMD PCCMD(''java -jar C:\Users\Public\IBM\ClientSolutions\acsbundle.jar + 
/PLUGIN=splf /system=neptune +                                                 
Picked up _JAVA_OPTIONS: -Djava.net.preferIPv4Stack=true'') PAUSE(*NO)' ;      
 exec sql                                                                      
 call qsys2.qcmdexc(:cmd) ;                                                    
 *inlr= *on ;                                                                  

On a fixé le répertoire du programme ici \Users\Public\IBM\ClientSolutions\

Si vous lancez ce programme, vous ouvrez alors l’écran ACS de gestion des spools, il est possible que cela vous redemande le mot de passe en fonction de votre paramétrage.

Un programme pour Associer à la commande WRKSPLF

Si vous voulez automatiser, vous pouvez utiliser un programme d’exit sur l’exit point QIBM_QCA_CHG_COMMAND

PGM PARM(&COMMAND)                                                               
/* ADDEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND) FORMAT(CHGC0100) PGMNBR(1) PGM(GDATA/WRKSPLFAC1) */ 
/*  PGMDTA(*JOB 20 'WRKSPLF   QSYSGAIA ')   */                    
DCL VAR(&COMMAND) TYPE(*CHAR) LEN(256)                                           
DCL VAR(&Cmdibm ) TYPE(*CHAR) LEN(20)                                            
chgvar &cmdibm %sst(&COMMAND 29 20)                                              
             IF         COND(&CMDIBM *EQ 'WRKSPLF   QSYSGAIA') THEN(DO)          
             CALL       PGM(WRKSPLFACS)                                          
             ENDDO                                                               
RETURN                                                                           
ENDPGM                                                                           

Vous avez la commande ADDEXITPGM pour ajouter un programme d’exit , vous pouvez également passer par la commande ==>WRKREGINF et faire l’option 8

Remarque :

Vous pouvez comme ici mettre une commande WRKSPLF dans une bibliothèque avant QSYS, qui vous permettra de bien gérer que les interactifs et de bypasser si besoin en faisant ==>QSYS/WRKSPLF .

Vous aurez intérêt a identifier les utilisateurs qui doivent bénéficier de la fonctionnalité, une solution très simple c’est l’utilisation d’une liste d’autorisation

, , Utilisez DRDA sur #IBMi

Dans ACS vous avez des exemples comme si dessous

Vous indiquer le nom de votre base de données distantes et vous exécuter votre requête sur le système distant.

derrière cette requête ce cache un protocole nommé DRDA , comme ODBC il permet de ce connecté à une base de donnée distante.

Nous allons voir comment le mettre en œuvre .

sur le système source
Vous devez créer une entrée pour la base de données

le plus simple c’est de passer par la commande WRBRDBDIRE , vous ajouterez une connexion IP à votre système distant.

Sur le système cible
Vous devez paramétrer le service par la commande CHGDDMTCPA , il faut avoir le même mode d’authentification que la base de données distante, par défaut user + mot de passe
vous devez démarrer le service STRTCPSVR *DDM

voila c’est tout
vous pouvez à partir de votre système source faire un connect SQL sur votre système cible si vous avez un mot de passe.

Si vous ne voulez pas renseigner de mot de passe comme dans les exemples ACS vous allez devoir utiliser sur votre système source les postes poste d’authentification serveur.
Pour les ajouter vous avez la commande ADDSVRAUTE, vous devrez également avoir mis la valeur système QRETSVRSEC à ‘1’ pour que vos mots de passe soit enregistrés

il est conseillé d’ajouter un poste générique, par exemple QDDMDRDASERVER en indiquant un user et un mot de passe du système cible !

il n’y a pas de commande WRKSRVAUTE mais vous pouvez en trouver une ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/

Exemple :

A partir de ce moment la mot de passe sera passé directement.

Vous pouvez facilement, par des services sql comparer 2 partitions (valeurs systèmes, fonctions , etc …)

Remarques

Les noms doivent être en majuscule
il est conseillé de mettre un programme d’exit de contrôle
Attention, vous pouvez vous connecter avec un utilisateur *disabled
Les fichier DDM sur IP s’appuient sur cette technologie

, Prompt override program

Le programme de substitution d’invite (prompt override program) vous permet de pouvoir précharger les valeurs d’une commande afin de pouvoir modifier les paramètres existants. Comme les commandes CHGUSRPRF, CHGCMD etc…

Dans mon exemple, j’ai créé une commande CHGCLIENT afin de pouvoir modifier le libellé et le pays d’un client. Je veux que l’utilisateur saisisse le numéro du client et que ma commande récupère les valeurs actuelles. On est d’accord qu’il faudrait rajouter plus de contrôles mais c’est pour montrer le fonctionnement.

Tout d’abord il faut créer la commande en précisant le mot clé KEYPARM(*YES) sur les paramètres clé.

Ecrire ensuite le programme de récupération des données du client (CHGCLIENTO). Dans mon exemple c’est un programme RPG mais vous pouvez faire un programme CL.

Il doit recevoir en paramètres :
1. Le nom de la commande (alpha de 10)
2. Les paramètres clés (numéro client pour moi)
3. La suite des paramètres de la commande (LIBELLE et PAYS). Il faudra préciser la taille du paramètre en hexa en début de variable.

Ecrire le programme de traitement de la commande (CHGCLIENT).

Il ne vous restera plus qu’à créer votre commande en précisant le paramètre PMTOVRPGM

Exemple : CRTCMD CMD(CURLIB/CHGCLIENT) PGM(CURLIB/CHGCLIENT) TEXT(‘Modification client’) PMTOVRPGM(*CURLIB/CHGCLIENTO)

Au lancement de la commande, vous saisissez le numéro du client et les autres informations seront chargées.

, , , Convertir un SAVF en PF

il faut savoir qu’un fichier SAVF est un fichier PF de 528 de long.

Vous pouvez avoir besoin pour différentes raisons de convertir SAVF en PF pour manipuler plus simplement par SQL, pour contourner des restrictions d’utilisations etc ..

Vous trouverez ici 2 commandes qui vont vous permettent de réaliser cette opération : https://github.com/Plberthoin/PLB/tree/master/CPYSAVF

Copier un SAVF dans un PF

Voir le PF

Copier un PF dans un SAVF

Voir le Résultat

Pour voir ce résultat taper la commande DSPSAVF , Voir WRKSAVF si vous avez installez notre outil

Remarque :

Outil simple mais efficace qui peut rendre des services à des administrateurs

, Utilisez un booléen dans une commande

Voici un exemple classique, vous devez définir dans vos commandes, un paramètre qui peut prendre comme valeur oui ou non par exemple

Généralement vous allez faire comme ceci

dans la commande

PARM KWD(CRTFILE) TYPE(CHAR) LEN(4) RSTD(YES) +
DFT(NO) VALUES(NO *YES) PROMPT('Création du +
fichier')


dans le programme

         PGM        PARM(.... &CRTFILE)
/* Paramètres */
//
DCL &CRTFILE *CHAR 4
//
IF COND(&CRTFILE = '*YES' ) THEN(DO)
//
ENDDO

Voici une solution en utilisant un booléen dans le programme

dans la commande

        PARM       KWD(CRTFILE) TYPE(*CHAR) LEN(4) RSTD(*YES) + 
                     DFT(*NO) VALUES(*NO *YES) SPCVAL(('*YES' + 
                     '1') ('*NO' '0')) PROMPT('Création du +    
                     fichier')                                  

dans le programme

         PGM        PARM(.... &CRTFILE)
/* Paramètres */
//
DCL &CRTFILE *LGL
//
IF COND(&CRTFILE) THEN(DO)
//
ENDDO

L’astuce consiste à indiquer une valeur à renvoyer dans la commande ici on se borne à ‘0’ et ‘1’ ce qui peut être interprété par votre programme comme un booléen

L’intérêt d’utiliser un booléen c’est d’avoir un code simplifier , un peu comme les indicateurs qui simplifient la lecture d’un code RPGLE ou CLLE

Vous avez tous trop de SAVF sur vos systèmes voici une commande qui va vous aider à les manager : WRKSAVFD. Bibliothèque : Confirmer si suppression : Une option 5 : Gérer vous envoi sur la commande précédemment expliquée ici . Vous trouverez les sources sur le GitHub Gaia-Mini-Systemes .

Il existe une commande DSPSAVF qui permet de visualiser le contenu d’un Save File (SAVF), elle est très utile et nous nous sommes demandés si nous pouvions améliorer son ergonomie. Depuis l’intégration des Technical Release 7.5 TR2 et 7.4 TR8, de nouvelles vues et tables de fonctions permettent d’obtenir des informations à propos des SAVF […]