, , Contrôler l’existence d’un fichier stream (IFS)

Voici donc trois exemples de solutions pour tester l’existence d’un fichier dans l’IFS en CL et en SQLRPGLE.
(Il existe d’autres méthodes, mais celles-ci sont les plus simples).

La commande CHKOUT permet de verrouiller un objet, ainsi les autres utilisateurs et travaux ne peuvent plus que le lire ou le copier. Il suffit de monitorer cette commande en attendant le message CPFA0A9 qui indique que le fichier n’existe pas.

Cette méthode est donc utile lorsque l’on souhaite par la même occasion verrouiller l’objet recherché.

Il ne faut pas oublier de déverrouiller l’objet une fois votre opération terminée avec la commande CHKIN.

En SQL et SQLRPGLE, le plus simple reste d’utiliser la fonction table IFS_OBJECT_STATISTICS. Pour s’assurer ne pas tomber sur un répertoire portant le nom du fichier ou autre, il est préférable de renseigner les paramètres subtree_directories et object_type_list (bien entendu en renseignant *DIR si on cherche un répertoire).

Il suffit ensuite de tester le sqlCode, s’il est égal à 100 cela signifie que le fichier est inexistant.

Remarque

Il faut tout de même prendre en compte les droits de l’utilisateur qui réalise ces tests, en fonction de la méthode utilisée, un autre message pourrait être émit ou le fichier pourrait lui apparaitre comme inexistant.

Pour plus de détails

Documentation IBM – CHKOUT : https://www.ibm.com/docs/en/i/7.5?topic=ssw_ibm_i_75/cl/chkout.html
Documentation IBM – CHKIN : https://www.ibm.com/docs/en/i/7.5?topic=ssw_ibm_i_75/cl/chkin.html
Documentation IBM – MOV : https://www.ibm.com/docs/en/i/7.5?topic=ssw_ibm_i_75/cl/mov.html
Documentation IBM – IFS_OBJECT_STATISTICS : https://www.ibm.com/docs/en/i/7.5?topic=services-ifs-object-statistics-table-function
, , , Une commande méconnue FNDSTRPDM2

On utilise de moins en moins PDM et SEU, pour le remplacer par du RDI ou Visual studio code, ce qui est le sens de l’histoire, mais cette commande peut vous aider, surtout si vous ne disposez pas d’outils d’analyse (Arcad, X-Analysis, Grefer, etc…)

Cette commande permet de faire un FNDSTRPDM (option 25 dans la gestion des membres) sur une liste de fichiers sources, FNDSTRPDM étant limité à un seul fichier source par recherche

Vous devez définir la liste des fichiers à analyser
Pour ceci, vous avez un fichier modèle QAUOSR2 dans la bibliothèque QPDA
Il est conseillé de le dupliquer sous un nouveau nom dans votre bibliothèque

C’est un fichier source que vous pouvez éditer facilement par SEU, RDI, VSCODE, ou SQL

Il est composé de 3 zones de 10 caractères

Exemple :

Notre fichier s’appellera souvent FNDSTRPDM2 membre FNDSTRPDM2 et on choisira une bibliothèque.

£lib       £file      £member   
GDATA      QCLSRC     *ALL       
GDATA      QRPGLESRC  *ALL       
GDATA      QDDSSRC    *ALL       
GDATA      QCMDSRC    *ALL
GDATA      QSQLSRC    M* 


Dans les membres vous pouvez indiquer *ALL ou un nom générique

Vous pouvez ensuite lancer la commande de recherche avec le paramétrage que vous désirez

Exemple

FNDSTRPDM2 STRING(DCL)
FILE(GDATA/FNDSTRPDM2)
MBR(FNDSTRPDM2)
OPTION(NONE) PRTMBRLIST(YES)

Ici on a demandé une liste que vous retrouvez dans votre spool, c’est un fichier QPUOPRTF, il y en a un par fichier source

Exemple :

  Nb d'occurrences  . . :   102 
                                 
                          Création  Dernière modif              
  Membre      Type        Date      Date      Heure     Enreg   
  ----------  ----------  --------  --------  --------  ------- 
  AAAA        CLLE        01/07/21  15/01/24  15:28:17  0000006 
  AAAA2       CLLE        10/01/24  16/09/23  10:25:24  0000009 
  AAA1        CLLE        16/05/23  06/06/23  10:24:58  0000017 
  AADB        CLLE        02/01/24  02/01/24  10:59:24  0000005 
  AAPF2CL     CLLE        03/07/23  03/07/23  13:53:03  0000008  
            

