, , , , Utiliser ACS pour produire des fichiers Excel depuis l’IBM i

Access Client Solutions (ACS)

Pour rappel, ACS est le successeur de Client Access et permet toujours les exports de données.

ACS est également un produit entièrement Java, et utilisable en mode ligne de commande.

Il est donc possible de le piloter sur l’IBM i. Pour cela il vous faut :

  • Avoir le produit sous licence 5770JV1 (Java) version 8 ou supérieur
  • Access Client Solutions sur l’IFS (désormais installé via PTF (7.4: SI71900 / 7.3: SI71934 / 7.2: SI71935) dans /QIBM/ProdData/Access/ACS/Base

Exemples

Il est alors possible de provoquer le transfert de données de deux façons :

  • le fichier complet
  • une requête SQL permettant la sélection, transformation, jointure …

Syntaxe :

/PLUGIN=cldownload /system=<system>
                          [/userid=<userid>]
                          {/hostfile=<library/filename> | /sql="statement"}
                          {/clientfile=<path><filename>.<extension> | /display}
                          [/<options>]

    /userid     - user id to use when connecting to the target system
    /hostfile   - Source library and file on the IBM i system for the download
                  e.g. /hostfile=QIWS/QCUSTCDT
    /sql        - specify an SQL statement
                  e.g. /sql="select CUSNUM,LSTNAM,INIT,ZIPCOD from QIWS/QCUSTCDT"
    /clientfile - Target file location for the download.
                  The format of this file will be determined by the specified
                  extension (for example, .csv .ods .xlsx .xlsx)
                  If the file extension is not specified or is of a type
                  not supported, the data will be formatted as a .csv file
    /display    - write the output to the terminal
    
    Valid options are:
       /colheadings=<1/0> - Include column headings as the first row. When specified, the column names will be the heading.
       /usecollabels      - Use column labels for the heading.

Puisque ACS est directement sur votre IBM i, on peut utiliser localhost pour la valeur /system. Cela permet également la portabilité de la commande d’une machine à l’autre.

Pour transférer tout un fichier on utilisera le paramètre /hostfile. Ici sous QSH :

cd /QIBM/ProdData/Access/ACS/Base

java -jar acsbundle.jar
/PLUGIN=cldownload /system=localhost
/hostfile=sqlsample/employee
/clientfile=/home/nb/export/employe.xlsx

Cela produit :

Remarquer le nom de l’onglet.

Pour transférer par une requête SQL :

cd /QIBM/ProdData/Access/ACS/Base

java -jar acsbundle.jar
/PLUGIN=cldownload /system=localhost
/sql="select trim(firstnme) concat ' ' concat trim(lastname), hiredate, current date - hiredate as \"Ancienneté\" from sqlsample.employee" /clientfile=/home/nb/export/employesql.xlsx

Attention à l’échappement des caractères spéciaux …

On obtient :

Des options supplémentaires vous permettent d’affiner la sortie :

  • /colheadings=<1/0> – Inclure ou non l’entête
  • /usecollabels – Utiliser les labels au lieu des noms de colonne

Ces fonctions nécessitent une version de ACS > 1.1.8.6 pour fonctionner correctement.

Comment automatiser ?

Il est relativement simple d’intégrer cette commande Java dans un programme CL. Ici en utilisant /clientfile.

Par exemple avec RUNJVA :

Ou par QSH :

Ici on a paramétré plus d’éléments pour avoir une base de programme plus générique.

Avantages ?

Access Client Solutions permet facilement d’automatiser vos conversions depuis l’IBM i, et non depuis un poste client. Cela rend beaucoup plus naturel l’intégration de ces traitements dans vos chaines, la maitrise des transferts par l’IT et non par les utilisateurs, la maitrise des flux, des versions de produits utilisées etc …

, , Exécuter une action sur une liste SQL service

Vous avez tous compris qu’une grande partie de l’administration de vos IBMi se fera par SQL service.

Pour faire des contrôles, l’accès aux vues est suffisante.

Par exemple, le contrôle du nombre de pages dans une OUTQ :

SELECT sum(TOTAL_PAGES)
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC
where OUTPUT_QUEUE_LIBRARY_NAME = ‘SRCEXPL’ and OUTPUT_QUEUE_NAME = ‘VOTREOUTQ’

Mais pour agir c’est plus compliqué, dans certains cas il existe des procédures pour les DTAQ par exemple.

Mais la plus part du temps, vous devrez passer par une commande système dans ce cas en SQL ; vous pouvez utiliser la procédure cataloguée QCMDEXC.

Elle fonctionne comme l’api du même nom.

Exemple :

Pour épurer l’OUTQ QEZJOBLOG

Call qcmdexc(‘CLROUTQ QEZJOBLOG’)

Mais comment faire pour agir sur une liste sans faire un programme ou une procédure qui lirait un curseur ?

L’astuce est d’utiliser un For et dans le select de générer directement la commande à exécuter

Voici un exemple de script qui déplace les spools des OUTQs, commençant par ACT en mettant en référence utilisateur l’OUTQ d’origine.

les zones SPOOLNAME, JOBNAME, FILENUM, OUTQ_QUEUE_NAME proviennent de la vue.

begin
for
SELECT ‘ chgsplfa FILE(‘ concat SPOOLNAME concat ‘) JOB(‘ concat JOB_NAME concat ‘) SPLNBR(‘ concat char(FILENUM) concat ‘) outq(Votreoutq) save(*yes) usrdta( »’ concat OUTPUT_QUEUE_NAME concat  »’)’ as chgspl
FROM QSYS2.OUTPUT_QUEUE_ENTRIES_BASIC
where OUTPUT_QUEUE_LIBRARY_NAME = ‘Votrelib’ and OUTPUT_QUEUE_NAME like(‘ACT%’)
do
call qcmdexc(CHGSPL);
end for;
end

Conclusions :

Cette solution est souvent utilisée par exemple avec la fonction table OBJECT_STATISTICS.

Exemple :

pour faire la liste des fichiers SAVF

SELECT objname, objlib, ifnull(objtext, ‘ ‘) as objtext
FROM TABLE (QSYS2.OBJECT_STATISTICS(‘ALL’,’FILE’) ) AS X
WHERE OBJATTRIBUTE = ‘SAVF’

La seule limite est qu’il est un peu plus compliqué pour gérer les erreurs sur le qcmdexc …

Bien sûr pour la bible rendez vous sur la page de Scott Forstie

, 5 choses à connaitre sur la notion de membre

1) Qu’est ce qu’un membre ?
Un membre est une notion purement IBM i, il sert à cloisonner les données dans un fichier, l’usage le plus connu c’est les fichiers sources où chaque objet est défini dans un membre.
mais on peut également utiliser cette notion pour des fichiers de données , exemple un fichier client avec un membre par régions pour cloisonner les informations.

