, Journalisation Bibliothèque STRJRNLIB

Jusqu’en version 7.3, on utilisait une dtaara QFDTJRN qui indiquait comment journaliser les objets de la bibliothèque.

En version 7.4, les informations de journalisation sont inclues dans la description de la bibliothèque et la dtaara QDFTJRN n’est plus utilisée.

Il n’y aura pas d’erreur, juste les nouveaux fichiers ne seront pas journalisés, ce qui peut générer des problèmes plus tard

On peut les voir par la commande
==>DSPLIBD votre_bib puis <F10> Affichage des règles d’héritage

Vous avez une ligne par type d’objets, *FILE, *DTAARA, *DTAQ

Pour les mettre en place, on peut utiliser les commandes suivante
STRJRNLIB démarrer la journalisation
ENDJRNLIB arrêter la journalisation
CHGJRNOBJ *LIB modifier les attributs de journalisation

Exemple :

STRJRNLIB LIB(VOTREBIB)
JRN(VOTREBIB/VOTREJRN)
INHRULES((*FILE *ALLOPR *INCLUDE *BOTH *OPNCLO))

Ici les fichiers seront journalisés, pour toutes les opérations et on gardera l’image avant et après …

Si vous créer une bibliothèque par un create collection en SQL, vous aurez les valeurs suivantes

*FILE *CREATE *INCLUDE *BOTH *OPNCLO

Donc quand vous migrez vers la version 7.4, vous devrez migrer les informations de la dtaara QDFTJRN, vers la description de la bibliothèque.

Si vous êtes en V7R3, vous pouvez anticiper et déjà mettre en oeuvre les règles d’héritage.

Remarque :

Vous pouvez changer les règles d’héritage existantes par la commande
CHGJRNOBJ.

Ces informations ne concerne pas les fichiers journalisés avant la commande STRJRNLIB

Voici un lien ou vous trouverez un outil qui permet de migrer d’une manière à l’autre indispensable si vous passez en V7R4.

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

Superviser QSYSOPR simplement avec un watch !

Il existe beaucoup de techniques pour superviser des files d’attente

La première consiste à faire boucler un robot qui lira les messages par la commande RCVMSG

La deuxième consiste à utiliser une vue SQL AS SERVICE, QSYS2.MESSAGE_QUEUE_INFO en allant boucler dessus

Il en existe d’autres avec des API etc…

J’ai choisi de vous présenter une technique un peu moins connu mais très efficace et très facile à mettre en œuvre, les Watches.

Un watch c’est un peu comme un trigger ou un programme d’exit, on va associer un programme qui se déclenchera sur un événement, ici un message nécessitant une réponse dans la file QSYSOPR.

Vous pouvez voir les sessions de watch actives par la commande
==>WRKWCH WCH(*STRWCH)

Pour démarrer une session c’est la commande STRWCH

dans notre cas on indiquera les paramètres suivants

STRWCH SSNID(ANAWCH)
WCHPGM(ANAWCH)
CALLWCHPGM(WCHEVT) WCHMSG((ALL *NONE *MSGDTA *INQ *GE 00))
WCHMSGQ((QSYS/QSYSOPR))

Ce qui veut dire que quand on a un message avec réponse dans qsysopr lance le programme ANAWCH (attention il devra être en ligne dans la LIBL)

Voici le programme ANAWCH

PGM PARM(&WCHOPTION &SESSIONID &ERROR &EVTDATA)
/—————————————————————–/
/* Ce programme est un watch il avertit quand on a un message dans */

/ *QSYSOPR en attente de réponse , il envoit un mail / /—————————————————————–

/*/ Paramètres recus */

DCL VAR(&WCHOPTION) TYPE(CHAR) LEN(10)
DCL VAR(&SESSIONID) TYPE(CHAR) LEN(10) DCL VAR(&ERROR) TYPE(CHAR) LEN(10)
DCL VAR(&EVTDATA) TYPE(CHAR) LEN(1024) / Variables de travail /

DCL VAR(&MSG) TYPE(CHAR) LEN(173)
DCL VAR(&EMAIL) TYPE(CHAR) LEN(50) value(‘votre@email.fr’)

/*découpage de EVTDATA */

DCL VAR(&MSGID) TYPE(CHAR) STG(DEFINED) LEN(7) + DEFVAR(&EVTDATA 5) DCL VAR(&MSGQ) TYPE(CHAR) STG(DEFINED) LEN(10) + DEFVAR(&EVTDATA 13)

DCL VAR(&MSGQLIB) TYPE(CHAR) STG(DEFINED) + LEN(10) DEFVAR(&EVTDATA 23)

DCL VAR(&MSGKEY) TYPE(CHAR) STG(DEFINED) + LEN(4) DEFVAR(&EVTDATA 387)

ADDLIBLE votrebib

MONMSG CPF0000

/ *Lecture du texte du message */

RCVMSG MSGQ(&MSGQLIB/&MSGQ) MSGKEY(&MSGKEY) + RMV(NO) MSG(&MSG)
/* Envoi d’un mail d’alerte */
SNDSMTPEMM RCP((&mail)) SUBJECT(‘Message avec +
réponse dans qsysopr’) NOTE(&MSG)
CHGVAR VAR(&ERROR) VALUE(‘ ‘)
ENDPGM

Il reçoit 4 paramètres , le plus intéressant est &EVTDATA qui contient la clé du message que vous pourrez alors lire par RCVMSG ça suffit

Pour arrêter la supervision par votre watch c’est la commande


==>ENDWCH SSNID(ANAWCH)

Remarque :


Il est préférable que le programme soit compiler en adoption de droit avec comme propriétaire qsecofr

