, Comment Modifier un spool ?

Vous avez un spool généré et vous voulez le modifier, bien sur si vous pouvez agir avant la génération du spool c’est mieux.

Imaginons que vous ne pouvez pas le faire, voici la procédure en quelques étapes pour réaliser cette opération.

Vous devez créer un fichier qui a la longueur de votre spool + 1

CRTPF QTEMP/SPOOLPF RCDLEN(longueur + 1)

Ensuite vous avez besoin d’identifier votre spool
nom_spool, Numero_job, Utilisateur, Nom_job et numero_spool (souvent , on peut utiliser *LAST)

Vous allez copier votre spool en idiquant bien *FCFC

CPYSPLF FILE(NOM_SPOOL) TOFILE(QTEMP/SPOOLPF)
JOB(NUMERO_JOB/UTILISATEUR/NOM_JOB)
SPLNBR(LAST) CTLCHAR(*FCFC)

Vous pouvez alors modifier votre ficher DB généré, par SQL, DFU ou par programme

Votre fichier est modifié, vous allez devoir le recopier pour regénérer un spool.
D’abord, indiquez que vous avez besoin des caractères de contrôle


OVRPRTF FILE(NOM_SPOOL) CTLCHAR(*FCFC)


Transformation de votre fichier DB en SPOOL


CPYF FROMFILE(QTEMP/SPOOLPF) TOFILE(NOM_SPOOL)

Vous pouvez à nouveau gérer votre spool, exemple pour le changer de file :


CHGSPLFA FILE(NOM_SPOOL) JOB(NUMERO_JOB/UTILISATEUR/NOM_JOB)
SPLNBR(*LAST) OUTQ(TLXOFC/FAX)

Conclusion :

Ca reste du bricolage, mais ca peut dépanner.

, Messages CPF1124 et CPF1164

Quand un travail démarre, il crée dans la log système un message CPF1124 et un message CPF1164 quand il se termine.

C’est comme ca qu’on sait qu’un job à tourné

Mais attention, Il existe des travaux pour lesquels les messages CPF1124 et CPF1164 ne sont pas logués dans QHST : il s’agit des SPAWN jobs.

Les travaux QP0ZSPWP & QP0ZSPWT en sont de bons exemples.

Spawn batch jobs : https://www.ibm.com/docs/en/i/7.4?topic=jobs-spawn-batch

Spawn est une fonction qui crée un nouveau processus de travail (processus enfant) qui hérite de nombreux attributs du processus appelant (processus parent). Un nouveau programme est spécifié et commence à s’exécuter dans le processus enfant. Lorsque vous lancez un travail par lots, vous utilisez un travail parent pour transmettre des arguments et des variables d’environnement au travail enfant. L’API spawn() utilise des travaux batch immédiats, des travaux pré-démarrés ou des travaux batch pré-démarrés.

https://www.ibm.com/docs/en/i/7.4?topic=ssw_ibm_i_74/apis/spawn.htm

https://www.ibm.com/docs/en/i/7.4?topic=programs-example-using-process-related-apis

Ca peut être le cas aussi pour les jobs QCTXDMON (IBM transformer)

plus rigolo

Vous pouvez demander à supprimer ces messages

Pour cela vous devez créer une dtaara QWTFMSG dans QUSRSYS :

CRTDTAARA DTAARA(QUSRSYS/QWTFMSG) TYPE(*CHAR) LEN(14) VALUE(‘CPF1124CPF1164’)

Cette valeur est prise en compte au démarrage de vos sous systémes

elle est globale c’est dommage qu’on ne puisse préciser un sous système

Attention


Beaucoup d’outils d’analyse utilise ces messages pour vérifier le bon traitement d’une tache

Nombre maximum de spools par JOB

Nombre de spools d’un job est fixé globalement par la valeur système QMAXSPLF.
Elle est par défaut à 9999 et le maximum 999999 sont changement ne nécessite pas d’IPL.

Il est possible que pour un job cette valeur soit insuffisante pour un asynchrone par exemple qui est chargé de faire de l’impression.

Vous recevrez le message CPF4167

Vous pouvez augmenter cette limite en utilisant une variable d’environnement QIBM_SP_MAXSPLF

ADDENVVAR ENVVAR(QIBM_SP_MAXSPLF)
VALUE(99999)
LEVEL(*JOB)

Pour voir les variables d’environnement d’un travail WRKENVVAR

OU DSPJOB puis option 22

ou

DSPJOB OPTION(*ENVVAR)