Pour choisir le membre, on utilisait la commande ovrdbf
OVRDBF FILE(VOTREFIC) MBR(VOTREMEMBRE) quand vous aviez fini, vous faisiez un DLTOVR

Attention un LF peut pointer sur les données de pluseiurs membre du PF, c’est même la valeur par défaut de la commande,
CRTLF … DTAMBRS(*ALL)

2) Pourquoi utiliser la commande DSPPFM
Parce que c’est la seule commande qui montre les données brutes dans l’ordre réel, en effet SQL pourra faire des modifications de présentation, voire indiquer des erreurs de lectures.
Les touches de fonction F10 et F11 permettent de voir les données en hexadécimal.

3) Pourquoi réorganiser les membres des fichiers.
Quand on supprime un enregistrement dans un fichier donc dans un membre, cet enregistrement est juste tagué comme étant inutilisable.
il y a 2 cas:

  • en DDS, les fichiers sont créés avec le paramètre par défaut reusedlt(no) => un nouvel enregistrement est ajouté à la fin.
  • en SQL, les fichiers sont créés avec le paramètre par défaut reusedlt(yes) => un nouvel enregistrement est ajouté sur la place d’un enregistrement supprimé.

En SQL, on a donc besoin de moins de RGZPFM et surtout, si on a sensiblement le même nombre de créations et de suppressions.