Si vous envoyez un mail, votre utilisateur doit être inscrit sinon soumettez cette envoi avec un user qui l’est

On pourrait très bien répondre au message par la commande SNDRPY, sur certain messages connus

Comment connaitre les tables ou PF supprimés ?

Sur L’IBMi on a du mal à matérialiser la base de données

Pourtant en gros, elle a un catalogue c’est les fichiers QADB* de QSYS…

Les fichiers SYS* de QSYS2 pointent dessus

On peut les voir par exemple

SELECT *
FROM SYSTABLESTAT where
TABLE_SCHEMA = ‘QSYS’ and TABLE_NAME
like(‘QADB%’)

Ces fichiers sont journalisés sur des journaux qui sont dans QRECOVERY

Les 2 principaux sont :

QDBJRNCOLM qui va contenir les modifications de zones
QDBJRNFILE qui va contenir les modifications de fichiers

Voici comment analyser pour connaitre les fichiers PF ou tables supprimés dans la journée.

Vous devez générer un table à partir de votre journal

DSPJRN JRN(QRECOVERY/QDBJRNFILE)
FROMTIME(votre_date 000001)
OUTPUT(*OUTFILE)
OUTFILE(QTEMP/LISTE1)

Vous devez effectuer cette requête sur le fichier que vous avez généré

SELECT JODATE, JOTIME, substr(joesd, 1, 10) as fichier ,
substr(joesd, 11, 10) as biblio ,
substr(joesd, 31, 10) as User ,
substr(joesd, 91, 2) as type ,
joesd
FROM qtemp/liste1
WHERE JOCODE = ‘R’ and JOENTT = ‘DL’
and substr(joesd, 91, 2) = ‘TB’

Conclusion :

On ne peut pas agir sur les fichiers du catalogue, c’est le système qui les gère, les seules commandes qui permettent d’interagir sur le catalogue sont :

==>RCLDBXREF
==>QSYS/RCLSTG SELECT(*DBXREF)

Par exemple, dans le cas ou vous commencez à avoir des messages sur la base de données, ou un nombre très important d’enregistrements supprimés dans les fichiers du catalogue …

, 5 conseils pour utiliser CPYTOIMPF efficacement

Vous conaissez tous la commande CPYTOIMPF qui va vous permettre de générer un fichier d’exportation, que vous pourrez fournir à un partenaire .

Voici quelques informations complémentaires qui pourront vous aider

1) C’est un moyen simple de centraliser sur L’IBMi des conversions de fichier base de données vers du CSV ou du EXCEL.

Ça vous évitera les .TTO dispatchés partout sur vos environnements Windows et difficiles à maintenir.
L’utilisateur retrouvera ses fichiers dans l’IFS, les bonnes pratiques poussent vers le répertoire /home/votreuser/
L’utilisateur pourra également se faire envoyer son fichier par mail, la commande IBMi native SNDSMTPEMM permettant de joindre une pièce jointe.
Si vous utiliser un outil complémentaire vous pouvez même faire des envois FTP vers des serveurs annexes.

2) Gestion du CCSID

Vous allez avoir à gérer celui du fichier source est celui du fichier cible

Pour le fichier source, il est conseillé si ce n’est pas le cas de forcer un ccsid

Par la commande en début de programme
CHGJOB CCSID(1147) ou 297 pour la France, vous éviterez ainsi les problèmes d’extractions intermédiaires.

L’ennemi c’est le CCSID(65535) qui d’ailleurs va vous poser de plus en plus de problèmes notamment avec les produits Open source.

Pour le fichier cible il vous suffit d’indiquer le paramètre STMFCCSID(*PCASCII) ou 1252 qui est le CCSID de windows par défaut, sur la commande CPYTOIMPF.

Oui on pourrait faire de l’unicode …

3) CSV ou XLS

il y a peu de différence entre un CSV et un XLS que sait produire votre IBMi.

La vérité, elle se joue quand votre utilisateur double clique sur le fichier et qu’il ne s’ouvre pas directement par excel.

voici les paramètres pour un CSV
CPYTOIMPF
TOSTMF(‘xxxx.csv’) +
RCDDLM(CRLF) STRDLM(NONE)
FLDDLM(‘;’)

le fichier s’ouvrira directement dans EXCEL

voici les paramètres pour un EXCEL
CPYTOIMPF
TOSTMF(‘xxxx.XLS’)
RCDDLM(CRLF) STRDLM(NONE)
FLDDLM(‘*TAB’)

Vous pouvez avoir malgrè tout un message à l’ouverture, mais aucune manipulation à faire.

4) Tri du fichier

Vous avez un paramètre qui va vous permettre de trier votre fichier comme un order by SQL

c’est le paramètre ORDERBY , exemple ORDERBY(‘Datecreat desc’) qui triera par ordre de création

5) Entête de colonne

Si vous désirez un entête de colonne, le meilleur compromis c’est de mettre le paramètre ADDCOLNAM(*SQL)

Si vous avez un nom long SQL provenant de votre table, vous aurez ceci

;nom_utilisateur;prenom_utilisateur;dat_naissance
;Berthoin;Pierre-Louis;28-08-1964

Vous aurez ceci, si vous avez un PF

;nomuti;preuti;datnai
;Berthoin;Pierre-Louis;28-08-1964

Il y a toujours la solution de passer par une requête intermédiaire sur les zones vous pourrez indiquer la clause AS .

Par exemple

select numcli as ‘Numero_client’ ….

Conclusion :

La commande CPYTOIMPF est une commande simple pour convertir vos fichiers Base de données.
Elle vous permet de garder la main, un batch de nuit peut générer des extractions, les utilisateurs n’ont pas besoin d’ ODBC, ni de droit sur le fichier d’origine.