Attention, bien mettre *JOB pour limiter la portée de la modification au travail

Conseil :


Il n’est pas conseillé de changer la valeur système QMAXSPLF qui vous protégé d’un job qui boucle

, Comparer 2 monitors de base de données

Vous avez collecté 2 monitors de base de données, du genre avant après une mise en prod et vous voulez les comparer

La première solution est d’utiliser ACS
SQL Performance Center
Moniteur de performances

Mais vous pouvez faire des opérations assez similaire en utilisant SQL

https://www.ibm.com/docs/en/i/7.4?topic=formats-sql-table

Voici 2 exemples de requêtes

En nombre en ID record

WITH dbmon1 (QQRID, total1) AS (
         SELECT QQRID,
                COUNT(*)
             FROM votrebib.QZGxxxxxx     << monitor 1
             GROUP BY QQRID
     ),
     dbmon2 (QQRID, total2) AS (
         SELECT QQRID,
                COUNT(*)
             FROM votrebib.QZGyyyyyyy     << monitor 2
             GROUP BY QQRID
     )
    SELECT dbmon1.QQRID,
           dbmon1.total1,
           dbmon2.total2
        FROM dbmon1
             JOIN dbmon2
                 ON dbmon1.QQRID = dbmon2.QQRID

En temps d’exécution

WITH dbmon1 (QQRID, total1) AS (
         SELECT QQRID,
                sum(QQETIM - QQsTIM )
             FROM votrebib.QZGxxxxxxx    << monitor 1
             GROUP BY QQRID
     ),
     dbmon2 (QQRID, total2) AS (
         SELECT QQRID,
                 sum(QQETIM - QQsTIM )
             FROM votrebib.QZGyyyyyyyy   << monitor 2 
             GROUP BY QQRID
     )
    SELECT dbmon1.QQRID,
           dbmon1.total1,
           dbmon2.total2
        FROM dbmon1
             JOIN dbmon2
                 ON dbmon1.QQRID = dbmon2.QQRID

Après il vous faudra enquêter sur les différences que vous avez constaté

Exemple :


Avec l’ID , 3002 vous aurez les indexs à créer

, Les instructions SQL d’un profil

Vous voulez récupérer les requêtes SQL exécutées sous une session interactive

Si vous pouvez vous connecter sous le profil c’est relativement simple

Connectez vous sous le profil et sous STRSQL faites <F13>

Vous pouvez indiquer un fichier avec différentes options, le fichier par défaut s’appelle QSQLSESS de QGPL

La difficulté existe, si vous ne pouvez pas vous connecter sous le profil en effet ces informations sont stockées dans le profil.

Pour les voir vous devrez donc utiliser la commande DMPSYSOBJ

Comme ceci

DMPSYSOBJ OBJ(‘ISQLSTvotreuser*’) +
CONTEXT(QRECOVERY) TYPE(19) SUBTYPE(EE)

Vous obtenez un spool QPSRVDMP que vous pourrez analyser

Bien sur vous devez avoir le droit de dumper et le droit sur le profil

Pour vous aider nous avons fait un outil DMPSQLUSR que vous pouvez trouvez ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS

Il n’est pas parfait, mais il produit un fichier SQLLISTE dans QTEMP qui contiendra toutes instructions exécutées

Rappel :

Vous pouvez également retrouver des informations sur l’exécution des requêtes dans des moniteurs DB ou dans le cache SQL.

, TR2 pour la V7R5

Les annonces de la TR2 pour la V7R5 sont sorties

Voici quelques infos sur les nouveauté de la TR

des nouvelles vues SQL
par exemple pour manipuler les fichiers SAVF
QSYS2.SAVE_FILE_INFO
QSYS2.SAVE_FILE_OBJECTS

sur les audits

Nouvelles fonctions table AUDIT_JOURNAL_XX pour analyser les types suivants
AP, AX, OR, PA, PF, PU, RA, RO, and RZ

ZLIB supporté par SQE

Sur DB2 , nouvelles fonctions SQL pour manipuler les dates et les heures

ADD_DAYS scalar function
ADD_HOURS scalar function
ADD_MINUTES scalar function
ADD_SECONDS scalar function
ADD_YEARS scalar function

Mais la principale nouveauté c’est l’arrivée de

Geospatial Analytics dans DB2 , c’est celle de Watson

https://www.ibm.com/docs/en/i/7.5?topic=analytics-best-practices-considerations

Vous voulez une définition regardez ici

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

Ca préfigure de grosses nouveautés en matière d’analyse de données

RDV pour les premiers tests