Vous pouvez également demandé la liste des enregistrements comportant votre chaine, PRTRCDS(*ALL) vous obtenez également à une autre liste dans vos spools

Exemple :

 Membre  . . . . . . . :   AAAA2                                               
 Type  . . . . . . . . :   CLLE                                                
 Texte . . . . . . . . :   Liste des touches de fonction d'un RPG              
 Longueur d'enreg  . . :   92                                                  
     SEQNBR  *...+....1....+....2....+....3....+....4....+....5....+....6....+...
                          DCL                                                    
          4               DCL        VAR(&TXT) TYPE(*CHAR) LEN(80)               
                          DCL                                                    
          5               DCL        VAR(&id ) TYPE(*CHAR) LEN(7)                
 Nombre d'enregistrements explorés . . . . . . . . :   9                         
 Nombre d'enregistrements à trouver  . . . . . . . :   *ALL                      
 Nombre d'enregistrements trouvés  . . . . . . . . :   2                         
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _   F I N   D U   M E M B R E 

On rencontre 2 usages principalement

Pour rechercher dans tous les sources d’une bibliothèque

£lib       £file      £member   
GDATA      QCLSRC     *ALL       
GDATA      QRPGLESRC  *ALL       
GDATA      QDDSSRC    *ALL       
GDATA      QCMDSRC    *ALL 

Pour rechercher dans tous les sources RPGLE de plusieurs bibliothèques

£lib       £file      £member
GDATA      QRPGLESRC  *ALL   
GDATA1     QRPGLESRC  *ALL       
GDATA2     QRPGLESRC  *ALL       
GDATA3     QRPGLESRC  *ALL 

Remarques :

Vous pouvez facilement générer cette liste dynamiquement si vous le désirez en utilisant SQL et les vues de QSYS2.

Exemple :

INSERT INTO GDATA/FNDSTRPDM2 VALUES((select max(srcseq) + 1 from
gdata/fndstrpdm2), 0, ‘Biblio ‘ concat ‘ ‘ concat
‘Fichier ‘ concat ‘ ‘ concat ‘Membre ‘)

Il existe d’autres solutions pour scanner vos fichier sources, mais celle ci est simple à mettre à œuvre, et vous avez de grande chance d’avoir QPDA sur vos machines.

, , Gérer les *SAVF (WRKSAVF)

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 et de leur contenu.

Nous avons ainsi créé WRKSAVF, une commande qui permet de lister le contenu d’un SAVF (comme DSPSAVF) mais avec des fonctionnalités supplémentaires :

  • Explorer les *SAVF d’une bibliothèque
  • Restaurer directement un objet depuis cette liste

Lors du lancement de la commande WRKSAVF, vous devez choisir le fichier SAVF dans la bibliothèque souhaitée. Si vous souhaitez accéder à la liste des SAVF existants, renseignez *ALL en nom de fichier et nommez votre bibliothèque.


Ensuite, vous n’avez qu’à sélectionner le SAVF de votre choix pour accéder à ses informations essentielles.

C’est à ce moment que la vue QSYS2.SAVE_FILE_INFO nous permet de récupérer des informations importantes telles que:

  • La date à laquelle le SAVF a été sauvegardé.
  • Le nombre d’objets contenus dans ce SAVF.
  • Si les données ont été compressées à la sauvegarde.
  • Etc. (je vous invite à consulter la documentation IBM i, les informations y sont nombreuses).

La deuxième vue qui nous intéresse est QSYS2.SAVE_FILE_OBJECTS, qui nous donne plus d’informations sur l’objet à l’intérieur du SAVF :

  • Le type de l’objet.
  • L’attribut de l’objet.
  • La bibliothèque d’origine de l’objet.
  • Le propriétaire de l’objet.
  • La taille de l’objet.
  • Etc. (ici encore, je vous renvoie à la documentation IBM i pour de plus amples informations ).

Une fois sur l’écran de gestion du contenu d’un SAVF, il vous est possible de filtrer son contenu :

  • Par nom, en indiquant par exemple que vous souhaitez afficher les objets commençant par « TEST »
  • Par type, l’utilisation de F4 vous permet de choisir parmi les types existants pour les objets de ce SAVF ou en saisissant le type voulu.
  • Il est alors possible de restaurer un objet en indiquant l’option 1.

Attention, la bibliothèque de restauration (RSTLIB) choisie par défaut est la bibliothèque de l’objet sauvegardé, il ne vous reste alors qu’à renseigner celle de votre choix pour y restaurer l’objet.

Une fois la demande de restauration exécutée, un message de complétion au pied du SFL vous indiquera :

  • Que tout s’est bien déroulé.
  • Que tout s’est bien déroulé, avec modification de sécurité.
  • Que la restauration a échoué.

