, , Utiliser ACS depuis votre IBM i ?

Tout le monde connait ACS en tant que client sur un poste windows , mac , ou linux.

Je rappelle la principale différence avec ses prédécesseurs c’est que 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 3 raisons

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 ou vous l’avez installé et vous exécuter 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 une 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= /temp/liste_options_pdm.xls +
/sql= »Select * from qgpl.qauoopt »‘)

Nous avons packagé un outil (CRTXLSFIC) qui permet de faire ca 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 de transfert 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

, , Utiliser un scripte 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 scripte en utilisant un mot de passe que vous récupérez à l »exécution, pensez bien à supprimer le fichier scripte 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 ,

, 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

, 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 aidez

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’utilisateurs 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 criera 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 provennant 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.

Vous connaissez index advisor, c’est le moteur SQL qui écrit dans le fichier QSYS2/SYSIXADV des suggestions d’index

Vous pouvez l’utiliser
par SQL select * QSYS2/SYSIXADV
par navigator for i
par ACS
Vous avez même des procédures pour automatiser cette gestion

https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/rzajq/rzajqservicesperf.htm

Mais il peut arriver que le fichier soit endommagé, et les commandes IBMi habituelles sont inefficaces sur ce fichier (idem pour RCLDBXREF et RCLSTG).
C’est souvent un verrouillage du fichier QSYS2/SYSIXADV par des jobs QDBSRVxx qui fait planter votre sauvegarde par exemple.

Voici la procédure à suivre
Vous devrez trouver le bon CCSID c’est celui de la zone DBXFIL du fichier QADBXREF
par exemple par SQL en faisant

SELECT « CCSID » FROM SYSCOLUMNS
WHERE COLUMN_NAME = ‘DBXFIL’ and
TABLE_NAME = ‘QADBXREF’

  1. Essayer d’arrêter les jobs QDBSRVxx
  2. ALCOBJ OBJ((QSYS2/SYSIXADV *FILE *EXCL)) CONFLICT(*RQSRLS)
  3. DLTF QSYS2/SYSIXADVIX
  4. DLTF QSYS2/CONDIDXA
  5. DLTF QSYS2/SYSIXADV
  6. CHGJOB CCSID(zz)
  7. CALL QSYS/QSQSYSIBM
  8. CALL QSYS/QSQIBMCHK

Si vous n’arrivez pas, allouer le fichier.
Vous allez devoir arrêter index advisor en ajoutant une variable d’environnement
ADDENVVAR ENVVAR(QIBM_NO_INDEX_ADVICE) VALUE( ») LEVEL(SYS) pour que cela soit pris en compte vous devez faire un IPL

Vous devez ensuite refaire la procédure ci dessus attention il faut redémarré index advisor en enlevant la variable d’environnement par

RMVENVVAR ENVVAR(QIBM_NO_INDEX_ADVICE) LEVEL(SYS)
Vous devez refaire un IPL

Pour contrôler, vous pouvez regarder les variables d’environnement

WRKENVVAR ou
par sql
SELECT
CAST(VAR_BNAME AS CHAR(50)) AS Nom_Variable,
VAR_BVALUE AS Valeur_variable,
VAR_CCSID AS CCSID_variable
FROM QSYS2.ENVIRONMENT_VARIABLE_INFO
wHERE VAR_TYPE = ‘SYSTEM’

et ensuite vous surveillez que le fichier QSYS2/SYSIXADV se remplisse de nouvelles suggestions.

Vous avez des exemples d’utilisation dans ACS.

, 5 raisons pour abandonner QDLS

Premiérement, un vitesse de transfert bien moins rapide qu’un fichier classique de l’ifs , en moyenne on mesure des temps de transferts 2,7 fois plus lent sur du ftp .

Deuxièmement, un lien fort avec SNA.
Vous devez être inscrit à la directory SNA pour y accèder.
Vous devez utiliser des commandes spécifiques pour toutes les opérations de manipulation, copie, mise en place de droits, sauvegarde etc…

Troisièmement, une codification très particulière, le nom doit être composé 8 caractères, un point et 3 caractères, les fichiers sont codés en ANSI, qui a l’heure de l’unicode semble bien pauvre.

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

Quatrièmement, de nombreuses restrictions qui apparaissent au file du temps et qui posent des problèmes inutiles

Sur le montage des partages
https://www.ibm.com/support/pages/node/637657

Lié à SMB2 en version 7.3
https://www.ibm.com/support/pages/cannot-save-files-office-qdls-smb2-enabled

Cinquièmement, ce n’est pas le sens de l’histoire et comme SNA en générale , par exemple Anynet ne fonctionne plus en 7.4.
IBM qui poliment indique que c’est stabilisé, mais nul doute que le débranchement n’a jamais été aussi près.

Conseil : Commencez à analyser son utilisation et envisagez sereinement une migration dans l’iFS semble une bonne alternative, et avec un peu d’organisation c’est moins compliqué qu’on le pense …

, , Utiliser Dynamic compound statement avec SQL

Depuis la version 7.1, vous pouvez composer une instruction SQL dynamique c’est assez similaire à une procédure SQL, sauf qu’elle ne créera pas un objet permanent .
Vous trouverez un fichier source QSQLT00000 , SQL COMPOUND DYNAMIC QCMPD00001 dans votre bibliothèque qtemp

