Contrôler la taille des résultats de QUERY400

Vous utilisez encore les QUERY/400 et vous souhaitez contrôler la taille du fichier en sortie ? Cette astuce peut vous être utile.

Lorsque vous choisissez en type de sortie un fichier base de données, par défaut, le fichier est taillé en *NOMAX. Il peut arriver qu’avec une mauvaise jointure que l’on atteigne le million d’enregistrements (voir le milliard). Si vous souhaitez limiter la taille de ce fichier en sortie, il vous suffit de créer une DTAARA dans QGPL avec comme nom QQUPRFOPTS puis de définir le nombre d’enregistrements maximum.

Création de la DTAARA :

CRTDTAARA DTAARA(QGPL/QQUPRFOPTS) TYPE(*CHAR) LEN(80)
             TEXT('Query/400 Options') AUT(*USE)    

Définition de la taille :

Dans l’exemple suivant, je choisis de limiter à 10000 enregistrements et de faire 3 incréments de 1000.

CHGDTAARA DTAARA(QGPL/QQUPRFOPTS (56 20))   
   VALUE('     10000 1000   3 ')

A l’exécution du QUERY, j’aurai le message suivant si je dépasse les 13 000 enregistrements :

Message dans QSYSOPR :

L’administrateur pourra donc décider d’augmenter la taille et/ou appeler l’utilisateur pour savoir s’il ne s’est pas trompé dans sa jointure.

Si jamais vous voulez supprimer le blocage temporairement pour un besoin ponctuel, vous pouvez mettre la DTAARA à blanc.

CHGDTAARA DTAARA(QGPL/QQUPRFOPTS *ALL) VALUE(' ')   

, , Ajouter des fichiers à une archive ZIP

Vous connaissez tous la commande CPYTOARCF qui permet de Zipper un fichier

Mais vous ne pouvez pas un fois généré lui ajouter un fichier !

On va essayer de vous aider

Dans les produits opensys vous avez la commande zip

Vous avez ce répertoire dans votre path (similaire à votre *LIBL)
$

echo $PATH
/QOpenSys/pkgs/bin:/usr/bin:.:/QOpenSys/usr/bin
$

Remarque
Vous pouvez le régler par le fichier .profile

https://www.ibm.com/support/pages/setting-path-environment-variable-include-current-working-directory-qshell

Vous pouvez donc zipper sous QSH ou QP2TERM

exemple

$

zip archive.zip analyse.csv
adding: analyse.csv (deflated 84%)
$

et par défaut si vous zippez sur une archive existante il ajoute

zip archive.zip xmlversion.txt
adding: xmlversion.txt (stored 0%)
$

pour voir le résultat

unzip -l archive.zip
Archive: archive.zip
Length Date Time Name
——— ———- —– —-
9934 2019-03-29 23:44 analyse.csv
17 2019-02-13 10:49 xmlversion.txt
——— ——-
9951 2 files
$

Pour vous aider nous proposons une commande ADDTOARCF que vous pouvez retrouver ici
https://github.com/Plberthoin/PLB/tree/master/GTOOLS/
un CLLE + un CMD

Remarque :

Vous pouvez ajouter une un fichier à un zip généré par CPYTOARCF
Par défaut il créera la l’archive
Vous pouvez indiquer des options si elles sont valides dans la commande Zip
Vous avez un fichier stdout.log dans votre répertoire courant

Simple et efficace !

, , Exécuter ACS à partir de votre partition

Vous voulez exécuter ACS à partir de votre IBMI

Exemple : la nouvelle fonction de génération des fichiers XLS

VALUES SYSTOOLS.GENERATE_SPREADSHEET(
PATH_NAME => ‘/home/plb/liste_options.xls’,
FILE_NAME => ‘QAUOOPT’,
LIBRARY_NAME => ‘QGPL’);

Le répertoire /QIBM/ProdData/Access/ACS est en *PUBLIC *EXCLUDE par défaut.
Voici une solution pour ouvrir en gardant la main sur les utilisateurs qui auront droit à cette possibilité

Création de la liste d’autorisation

CRTAUTL AUTL(ACS)
TEXT(‘Exécution ACS sur IBMi’)

On considère que votre installation est par défaut, on applique la liste dessus

CHGAUT OBJ(‘/QIBM/ProdData/Access/ACS’) AUTL(ACS) SUBTREE(*ALL)

Vous pouvez éditer vos utilisateurs

EDTAUTL AUTL(ACS)

Remarque:

Vous pouvez gérer les droits par groupe, mais le plus efficace c’est par utilisateur, vous voyez ainsi qui est autorisé directement.

L’idée n’est pas de rester sur 5250, mais on voit bien que la transition sera longue et pas toujours indolore.
il existe des solutions de rewamping chez plusieurs éditeurs