4) Executer une requête sql sur un membre d’un fichier physique

Par défaut SQL s’exécute sur le premier membre crée en effet, il considère qu’il n’y a qu’un membre,
en effet un create table ne permet qu’un membre.

Si vous voulez lire un membre particulier sur un fichier physique multi-membres par SQL, vous devez faire un create alias
exemple :
CREATE ALIAS BIBLIO/NOMALIAS FOR BIBLIO/FICHIER (NOMMEMBRE)

vous utilisez désormais votre alias comme un fichier ou une vue

Select * from BIBLIO/NOMALIAS

Vous pouvez supprimer votre alias
DROP ALIAS BIBLIO/NOMALIAS

5) Avoir des informations sur les membres
il y a 2 solutions, de manière historique en lançant la commande dspfd … TYPE(*MBRLIST)
ou avoir des informations par SQL (on parle de partition …)
Vous avez une vue dans qsys2 qui s’appelle SYSPARTITIONSTAT et qui permet de voir ces informations.

Conclusion :
Utiliser les membres n’est pas le sens de l’histoire
En SQL on utilise des fichiers mono-membre
Pour les sources préférer L’IFS qui vous permettra d’utiliser des outils comme GIT
Mais il serait étonnant que vous n’en rencontriez pas, il faut donc comprendre comment ça marche.

, Comparer le niveau de ptf entre 2 systèmes IBMi

Pour comparer les niveaux de PTF de 2 partitions, vous pouvez utiliser ARE (logiciel 5733ARE).
Mais vous allez devoir l’installer et le paramétrer.

Mais si vous ne l’avez pas installé vous pouvez utiliser Navigator for i.

L’instance admin de htpp doit être démarrée sur votre partition, voici comment faire :

vous devez vous connecter avec un profil qui est *iosyscfg au minimum.

à l’url http://votresys:2004

Une fois connecté vous devez définir vos systèmes distants ou groupe de systèmes.

Après vous allez utiliser l’interface graphique

en choisissant le système à contrôler

il est conseillé de ne pas appliquer mais de faire un IPL sur le système cible.

Vous pouvez choisir les produits

si vous êtes à jour vous obtenez cela

Rappel

Pour envoyer un groupe de PTF sur un système distant vous devez envoyer la description de la PTF, mais aussi les SAVF nécessaires.

, Contrôle des dates de validité de vos certificats

Vous allez utiliser de plus en plus de certificats et la problématique est que les certificats ont des périodes de validité.

Je vous rappelle que vous avez une interface pour gérer ces certificats qui s’appelle DCM accessible à l’adresse, http://votre_systéme:2006/dcm.

La nouvelle interface vous indique par une coloration jaune que votre certificat va expirer et rose pour vous indiquer que votre certificat est expiré.

Mais on ne va pas passer notre temps sur DCM.

Les TR V7R4 Niveau 7 et V7R3 Niveau 18 nous apportent une nouvelle fonction TABLE, QSYS2.CERTIFICATE_INFO() qui va nous permettre d’automatiser un contrôle.
Vous avez des informations à cette adresse, https://www.ibm.com/support/pages/node/6156105
Exemple :
On fixe la date de contrôle à – 1 mois, vous devrez avoir le mot de passe de votre magasin de certificat.

SELECT Substr(CERTIFICATE_LABEL, 1, 50) as label, VALIDITY_END as date_de_fin FROM
TABLE(QSYS2.CERTIFICATE_INFO(CERTIFICATE_STORE_PASSWORD=>’votre mot de passe’))
WHERE VALIDITY_END < CURRENT DATE + 1 MONTH

Pour vous aider on a fait une petite commande CHKCRTDAT qui est disponible sous github à l’adresse, https://github.com/Plberthoin/PLB/tree/master/GTOOLS

Vous pourrez planifier le contrôle de vos certificats, par exemple toutes les semaines.

Attention, il reste une problématique à gérer c’est le passage et le stockage du mot de passe.
Il y a plusieurs écoles, mais une chose est sûre : il doit être crypté au moins une fois.