Sources disponible : https://github.com/Gaia-Mini-Systemes/GSAVF

, Créer un menu UIM multi-langue

Vous utilisez UIM pour faire vos AIDES et vos menus

Vous voulez avoir une version multi langue sans changer votre panel de groupe

Il n’existe pas de solution dynamique, mais vous pouvez utiliser les fichiers messages, comme pour les commandes et les écrans, à la compile
il vous suffira de mettre en ligne la bibliothèque avec le bon langage

rappel un message est identifié par 7 caractéres xxxnnnn
xxx est est généralement 3 lettres (mais avec des exceptions exemple SQL et SQ2)
nnnn est composé de 4 chiffres

La partie utilisée dans les écrans et les commandes, c’est uniquement le message sur 132 caractères c’est le paramètre MSG()

dans notre exemple :
Nous avons différencié 3 Types de messages pour simplifier
TXT sur la structure du menu
OPT sur le texte des options à afficher
HLP sur les aides d’option à afficher
USR sur les commandes (mais pas utilisé pour l’instant le tag MENUI ne semblant pas admettre de message ) c’est le standard des fichiers de messages associés au menu SDA

Nous avons créer une commande

CRTMNUMOD qui génère ces messages dans le msgf, par défaut c’est un menu de 10 options avec texte en Français

Téléchargeable ici : https://github.com/Plberthoin/PLB/tree/master/GENUIMDSP

Vous obtenez un MSGF comme ceci :

Ensuite vous avez un modèle de menu en PNLGRP qui s’appui sur ce fichier messages

Vous allez devoir le customiser la première fois

1) Vous devez indiquer le fichier message sur le tag PNLGRP


Exemple :
:PNLGRP SUBMSGF=MODELE.

2) Les options sur les tags :MENUI

Exemple :

otion 4 avec un WRKSPLF

:MENUI OPTION=04 ACTION= ‘CMD WRKSPLF’
HELP=’MENU/OPTION04′.

** pour le moment je ne sais pas les mettre dans un fichier message

3) Vous devez ensuite compiler votre menu en précisant le nom du menu et le source

Exemple :

CRTMNU MENU(MALIB/MONMENU)
TYPE(*UIM)
SRCFILE(MALIB/QMNUSRC)

==>GO votremenu

Les identifiants de messages sont remplacés par les textes des messages, si vous avez une version par langue , mettez la bibliothèque de la langue en ligne avant la compile et c’est joué.

Vous pouvez utiliser la même technique sur les panneaux d’aide

Vous pouvez indiquer de nouveaux identifiants si vous avez des textes de plus de 132 caractères

Vous pouvez utiliser des caractères spéciaux pour éviter certains problèmes de syntaxe

&period. pour un « . »

&slr. pour un « / »

&amp. pour un « & »

&colon. pour un :

Documentation de référence ici : https://public.dhe.ibm.com/systems/power/docs/systemi/v6r1/en_US/sc415715.pdf

Pour les traductions vous pouvez même les automatiser en utilisant des webservices type Google , reverso, ou deepl bientôt nous ferons un article sur ce blog

, La bibliothèque QUSRTOOL

C’est une bibliothèque qui contient les sources d’environ 15 outils IBMi, le plus connu est NETS qui permet de gérer les partages en mode 5250.
Elle est développée par Jim Sloan, ce sont les outils TAATOOLS et depuis la version V3.7 ce sont eux qui gérent les licences.

Donc vous pouvez acquérir une licence du produit en vous adressant ici : support@taatool.com

Vous pouvez également avoir une version des outils sur votre machine : en effet avant la version 3.7 IBM distribuait gratuitement ce produit

pour plus d’information c’est ici

https://www.ibm.com/support/pages/qusrtool-status

Pour la gestion des partages, vous avez une explication ici

https://www.ibm.com/support/pages/manage-ibm-i-netserver-without-navigator-go-nets

Dans ce menu vous avez par exemple l’option 12 qui permet de gérer les utilisateurs désactivés, c’est une alternative simple à Navigator for i dans certains cas.

, , , Requêtes SQL dans ACS extraites de Navigator for i

Navigator for i utilise les services SQL, il vous indique les requêtes qui ont été utilisées.

Vous pouvez les rejouer dans ACS exécuteur de scripts.

Voici comment :

Vous avez un bouton SQL qui permet d’accéder à la requête

Par contre quand vous voulez exécuter cette requête, vous avez ce message :

Il vous faut démarrer un service sur ACS pour accepter l’exécution de ces scripts