Mais il existe un produit méconnu chez IBM qui s’appelle IBM i Access – Mobile (5770XH2)

Vous pouvez le télécharger sur le site ESS d’IBM

Voici la procédure à suivre pour l’installer est ici

https://www.ibm.com/support/pages/ibm-i-access-mobile

Une fois votre instance démarrée vous pouvez accèder par l’URL
http://<votre partition>:2011/iamobile/

On se concentrera directement sur la partie 5250 , vous devrez indiquer ce lien

http://<votre partition>:2011/iamobile/iWAStartSession

vous avez un premier écran

puis la mire d’ouverture

et ici un wrkactjob par exemple

Vous avez de nombreuses options d’affichage

Conclusion :

C’est une solution qui peut répondre pour quelques utilisateurs nomades, qui se connectent occasionnellement.
Vous n’avez pas de clients à déployer et vous utilisez des mécanismes de gestion purement #IBMi

, Profil *DISABLED

Souvent j’entends , « Oui le profil existe encore, mais il est désactivé »

Attention, ce status n’est pris en compte que sur certains protocoles , comme 5250 par exemple

Si vous voulez utiliser cette notion sur d’autres protocoles, vous devrez le gérer vous même , voici un exemple pour le protocole DRDA

On va utiliser un programme d’exit, attention pour DRDA c’est dans les attributs réseaux que vous pouvez le déclarer.

Voici la procédure à suivre pour la prise en compte

CHGNETA    DDMACC(EXPLOIT/DRDAEXIT) 
ENDTCPSVR  SERVER(*DDM)             
DLYJOB 30                           
STRTCPSVR  SERVER(*DDM) 

Voici le programme de contrôle DRDAEXIT

pgm parm(&return &data) /*---------------------------------------*/    
/* ce programme vérifie que l'utilisateur de connexion n'est pas */    
/* desactivé                                                     */    
/* Mise en Oeuvre                                                */    
/*           CHGNETA    DDMACC(EXPLOIT/DRDAEXIT)                 */    
/*---------------------------------------------------------------*/    
             DCLPRCOPT  USRPRF(*OWNER)                                 
dcl &return *char 1                                                    
dcl &data *char 200                                                    
dcl &status *char 10                                                   
             DCL        VAR(&USER) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 1)                              
             DCL        VAR(&APP ) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 11)                             
             DCL        VAR(&func) TYPE(*CHAR) STG(*DEFINED) LEN(10) + 
                          DEFVAR(&DATA 21)                             
/* si profil desactivé on refuse */                                    
             RTVUSRPRF  USRPRF(&USER) STATUS(&STATUS)                  
             if cond(&user = '*DISABLED') then(do)                     
             chgvar &return '0' 
             enddo                  
             else do                
             chgvar &return '1'     
             enddo                  
endpgm  

Remarque :

Vous pourrez ajouter d’autres contrôles , par exemple, par rapport au planning d’activation des profils
Votre programme devra être compiler en adoption de droit, avec un profil de droit *SECADM pour avoir droit à la commande RTVUSRPRF

, Intégrité des objets sur votre partition

Sur votre IBMi en version 40 de sécurité, vous pouvez signer vos objets !

Mais, êtes vous sur que tous les objets sur votre machine sont sains

Vous avez une commande qui permet de faire ce contrôle CHKOBJITV.
Demander une sortie, attention ca prendra un certain temps

Exemple :

SBMJOB CMD(CHKOBJITG USRPRF(*ALL) OUTFILE(votre bib/CHKOBJITG))
JOB(CHKOBJITG)
JOBQ(QSYSNOMAX)

Vous pouvez retrouver ces violations c’est la zone aiviol

Sur les programmes , programmes de service etc …

ALTERED – L’objet a été falsifié.
BADSIG – L’objet a une signature numérique qui n’est pas valide.
DMN – Le domaine n’est pas correct pour le type d’objet.
PGMMOD – L’objet exécutable a été falsifié.
BADLIBUPDA – L’attribut de protection de la bibliothèque n’est pas défini correctement.
SCANFSFAIL – L’objet a été analysé par un programme de sortie lié à l’analyse et, au moment de cette dernière demande d’analyse, l’objet a échoué à l’analyse.
Si une violation est enregistrée pour un module de microcode sous licence, le nom de l’objet sera le nom RU à 8 caractères, où le nom RU est le nom d’unité remplaçable du module de microcode sous licence, le nom de la bibliothèque sera vide et le type d’objet sera *LIC. Si une violation de ce type est rencontrée, contactez votre représentant de service pour récupérer.

Sur les fichiers

NOSIG – L’objet peut être signé mais ne possède pas de signature numérique.
NOTCHECKED – L’objet ne peut pas être vérifié, il est en mode débogage, enregistré avec de l’espace de stockage libéré ou compressé.
NOTTRANS – L’objet n’a pas été converti au format actuel ou n’est pas compatible avec la version, la version et le niveau de modification actuels.