, , Connaitre les PGMs référencés dans WRKJOBSCDE

Quand vous faites une analyse d’impact pour modifier un ou plusieurs programmes, vous avez besoin de connaitre ceux qui sont utilisés dans le Scheduler de votre IBMi.

Il y a une vue qui vous permet de connaitre la liste des travaux planifiés c’est la vue SCHEDULED_JOB_NAME

Exemple pour savoir si le programme NOM_PGM est utilisé vous pouvez exécuter la requête suivante

SELECT SCHEDULED_JOB_NAME,
UPPER(COMMAND_STRING),
ifnull(DESCRIPTION, ‘*NONE’)
FROM SCHEDULED_JOB_INFO WHERE STATUS <> ‘HELD’
and upper(COMMAND_STRING) like(‘%NOM_PGM%’)

Cette requête va bien pour un programme, mais pour une analyse plus complète ca peut être fastidieux.

Voici comment améliorer la chose, quand vous faites une analyse d’une manière ou d’une autre vous utilisez un fichier qui est le resultat en OUTFILE de la commande DSPPGMREF.

La solution est donc d’ajouter un poste dans ce fichier avec comme type *JOBSCDE et comme programme appelant le nom du travail.

Vous lancerez cet outil (commande REFJOBSCDE) à chaque fois que vous mettrez à jour votre fichier de références par DSPPGMREF

Vous trouverez les sources de cette outil à l’adresse suivante https://github.com/Plberthoin/PLB/tree/master/GTOOLS/

Il existe sans doute d’autres solutions mais celle-ci marche bien.

J’espère que ça vous sera utile .

, , Utiliser ACS depuis votre IBM i ?

Tout le monde connait ACS en tant que client sur un poste Windows, Mac ou Linux.

Je rappelle que la principale différence avec ses prédécesseurs c’est qu’ACS et un client léger et que l’exécutable Java acsbundle.exe suffit pour exécuter une requête.

Vous pouvez l’installer sur votre IBM i, pour les 3 raisons suivantes.

1) La mise à disposition et la mise à jour peut désormais se faire par PTF

Déploiement disponible par PTF V7.3 PTF 5770SS1-SI71934 et après mise à jour de l’exécutable, pratiquement plus d’administration à faire.

2) Le partager avec vos utilisateurs

Vous montez un partage sur le répertoire où vous l’avez installé et vous exécutez acsbundle.exe à partir de ce ce dernier.
Ca marche très bien, vous pouvez faire la mise à jour de tous vos postes en changeant l’exécutable de votre répertoire.
C’est à déconseiller, si vous avez des accès réseaux peut efficaces ou si vous avez des populations nomades qui accèdent à plusieurs IBM i.

3) Pour exécuter des requêtes ACS directement sur l’IBM i

C’est du Java et votre partition sait faire du Java, et vous pouvez lancer des commandes Unix par STRQSH .

La première chose à vérifier c’est que le produit est bien installé sur votre partition.

Par défaut, il se trouve dans le répertoire QIBM/ProdData/Access/ACS/Base/, mais il peut se trouver ailleurs, par exemple dans /home/ qui est souvent monté par NetServer.

Si vous ne l’avez pas utilisé depuis longtemps, il est conseillé de mettre une version ACSBUNDLE.EXE plus récente

En fonction de ce que vous voulez utiliser dans ACS, on parle de plugin

Dans notre exemple on veut créer un fichier xls à partir d’une requête SQL c’est le plugin cldownload

Voici la syntaxe

STRQSH CMD( »java –jar votre_exe_java +
/plugin=cldownload +
/system=votre_systéme +
/clientfile=votre_fichier.xls +
/sql= »votre_requete_sql« ‘)

Exemple :

STRQSH CMD(‘java -jar /QIBM/ProdData/Access/ACS/Base/acsbundle.jar

/plugin=cldownload

/system=NEPTUNE

/clientfile=/tmp/liste_options_pdm.xls

/sql= »Select* from qgpl.qauoopt »‘)