Vous voyez votre service à l’état démarré

Vous récupérez la requête SQL dans ACS

Voila c’est simple et efficace vous pouvez également copier la requête dans propriétés si vous préférer

, SSH Alternative à PUTTY

Vous cherchez un client SSH et vous avez commencé à toucher les limites de PUTTY ?

Nous en avons testé plusieurs et nous avons bien aimé smarTTY

L’interface est simple et épurée, vous avez les icônes avec les sites que vous avez définis

Vous pouvez utiliser une connexion existante ou définir une nouvelle connexion
il vous demandera les éléments classiques, vous pourrez ensuite passer à un échange de clés pour vous identifier.

Vous avez le choix entre 2 interfaces, j’ai préféré l’interface plus classique, les plus jeunes préféreront le « SMART »

Dans l’interface SMART vous pouvez par exemple éditer directement les fichiers …

Vous pouvez alors saisir vos commandes et travailler comme sur n’importe quelle interface .

Le petit plus que nous avons aimé

C’est le bouton SCP qui est une alternative à Filezilla pour les échanges simples


Vous choisissez le fichier à télécharger


Vous avez une fenêtre qui apparait pour indiquer l’avancement du téléchargement
Vous pouvez suspendre, fermer la fenêtre

Voila , comme on dit à Gaia c’est simple et efficace, vous pouvez le tester

Remarque :

Pour l’intégrer dans ACS vous devez modifier le fichier AcsConfig.properties

Attention de vérifier que vous utiliser bien le bon fichier de configuration plus d’informations ici

https://www.ibm.com/support/pages/node/667125

En résumé vous lancez à partir de ACSBUNDLE.jar vous devrez l’ouvrir et l’éditer manuellement.

, , , Contrôler le nombre de paramètres passés à un programme CL – %PARMS() / CEETSTA
presence_flagSortie*INTVariable de retour : 1 ou 0
arg_numEntrée*INTPosition de la variable à tester

Remarques

Le compte des paramètres pour la arg_num commence à 1
La valeur de retour est un *INT pas un *LGL

Pour plus de détails

Documentation IBM – %PARMS() : https://www.ibm.com/docs/en/i/7.5?topic=procedure-parms-built-in-function
Documentation IBM – CEETSTA : https://www.ibm.com/docs/api/v1/content/ssw_ibm_i_75/apis/CEETSTA.htm
, Surveillez l’état de vos bandes

Vous sauvegardez sur des bandes LTO, et vous voulez savoir si vos bandes sont en bon état,
pour en savoir plus sur les LTO : https://fr.wikipedia.org/wiki/Linear_Tape-Open

La durée de vie théorique d’une bande LTO est donnée pour 30 ans, mais elle dépend beaucoup des conditions d’utilisation et elles peuvent être défectueuses.
Certaines sociétés changent leurs bandes tous les 3 ans.

La bonne pratique c’est de le faire quand vous changez votre POWER en principe tous les 3 à 5 ans.

Mais il peut être important de contrôler l’état de vos supports pour éviter les mauvaises surprises.

Il n’existe pas de service SQL ni de sortie outfile pour l’instant.

Vous allez pouvoir faire une analyse par volume.

C’est vous qui indiquez le nom de volume quand vous formater votre support
INZTAP DEV(TAPXXX) NEWVOL(xxxxxx) vous disposez de 6 caractères

Exemple :
==>INZTAP DEV(TAP01) NEWVOL(LUNDI1) …

La commande qui va vous permettre d’analyser ces volumes est la commande PRTERRLOG
qui va vous générer un spool QPCSMPRT.

En principe vous avez un roulement de bande par semaine.

Vous pouvez contrôler le volume dans le lecteur avant de déclencher une sauvegarde, mais il n’est pas conseillé de la bloquer, vous pouvez remonter un message.

« * Attention bande du LUNDI trouvée dans le lecteur * »

Exemple

Vous devez connaitre le type de votre unité de bande pour utiliser cette commande.

==>DSPDEVD TAP01

==>PRTERRLOG TYPE(VOLSTAT) OUTPUT(PRINT)
VOLTYPE(3580)
VOLSTATTYP(*LIFETIME)

Si vous avez des erreurs il faut remplacer vos bandes.

Pour vous aider à automatiser cette remontée d’information, vous pouvez utiliser notre outil disponible ici :

https://github.com/Plberthoin/PLB/tree/master/SNDVOLSTAT

Remarque :

Il est important :
d’avoir un plan de reprise d’activité suite à un crash
de tester une restauration partielle de temps en temps
de passer la cartouche de nettoyage tous les 6 mois