Si après votre analyse vous avez des objets ALTERED ou BADSIG essayez de comprendre ce que c’est
Vous aurez beaucoup de NOTTRANS, ils ne sont pas très grave ?

Comment s’en prémunir pour ne plus injecter d’objet non conformes ?

il y a 3 valeurs systèmes à régler

QVFYOBJRST Vérification de l’objet à la restauration

QFRCCVNRST Forçage de la conversion à la restauration

QALWOBJRST Option de restauration des objets sensibles

Voici l’ordre dans lequel , elles s’enchainent

Attention faites des tests

Vous pourrez alors suivre par les audits ces violations
par exemple les types GR,OR,RA,RJ,RO,RP,RQ,RU,RZ sur les restaurations mais pas que …

Conclusion:

Pas de panique, mais on peut trouver des choses bizarres demandez des explications à vos fournisseurs de logiciels
et attention cependant aux objets de domaine *SYSTEM, si vous en avez dans la liste vous devez agir

, Utilisez NFS sur votre IBMi

NFS est un protocole de partage de fichier issu du monde Unix, SMB est celui de windows c’est celui qui est utilisé dans NETSERVER.

https://fr.wikipedia.org/wiki/Network_File_System

Nous allons voir comment l’utiliser NFS sur l’IBMi qui peut être client et serveur par exemple pour partager un fichier d’installation ou de paramétrage.

Sur le serveur

Vous devez démarrer le serveur.

STRNFSSVR SERVER(*ALL)

Vous devez créer le répertoire à exporter

CRTDIR (‘/SHARE_NFS’)

Vous devez monter l’export

Paramétrage dans exports vous avez un fichier

EDTF STMF(‘/etc/exports’)
/SHARE_NFS/URANUS -ro

pour exporter

EXPORTFS

Si tout se passe bien vous aurez ce message :

Demande d’exportation exécutée.
1 postes exportés, 0 postes non exportés.

Vous pouvez être obligé de rajouter des droits sur votre partage :

CHGNFSEXP OPTIONS(‘-I -O RW=,ANON=0’) DIR(‘/SHARE_NFS/URANUS’)

Votre répertoire est maintenant exporté.

Sur le client

Vous devez démarrer le même serveur.

STRNFSSVR SERVER(*ALL)

Vous devez créer un répertoire pour le montage

MKDIR DIR(‘/MNT/NEPTUNE’)

Vous devez faire le montage

MOUNT TYPE(*NFS) MFS(‘NEPTUNE:/SHARE_NFS/URANUS’)
MNTOVRDIR(‘/MNT/NEPTUNE’)

Si tout va bien vous aurez ce message :


Système de fichiers monté.

Vous pouvez contrôler par :

DSPMFSINF OBJ(‘/MNT/NEPTUNE’)

Objet . . . . . . . . . . . . : /MNT/NEPTUNE

Type de système de fichiers . : Syst. de fichiers réseau (NFS)

Taille de bloc . . . . . . . . : 32768
Nombre total de blocs . . . . : 23303175
Blocs libres . . . . . . . . . : 5182808
Nombre maximal de liens à des
objets . . . . . . . . . . . : 32767
Nombre maximal de liens à un
répertoire . . . . . . . . . : 1000000
Longueur maximale d’un
composant de nom de chemin . : 255
Longueur maximale de nom de
chemin . . . . . . . . . . . : Pas de maximum

Pour accéder au fichier par exemple :