Nous avons packagé un outil (CRTXLSFIC) qui permet de faire ça et vous pouvez le trouver sur Github à l’adresse :

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

Dans le plugin cldownload vous avez des options, par exemple, pour ajouter des entêtes de colonne, /colheadings=1 , etc …
il existe d’autres plugins dans ACS pour exécuter des commandes, exécuter des transferts etc …

Quelques liens intéressants à connaitre

ftp://ftp.software.ibm.com/as400/products/clientaccess/solutions/GettingStarted_en.html
https://www.volubis.fr/news/liens/courshtm/clientaccess/client%20solution_install.html
https://www.ibm.com/support/pages/automating-acs-data-transfer
https://developer.ibm.com/technologies/systems/articles/i-acs-commandline/
https://ibmsystemsmag.com/Power-Systems/02/2020/acs-shipped-with-ibm-i

5 commandes qui manquent à l’ibmi

En utilisant l’IBM i, vous avez sans doute remarqué que des commandes manquent, voici une liste de commandes qui pourraient vous rendre service.

DSPDTAQ

Cette commande permet de voir le contenu d’une DTAQ, sans cette commande vous devez faire un dmpobj et le lire, merci Thierry pour le coup de main.

WRKSAVF

Cette commande permet gérer les SAVFs de votre partition en voyant toutes les bibliothèques, un peu comme wrkjrnrcv allusr/all pour les recepteurs.
Attention les savf q* dans qgpl sont des PTFs.

CHGUSRPWD

Permet de changer le mot de passe d’un autre utilisateur sans être *secadm, l’objet doit être compiler en adoption de droit

CHGNETBIOS

Permet de changer le nom Netbios celui qui est utilisé par NetServer, vous pouvez le voir dans Navigator for i

INIUSRNET

Réinitialisation d’un profil réseau utilisé par NetServer pour les partages

Vous retrouverez les sources de ces outils sur github à l’adresse suivante :

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

, , Utiliser un script SQL pour faire du FTP

On est souvent amené à envoyer des fichiers soit par mail ou par FTP, voici une solution simple en utilisant SQL.

— génération de la table à transférer
create table votrebib.votrefic as (select …) with data;
— conversion en CSV , paramétrage Excel
CL: CPYTOIMPF FROMFILE(votrebib.votrefic)
TOSTMF(votrefic.csv)
STMFCCSID(PCASCII) RCDDLM(CRLF)
STRDLM(NONE) FLDDLM(‘;’) ADDCOLNAM(SQL) ;

— Envoi par mail

cl: SNDSMTPEMM RCP((‘plb@gaia.fr’))
SUBJECT(‘liste du fichier votrefic’)
NOTE(‘Ci-joint le fichier votrefic.csv’)
ATTACH((VOTREFIC.CSV));

— Envoi par ftp

CL: CRTPF FILE(votrebib/FTPSRC) RCDLEN(192) ;
INSERT INTO votrebib/QFTPSRC VALUES(‘User_FTP Mot_de_passe’) ;
INSERT INTO votrebib/QFTPSRC VALUES(‘put votrefic.csv’) ;
INSERT INTO votrebib/QFTPSRC VALUES(‘quit’) ;

–re routage stdin
cl: OVRDBF FILE(INPUT)
TOFILE(votrebib/QFTPSRC) +
OVRSCOPE(*JOB) ;
— lancement ftp
CL: FTP RMTSYS(VOTRE_SYSTEME);
— suppression du fichier de commande FTP
CL: DLTF FILE(votrebib/FTPSRC);

REMARQUE :

Vous pourrez améliorer ce script en utilisant un mot de passe que vous récupérez à l’exécution, pensez bien à supprimer le fichier script FTP même dans QTEMP.

Vous pouvez également demander la log, en re-routant le stdout

Si vous utilisez le mail, l’utilisateur doit être inscrit à smtp.

, 5 choses à savoir sur les logs de votre IBMi

1) Choisir le mode de production

C’est essentiellement fixé par 2 valeurs système

La première valeur système est QLOGOUTPUT