plus d’informations ici

https://www.ibm.com/support/pages/ibm-i-75-tr2-enhancements

, , Database Information Finder

Si vous n’administré pas au quotidien votre base de données, mais que vous devez intervenir ponctuellement,
Vous avez un lien qui référence les principales opérations à faire et qui peut vous aider

https://www.ibm.com/docs/en/i/7.5?topic=database-information-finder

Vous avez 5 manières de chercher

DB2 tasks
SQL quick reference
DB2 and SQL examples
SQL statements
DB2 topics

Sélectionner l’information dans la liste et faite GO

Nous on utilise souvent la première

DB2 tasks

Vous voulez ajouter une zone, Appuyer vers Go, ca vous emmènera vers des liens qui référencera les opérations à effectuées.

Rappel :

Pour les exemples, vous avez aussi ACS qui en propose une liste

dans exécution de scripts SQL

, Debug avec VSCode

La semaine dernière, Laurent revenait sur les possibilités de débogage avec RDi : https://www.gaia.fr/debug-rdi-conditionner-un-point-darret/

C’est donc l’occasion de voir ce que l’on peut faire maintenant avec VSCode côté débogage.

Nous partons donc du même exemple, même programme, on ne changera que le débogueur :

Considérons une table CLIENTS contenant les colonnes et lignes suivantes :

Le programme PROGTEST lit la tables CLIENTS et exécute la procédure traitement_CLIENTS pour chacun des clients de la table :

Prérequis

Pour déboguer par VSCode, vous devez installer l’extension « IBM i Debug »

Comme vous le voyez ici, cela nécessite des PTF côté serveur.

Côté IBM i, le déboguer ILE spécifique tourne dans PASE est nécessite un certificat pour garantir la confidentialité de la connexion.

L’assistant depuis VSCode permet d’effectuer automatiquement toutes ces actions :

Référence : https://halcyon-tech.github.io/docs/#/pages/developing/debug/debug?id=starting-to-debug

Une fois le service configuré et l’extension installée, il nous faut régler quelques options importantes.

Nous allons retrouver des options à deux endroits :

  • Au niveau de la connexion

Au niveau des options de l’extension :


Déboguer avec VSCode

Il y a plusieurs possibilités dans l’éditeur, nous en choisissons une.

Ouvrez le source du programme à déboguer (on parlera ILE plus tard) :

L’outil vous demande votre mot de passe sur l’IBM i pour valider votre profil, et prompte ensuite la commande d’appel du programme :

Vous basculez alors dans l’affichage du déboguer :

Voyons les outils :

  • affichage des variables

Affiche les variables locales (quand vous êtes dans une procédure, vous ne voyez que les variables locales de la procédures, pas les variables globales du module).

Vous pouvez copier les valeurs, les modifier, ajouter un guet

  • Guet (watch)

Affiche, et permet la saisie, de guets de variables.

  • Pile d’appel

Permet de voir la procédure en cours d’exécution :

L’ordre d’affiche est : procédure / module / programme (de service)

  • Points d’arrêt

Liste les points d’arrêt, permet la création de nouveaux points et la suppression :

  • Contrôle de l’avancement

Permet d’avancer dans le débogage :

Dans l’ordre :
  1. Avancer jusqu’au prochain point d’arrêt (équivalent F12 dans STRDBG)
  2. Avancer et entrer en débogage dans la procédure ou programme appelé (équivalent F22 dans STRDBG)
  3. Continuer jusqu’à ressortir de la procédure en cours
  4. restart : non supporté pour l’IBM i
  5. Arrêt du débogage (équivalent F3 dans STRDBG)
  • Editeur

Identification visuelle de la ligne en cours de débogage (non encore exécutée) :

Point d’arrêt

Pour ajouter un point d’arrêt :

Soit clique gauche dans la marge

Le débogueur s’arrête sur le point d’arrêt au prochain passage.

Les variables modifiées par la dernière instruction sont mises en évidence.

Point d’arrêt conditionné

Commencer par définir le point d’arrêt, puis clique droit -> Editer sur le point :

Puis indiquer votre condition avec la même syntaxe qu’avec STRDBG :

On ne s’arrêtera que lorsque la condition sera vraie !

Par rapport à RDi, le debug de VSCode ne permet pas, pour le moment, les points d’entrée de service ! Il faut donc que VSCode déclenche lui même l’exécution du programme à déboguer ! Gageons la situation évoluera très vite …

Une fois que vous êtes habitués au débogage, regardez les options de couverture de code …