wrklnk (‘/mnt/NEPTUNE/*’)

Répertoire . . . . : /mnt/NEPTUNE

Vous pourrez voir votre fichier par 5

Remarque :

Vous pouvez l’utiliser que en serveur ou en client avec un système distant sous Linux le plus souvent.

C’est un protocole très connu par les administrateurs Unix.

Pour échanger entre IBMi, vous pouvez également utiliser QFileSvr.400

, , Nommer un groupe d’activation pour des programmes RPGLE

Vous voulez nommer votre groupe d’activation pour toute une application
donc sans indiquer d’option dans le source qui seraient prioritaires par rapport à votre commande de compile

On va parler ici des BIND c’est l’opération que fait une commande pour compiler le module et l’assembler pour en faire un programme

Pour les sources RPGLE

C’est simple vous avez un paramètre

CRTBNDRPG PGM(GDATA/AAACTGRP)
SRCFILE(GDATA/QRPGLESRC)
SRCMBR(AAACTGRP)
DFTACTGRP(NO) ACTGRP(GAIA) <======== c’est ici

Pour les SQLRPGLE

Vous n’avez pas le paramètre ACTGRP dans la commande CRTSQLRPGI

il faut donc passer par les options de compile c’est le paramètre COMPILEOPT

CRTSQLRPGI OBJ(GDATA/AAACTGRP2)
SRCFILE(GDATA/QRPGLESRC)
SRCMBR(AAACTGRP2)
OBJTYPE(PGM) REPLACE(NO)
COMPILEOPT(‘DFTACTGRP(*NO) ACTGRP(GAIA)’) <====== comme ceci

On est obligé de mettre les 2 paramètres même si DFTACTGRP(*NO) dans le source ????

Attention, il n’y a pas de contrôle de syntaxe sur le paramètre

Remarque

Bien sur mes informations concernent les binds, pour l’assemblage de modules l’option est dans la commande CRTPGM directement

, , , Connaitre la bibliothèque du programme en cours

Vous voulez connaitre la bibliothèque d’un programme en cours d’exécution, pour ajouter cette bibliothèque par exemple, pour contextualiser un exit programme, un watcher, un trigger ou pour limiter un environnement prod, versus dev.
Le tout, sans harcoder une bibliothèque qui figera votre code et vos environnements.

Voici 2 exemples

En RPGLE

dcl-ds *N PSDS ;                  
  bibli_du_pgm CHAR(10) POS(81);  
  nom_du_pgm CHAR(10) POS(1);     
 End-ds ;                          
dcl-s present ind ;
// on tente d'ajouter la bibliothèque
 exec sql                                                                  
 call qcmdexc('Addlible ' concat :bibli_du_pgm concat ' *FIRST') ;         
if sqlcode = 0 ;
  present = *on ;
endif ;
// votre traitement ici
// on enlève si on a ajouté 
if present = *on ;
 exec sql                                                                  
 call qcmdexc('Rmvlible ' concat :bibli_du_pgm ) ;         
endif ;

En CLLE

PGM                                                    
            DCL        VAR(&DATA) TYPE(*CHAR) LEN(80)  
            DCL        VAR(&LIB) TYPE(*CHAR) LEN(10)   
            DCL        VAR(&PGM) TYPE(*CHAR) LEN(10)   
            DCL        VAR(&TEMOIN) TYPE(*LGL)
 /* Paramétrage de l'appel */                          
            CHGVAR     VAR(%BIN(&DATA  1 4)) VALUE(80) 
            CHGVAR     VAR(%BIN(&DATA  5 4)) VALUE(80) 
            CHGVAR     VAR(%BIN(&DATA  9 4)) VALUE( 0) 
            CHGVAR     VAR(%BIN(&DATA 13 4)) VALUE( 0) 
 /* Appel de la procédure */                           
            CALLPRC    PRC('_MATPGMNM') PARM(&DATA)    
 /* Extraction des informations  */                    
            chgvar &pgm %SST(&DATA 51 10)              
            chgvar &lib %SST(&DATA 19 10) 
/* ajout de la bibliothèque */
ADDLIBLE &LIB *FIRST
monmsg cpf2103 exec(do)
chgvar &temoin '1'
enddo 
/* Votre traitement ici */
/* on enlève si on a ajouté */
if cond(*not &temoin) then(do)
RMVLIBLE &LIB
enddo          
ENDPGM          

Remarque :

On a mis également le programme en cours dans les exemples

On a mis le code pour enlever la bibliothèque après le traitement, uniquement si c’est notre programme qui l’a ajouté.


En RPGLE si vous avez un fichier vous devrez déclarer votre fichier en USROPN et ouvrir le fichier par un OPEN, après avoir ajouté la bibliothèque

, CPF2225 sur CHGUSRPRF

Il est possible que vous receviez ce message sur un changement de profil ou sur une suppression (DLTUSRPRF ou CHGUSRPRF)

Ca signifie qu’un autre utilisateur verrouille l’AUT (Authorized User Table) par une autre commande liée à la sécurité.

Cette objet s’appelle QSYUPTBL de la bibliothèque QSYS et il est de Type *AUT.

le premier reflexe serait de faire :

==>

WRKOBJLCK OBJ(QSYS/QSYUPTBL)
OBJTYPE(*AUT)

Mais le type *AUT n’est pas supporté dans la commande (sniff !)

Vous devrez donc passer la commande suivante

==>CALL QTNDSPLS (‘QSYS/QSYUPTBL’ *AUT)

qui vous indiquera qui tient cette table :

Exemple

‘STATUS OF ALL JOBS FOR THE ABOVE SPACE LOCATION:        
                                                         
158965/PLB/QPADEV0001                         LSRD  HELD  

Vous devrez déterminer si c’est normal , sinon il faudra arrêter le travail fautif

Pour en savoir plus :

https://www.ibm.com/support/pages/cpf2225-received-running-security-commands

Remarque :

Vous n’avez pas intérêt à faire tourner 2 process de gestion de profil en même temps