*JOBEND L’historique du travail sera généré par le travail lui-même. Si l’historique du travail ne peut pas générer son propre historique du travail, celui-ci sera généré par un serveur d’historique du travail.

*JOBLOGSVR L’historique du travail sera généré par un serveur d’historique du travail.

*JOBEND est la valeur historique, cette valeur est beaucoup moins performante sur les nouveaux systèmes que *JOBLOGSVR.

Il est donc conseillé de mettre en place la valeur *JOBLOGSVR.

la deuxième valeur système est QJOBMSGQFL
*NOWRAP
La file d’attente de messages du travail ne fait pas l’objet d’un bouclage.

*WRAP
La file d’attente de messages du travail fait l’objet d’un bouclage.

*PRTWRAP
La file d’attente de messages du travail fait l’objet d’un bouclage et les messages écrasés sont imprimés.

il est conseillé pour éviter d’avoir des messages bloquants de mettre *WRAP, ce qui permettra d’avoir les dernières informations loguées.

2) Choisir le niveau de log adapté

C’est les paramètres LOG() LOGCLPGM() du travail. ils sont fixés par JOBD ou par les paramètres de la commande SBMJOB.

On divise généralement en trois les types les travaux de votre IBM i :

  • Les travaux sensibles qui devront avoir le niveau de log maximum

LOG(4 00 SECLVL) LOGCLPGM(YES)

  • Les travaux communs , batchs traditionnels sessions interactives

LOG(3 00 SECLVL) LOGCLPGM(NO)

  • Les travaux qui ne doivent pas avoir de log, pour des questions de sécurité, ou des travaux trop nombreux et souvent très courts

LOG(0 99 NOLIST) LOGCLPGM(NO)

le niveau peut être ajusté par programme, CHGJOB LOG( ) LOGCLPGM( )

3) Choix du mode d’épuration

La meilleur solution est d’utiliser le cleanup standard de la machine.

Vous pouvez voir les paramètres par la commande ==> go cleanup

par l’option 1 vous voyez le paramétrage
si le ménage est possible, l’heure de démarrage et la durée.
Le plus souvent on est réglé à 30 jours.

Pour démarrer le ménage c’est la commande STRCLNUP , il est conseillé de la mettre dans le programme STRUP de votre partition.

Les spools de log sont placés dans l’outq QEZJOBLOG, vous pouvez éventuellement épurer des spools particuliers, le mieux étant de ne pas les produire.

4) Nouveautés de SQL AS A Service

Il y a plusieurs vues, et fonction table qui peuvent, vous aidez, voici les 2 principales :

La fonction table QSYS2.JOBLOG_INFO() permet de voir le contenu d’une joblog.

Exemple :

SELECT * FROM TABLE(QSYS2.JOBLOG_INFO(‘378809/QUSER/QZDASOINIT’)) A

pour voir la log du job identifié

La vue QSYS2.OUTPUT_QUEUE_ENTRIES permet de voir la liste des spools d’une OUTQ.

Exemple

select * from QSYS2.OUTPUT_QUEUE_ENTRIES where OUTPUT_QUEUE_NAME = ‘QEZJOBLOG’

pour voir les spools de l’outq des joblogs

5) Remarques générales

Il est souvent inutile de sauvegarder des spools de log, sauf à avoir une réelle raison … et un moyen de suivi !

Un surveillance quotidienne est plus efficace qu’une recherche hypothétique dans un spool de 10 mois

Attention, un spool qui reste est une place de travail occupé dans la table des travaux.

Vous pouvez décorréler les spools des travaux mais ce n’est pas culturel et ça peut compliquer vos recherches futures.

Attention au programme en mode debug avec du SQL, l’optimiseur rempliera rapidement la log.

L’ILE produit plus de log que l’OPM, c’est normal vous avez un niveau de plus à gérer, ca peut doubler les lignes écrites !!!

Pour avoir une vue de des spools de log, pensez à la commande, WRKJOBLOG

Un travail n’a pas forcément de log , la seule qu’il laisse dans tous les cas c’est un message CPF1124 pour son démarrage et un message CPF1164 pour indiquer sa fin.