Le but :

Vous pouvez l’utiliser pour ajouter une logique aux scripts, mais aussi pour intercepter les erreurs de traitement entre autres.

Par exemple, il n’existe pas d’instruction pour faire un create replace avec la syntaxe create table as(..)with data.

La solution est donc la suivante :

begin
declare continue handler for sqlstate ‘42704’ — fichier existant
begin end ;
drop table qgpl.liste ;
create table qgpl.liste as( select * from qgpl.qauoopt ) with data ;
end ;

42704 étant le sqlstate pour table non trouvée

Voici un deuxième exemple qui permet d’écrire dans un fichier log, si vous avez au moins une PTF à appliquer (CREATE TABLE LOGPTF(TEXT CHAR (132 ) NOT NULL WITH DEFAULT)), le code est placé dans un RUNSQL pour être exécuté dans un CLLE.

Attention aux nombre de quotes ….

DCS peut être utilisé dans tous les environnements :
srcipte SQL par exemple dans ACS
RUNSQLSTM
RUNSQL
SQL embarqué

Il y a plein de possibilités et la limite c’est votre imagination …

lien à connaitre

https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_74/sqlp/rbafydyncompound.htm

La version 1.1.8.3 d’Access Client Solutions apporte une fonctionnalité attendue : complétion SQL !

L’outil cherche pour vous les noms des tables et des colonnes :

  • Gain de temps
  • Plus de faute de frappe (en tout cas sur les noms des tables et colonnes)
  • Pas besoin de connaitre tout votre modèle de donnée par cœur

Regardez notre courte vidéo pour vous faire une idée !

, Comment utiliser plusieurs configurations JDBC avec ACS

Sous ACS dans Exécution de scripts SQL

Vous pouvez être amené à vous connecter à plusieurs partitions IBM i ou avoir plusieurs environnements différents sur une même partition.

ACS permet de gérer plusieurs configurations JDBC en même temps et de pouvoir passer de l’une à l’autre

Pour ce faire, vous devez sélectionner l’onglet connexion puis configuration JDBC

Vous pouvez définir vos configurations, liste de bibliothèques, convention de nommage etc… et une configuration par défaut ..

Pour choisir votre environnement JDBC à la connexion, cliquer sur connexion et Application configuration JDBC vous retrouvez toutes les configurations définies.

C’est bien pratique  pour faire des tests de pouvoir choir son environnement !

Un petit regret quand on est connecté, on ne sait pas quelle configuration JDBC on utilise l’information dans le titre serait bien venue petite RFE à Faire…

, Transférer un objet d’une partition à une autre

Rappel :

Pour transférer un objet (PGM, FICHIER, etc…), vous devez être dans la même version ou sauvegarder en version précédente (limité à 2 niveaux) par exemple en 7.4 vous ne pouvez plus envoyer vers une version 7.1.
Attention, il ne faut pas avoir utilisé des fonctions qui n’existaient pas dans la version cible.
Sur objet sauvegardé si vous ne précisez rien, seul le droit du propriétaire et le droit du public seront transférés, et si le propriétaire n’existe pas sur la cible, votre objet appartiendra à QDFTOWN

Vous avez principalement trop méthodes

La méthode historique c’est object connect.

Cette solution ne fonctionne que en SNA, avec toutes les restrictions que ce la impose.
elle se matérialise par la présence des commandes SAVRST*
cette méthode est très simple mais il ne survivra pas à l’abandon progressif de SNA.

La méthode la plus utilisée aujourd’hui c’est par FTP

 

C’est un protocole applicatif qui lui fonctionne sur TCP/IP.
Cette solution si vous n’avez pas d’outil, nécessite plusieurs manipulations.
vous devez d’abord sauvegarder votre objet dans un fichier de sauvegarde.
Ensuite par FTP vous pourrez faire un put ou un get mais attention vous devrez d’abord passer en BINAIRE.
une fois sur la machine cible vous devrez restaurer votre objet à partir du savf.
récapitulatif des opérations

sur machine source

ibmi–>crtsavf
ibmi–>savobj > SAVF
FTP–>Bin
FTP–>GET ou PUT

sur machine cible

ibmi–>rstobj < SAVF

remarque:

Vous pouvez utiliser simplement une connxion de type ftps
C’est la seule solution qui vous permet de mettre votre objet sous votre pc et d’envoyer le savf par mail.
Mais un usage intensif nécessite des commandes ou des outils d’habillage.

La troisième méthode c’est la moins connu, mais elle très simple d’utilisation c’est par ACS.

il vous faudra avoir ACS sur votre PC.
vous devez choisir dans Général

<Système de fichiers intégré>

sélectionner la bibliothèque qui contient votre objet.

sur l’onglet <Actions> vous avez <envoi>


Vous devrez entrer l’utilisateur distant et le mot de passe


C’est vraiment très simple et en mode graphique sans commande , vous pouvez éventuellement utiliser java pour automatiser cette opération.

Conclusion

Voila les 3 principales méthodes qui existent pour faire vos transferts, on espère que ça vous aura éclairé pour votre choix d’envois et réceptions.