EXCEL et L’IBM i - lescahiersdelibmi.fr · II. Procédure Externe en RPG avec tableau qui reçoit...
Transcript of EXCEL et L’IBM i - lescahiersdelibmi.fr · II. Procédure Externe en RPG avec tableau qui reçoit...
EXCEL et L’IBM i
Patrick THOMAS
Les cahiers de L’IBMi
Je parcours souvent les forums « IBM i » et les questions récurrentes sont relatives à la
« remontée » de données dans Excel.
Si l’on n’est pas doté d’outils de reporting ou de BI comme DB2 Web Query, les tableurs
restent des outils relativement efficaces pour présenter les données issues de l’IBM i sous
forme de rapport ou sous forme graphique.
Il y a des dizaines de façons de « remonter » des données sous Excel :
- le CPYTOIMPF pour copier des tables en CSV dans des répertoires partagés Windows,
- les transferts « Client Access » depuis l’émulateur, ou depuis le plug-in Excel,
- System i Navigator,
- iSeries Access for the Web
- etc…
Nous étudierons ici uniquement les possibilités d’Excel afin d’extraire des données de l’IBM i
ou d’appeler des programmes RPG ou SQL (procédures stockées) pour récupérer des
données.
EXCEL étant un outil Microsoft Office, l’extraction des données se fera avec des outils
Microsoft tel ODBC qu’il faudra configurer. Il est à noter, que le driver ODBC pour l’IBM i est
installé par défaut lorsque vous installez Client/Access sur un poste de travail. Il s’agit donc
d’un prérequis pour faire fonctionner tous les exemples suivants.
Je vous livre dans cet Article six différents classeurs Excel dont certains contiennent du VBA
(dont je suis loin d’être un spécialiste).
1) Extractions à partir d’une requête SQL statique
� Excel_01_SQL Statique.xls
2) Extractions à partir d’une requête SQL dynamique (VBA)
� Excel_02_SQL_Dynamique.xls
3) Extractions à partir de MS QUERY avec création de paramètres
� Excel_03_SQL_MSQUERY.xls
4) Appel d’une procédure stockée en VBA
� Excel_04_Procedure_VBA.xls
5) Appel d’un procédure stockée avec MS QUERY
� Excel_05_Procecudre_MSQUERY.xls
6) Récupération de BLOB (images, photos) en VBA
� Excel_06_BLOB.xls
Pour faire fonctionner ces feuilles, il faudra au préalable préparer l’environnement
d’exécution, c’est à dire :
���� Créer un jeu d’essai de données sur l’IBM i (sur lequel baser nos exemples)
���� Créer une source de donnée ODBC (Client Access doit avoir été préalablement
installé)
���� Créer une procédure stockée (pour faire fonctionner les classeurs Excel N°4 et N° 5)
Pour cette étape, vous aurez la possibilité au choix de créer 3 procédures différentes :
o Procédure SQL,
o Procédure Externe RPG basée sur un tableau
o Procédure Externe RPG basée sur un curseur SQL
Préparation de l’environnement
���� Création d’un jeu d’essai de données sur votre système
Pour préparer un jeu de données standard sur lequel nous allons appuyer nos exemples,
allez au choix : sous STRSQL ou sur l’exécution de script iSeries Navigator et tapez :
CALL CREATE_SQL_SAMPLE(‘JEUDESSAI’)
� DB2 est livré en standard avec une procédure stockée qui créé entre autre un fichier
EMPLOYEE dans le schéma (bibliothèque) passé en paramètre. Ainsi une bibliothèque
JEUDESSAI sera créée sur votre système que vous pourrez supprimer à la fin de ce tutorial.
Les données crées par cette procédure stockée ressemblent à ceci (organigramme de
Database Navigator)
Vue depuis l’Organigramme
Database Navigator dans
Systemi Navigator
���� Création du driver ODBC
Allez dans le panneau de configuration Windows, puis Outils d’Administration afin de
configurer les sources de données ODBC ou tout simplement « Démarrer, Exécuter, ODBC ».
Ajoutez une nouvelle source de donnée, en choisissant "iSeries Access ODBC Driver" ou
éventuellement "Client Access ODBC Driver" (un peu moins rapide).
Nom de la source : « IBMi » et choisissez le système sur lequel vous voulez que ce driver
"pointe" (en sélectionnant votre serveur dans la liste proposée).
Dans l’onglet serveur, vous pouvez
éventuellement affecter une liste des
bibliothèques. Les noms de
bibliothèques peuvent être séparés par
des virgules ou des espaces.
Pour ajouter des bibliothèques à la liste
des bibliothèques utilisateur existante,
ajoutez *USRLIBL dans la liste des
bibliothèques.
Dans la convention d'appellation SQL, un point est inséré entre les noms de bibliothèque (schémas) et de fichier (tables).
���� Création et Déclaration de la procédure stockée.
Cette étape n’est utile que pour tester les classeurs Excel N°4 et N°5 qui appellent une
procédure stockée sur l’IBM i (un programme RPG ou SQL).
Je vous propose de créer au choix l’une des 3 procédures ci-dessous.
Au préalable, créez un membre source SOURCES dans JEUDESSAI :
I. Procédure en SQL qui reçoit deux paramètres et renvoie un result-set.
Créez un nouveau membre ex : PROCEDURE1 dans JEUDESSAI/SOURCES avec le code
ci-dessous :
Puis lancer le script avec la commande ci-dessous :
DROP PROCEDURE JEUDESSAI.PROSTOCK; CREATE PROCEDURE JEUDESSAI.PROSTOCK ( IN SERVICE VARCHAR(3), IN SEXE VARCHAR(1) ) DYNAMIC RESULT SETS 1 LANGUAGE SQL NOT DETERMINISTIC BEGIN DECLARE C1 CURSOR WITH RETURN FOR SELECT WORKDEPT, EMPNO, FIRSTNME, LASTNAME, SEX, SALARY FROM JEUDESSAI . EMPLOYEE WHERE (WORKDEPT = SERVICE OR SERVICE = ' ') AND (SEX = SEXE OR SEXE = ' ') ORDER BY EMPNO ; OPEN C1 ; END ;
CRTSRCPF FILE(JEUDESSAI/SOURCES) RCDLEN(112)
STRSEU SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROCEDURE1) TYPE(SQL)
RUNSQLSTM SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROCEDURE1) COMMIT(*NONE) NAMING(*SQL) ERRLVL(20)
II. Procédure Externe en RPG avec tableau qui reçoit deux paramètres et renvoie un
result-set.
Créez un nouveau membre ex : PROC2RPG dans JEUDESSAI/SOURCES avec le code
RPG ci-dessous :
h DftActGrp(*no) ActGrp(*caller)
H usrprf(*owner) AlwNull(*inputonly)
H option(*srcstmt : *nodebugio)
femployee if e disk extfile('JEUDESSAI/EMPLOYEE')
f rename (employee : empF)
f usropn
d Matrice ds Qualified Dim(999)
d Service 3
d Matricule 6
d Prenom 20 Varying
d Nom 20 Varying
d Sexe 1
d Salaire 11S 2
d i s 10i 0 inz(0)
*‚------------------------------------------------------------------------
*‚Paramètres de la procédure stockée ----
*‚------------------------------------------------------------------------
d $entry pr extpgm('PROC2RPG')
d 3 Varying
d 1 Varying
d $entry pi
d Parm1 3 Varying
d Parm2 1 Varying
//---------------------------------------------------------------
/free
Open Employee;
Reset i;
Read EmpF;
Dow i <= 999 and not %eof;
If ( Parm1 = WORKDEPT or Parm1 = *blanks )
and ( Parm2 = SEX or Parm2 = *blanks );
i += 1;
Matrice(i).Service = WORKDEPT;
Matrice(i).Matricule = EMPNO ;
Matrice(i).Prenom = FIRSTNME;
Matrice(i).Nom = LASTNAME;
Matrice(i).Sexe = SEX ;
Matrice(i).Salaire = SALARY ;
EndIf;
Read EmpF ;
EndDo;
Exec SQL
Set Result Sets ARRAY :Matrice FOR :i ROWS;
Close Employee;
return;
STRSEU SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROC2RPG) TYPE(SQLRPGLE)
Compilez ce programme a l’aide de l’option 14 de PDM ou utilisez la commande ci-
après :
Il faut maintenant déclarer ce programme RPG en tant que procédure stockée dans
les références croisées DB2. Pour ce faire, créez un nouveau membre ex :
PROCEDURE2 dans JEUDESSAI/SOURCES avec le code ci-dessous :
Puis lancer le script avec la commande ci-dessous :
RUNSQLSTM SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROCEDURE2) COMMIT(*NONE) NAMING(*SQL) ERRLVL(20)
CRTSQLRPGI OBJ(JEUDESSAI/PROC2RPG) SRCFILE(JEUDESSAI/SOURCES) COMMIT(*NONE)
DROP PROCEDURE JEUDESSAI.PROSTOCK; CREATE PROCEDURE JEUDESSAI.PROSTOCK ( IN SERVICE VARCHAR(3), IN SEXE VARCHAR(1) ) RESULT SETS 1 LANGUAGE RPGLE NOT DETERMINISTIC CALLED ON NULL INPUT EXTERNAL NAME JEUDESSAI.PROC2RPG SPECIFIC PROSTOCK PARAMETER STYLE GENERAL;
STRSEU SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROCEDURE2) TYPE(SQL)
III. Procédure Externe en RPG avec curseur SQL qui reçoit deux paramètres et renvoie
un result-set à partir d’une requête.
Créez un nouveau membre ex : PROC3RPG dans JEUDESSAI/SOURCES avec le code
RPG ci-dessous :
Compilez ce programme a l’aide de l’option 14 de PDM ou utilisez la commande ci-
après :
Il faut maintenant déclarer ce programme RPG en tant que procédure stockée dans
les références croisées DB2. Pour ce faire, créez un nouveau membre ex :
PROCEDURE3 dans JEUDESSAI/SOURCES avec le code ci-dessous :
h DftActGrp(*no) ActGrp(*caller)
H usrprf(*owner) AlwNull(*inputonly)
H option(*srcstmt : *nodebugio)
*‚------------------------------------------------------------------------
*‚Paramètres de la procédure stockée ----
*‚------------------------------------------------------------------------
d $entry pr extpgm('PROC3RPG')
d 3 Varying
d 1 Varying
d $entry pi
d Parm1 3 Varying
d Parm2 1 Varying
//---------------------------------------------------------------
/free
// On peut imaginer que ce RPG créé un fichier de travail
// et renvoie avec un SELECT * FROM QTEMP/.... ce fichier.
Exec SQL Set Option NAMING=*SQL, COMMIT=*NONE;
Exec SQL
Declare C1 cursor with return to client for
Select Workdept Service,
Empno Mat,
Lastname Nom,
Firstnme Prenom,
Sex Sexe,
Salary Salaire
From Jeudessai.Employee
Where (Workdept = :Parm1 or :Parm1 = ' ')
and ( Sex = :Parm2 or :Parm2 = ' ');
Exec SQL Close C1;
Exec SQL Open C1;
Exec SQL set result sets cursor C1;
return;
STRSEU SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROC3RPG) TYPE(SQLRPGLE)
CRTSQLRPGI OBJ(JEUDESSAI/PROC3RPG) SRCFILE(JEUDESSAI/SOURCES) COMMIT(*NONE)
Puis lancer le script avec la commande ci-dessous :
RUNSQLSTM SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROCEDURE3) COMMIT(*NONE) NAMING(*SQL) ERRLVL(20)
DROP PROCEDURE JEUDESSAI.PROSTOCK; CREATE PROCEDURE JEUDESSAI.PROSTOCK ( IN SERVICE VARCHAR(3),
IN SEXE VARCHAR(1) ) RESULT SETS 1 LANGUAGE RPGLE NOT DETERMINISTIC CALLED ON NULL INPUT EXTERNAL NAME JEUDESSAI.PROC3RPG SPECIFIC PROSTOCK PARAMETER STYLE GENERAL;
STRSEU SRCFILE(JEUDESSAI/SOURCES) SRCMBR(PROCEDURE3) TYPE(SQL)
Classeurs EXCEL
���� Excel_01_SQL Statique.xls
Dans cette feuille Excel, l’ordre SQL est statique. A l’ouverture de la feuille Excel, les données
sont réactualisées :
Pour visualiser ou modifier la requête, positionnez-vous sur le début de la plage de données
(ici B2) puis dans la barre de menu, choisissez l’onglet « Données », puis clic sur
« Connexion », « Propriétés » puis l’onglet « Définition ».
Dans la chaîne de connexion il suffit de renseigner le nom de « la source de données » et
dans le texte de la commande, la requête SQL désirée.
Cette technique n’offre que très peu d’avantages, en effet, l’utilisateur final doit connaître
SQL s’il désire extraire les données d’une façon sélective.
���� Excel_02_SQL_Dynamique.xls
Dans ce classeur Excel, l’ordre SQL est Dynamique (il est fabriqué à la volée) et variera en
fonction du choix de l’utilisateur. A l’ouverture du classeur, on propose un simple formulaire
à l’utilisateur pour faire deux choix : le choix du sexe et du service à extraire.
Ces listes déroulantes sont alimentées à partir des données de l’IBM i. Ainsi, derrière chaque
liste, une requête SQL a été paramétrée.
Il y aura donc 3 requêtes distinctes dans ce classeur :
A l’ouverture du classeur, le formulaire ci-dessus s’affiche :
Private Sub Workbook_Open()
Formulaire.Show
End Sub
Puis à l’initialisation de ce formulaire ( Private Sub UserForm_Initialize() ) les deux requêtes
ci-dessous sont lancées :
1. Select Distinct sex from Employee
2. Select Deptno, Deptname from Department
DEMANDE L'ACTIVATION DU COMPOSANT MICROSOFT ACTIVEX DATA OBJECT 2.7 ou 2.8 LIBRARY, DEPUIS
MENU "OUTILS" - "RÉFÉRENCES" DE L'ÉDITEUR VISUAL BASIC
La requête SQL est fabriquée dynamiquement en fonction des choix de l’utilisateur :
3. Select * from Employee Where 1=1 and Sex = …. and Workdept = …..
Cette technique demande un minimum de connaissance en développement VBA en plus de
SQL. De plus, il faudra maintenir le code de ces classeurs Excel en fonction des désidératas
des différents utilisateurs.
���� Excel_03_SQL_MSQUERY.xls : MS QUERY et Paramètres
Si, lors de l’installation d’Office, vous avez aussi installé MS QUERY, vous pourrez exécuter
des requêtes Query basées sur le contenu de cellules Excel comme dans l’exemple ci-
dessous.
Il suffit de modifier le contenu de la cellule B3 pour voir s’actualiser notre feuille avec tous les
employés étant dans le service sélectionné.
Etapes de mise en œuvre :
Dans l’onglet Données, positionnez-vous en B4 puis Autres Sources : Microsoft Query.
Microsoft Query va vous proposer les tables, vues (logiques) de votre bibliothèque.
Dans notre exemple, nous allons choisir un LIKE (Commence Par)
Remarquez qu’il ne faut pas mettre le % du LIKE dans MS Query.
Nous pourrions choisir d’autres critères de sélection. Sinon passons aux critères de tri.
Query ajoute en finalité le % du LIKE
dans la requête.
Ce stade est le plus important, il s’agit de mettre en œuvre les paramètres.
Dans MS QUERY vous pourrez mettre des paramètres entre crochets [], ces derniers seront repris
dans Excel. Dans l’exemple ci-dessous nous avons remplacé Comme ‘D%’ par Comme [PARAM1]
A l’exécution, MS QUERY nous demandera de saisir la valeur du paramètre.
Puis renvoyez les données dans Excel (depuis le menu Fichier) et modifiez les propriétés de la
requête.
Cliquez sur le bouton PARAMETRES.
Et cochez « Obtenir la valeur de la cellule suivante » en donnant les références de la cellule
concernée. Ne pas oublier de cocher « Actualiser automatiquement… ». Dès que cette cellule sera
modifiée, les données seront à nouveau extraites.
���� Excel_04_SQL_Procedure.xls
Pour pouvoir utiliser ce classeur ainsi que le suivant, il vous faudra au préalable avoir réalisé
l’étape 3 des préparatifs, c’est-à-dire avoir créé et déclaré au moins une procédure stockée.
Ainsi, on appellera depuis Excel soit un programme SQL soit un programme RPG en lui
passant en paramètre certains choix de l’utilisateur.
Sur le même principe que le classeur N°2, ce travail se fera en VBA.
A l’ouverture du classeur, on propose un simple formulaire à l’utilisateur pour faire deux
choix : le choix du sexe et du service à extraire. Ces listes déroulantes sont alimentées à
partir des données de l’IBM i (derrière chaque liste, une requête SQL a été paramétrée).
Après avoir choisi les critères de sélection, on appelle la procédure stockée en lui passant en
paramètre les valeurs saisies. Côté IBM i c’est notre programme RPG ou SQL qui est appelé
et qui va renvoyer un RESULT-SET en mémoire.
Le but de ce tutorial n’est pas d’expliquer comment utiliser OLE DB en VBA, il y a de
nombreux forums sur le sujet.
���� Excel_05_Procedure_MSQUERY.xls
Pour pouvoir utiliser ce classeur, il vous faudra au préalable avoir réalisé l’étape 3 des
préparatifs, c’est-à-dire avoir créé et déclaré au moins une procédure stockée.
Si, lors de l’installation d’Office, vous avez aussi installé MS QUERY, vous pourrez appeler
des programmes RPG ou SQL (procédures stockées) en leur passant en paramètre le contenu
de cellules Excel. A chaque modification de la cellule, le programme est appelé à nouveau,
les données sont rafraîchies comme montré dans l’exemple ci-dessous.
Dans cet exemple, dès que l’on modifie l’une des cellules jaunes, le programme RPG ou SQL
est appelé, les données sont réactualisées. Il n’y a aucun code VBA.
Procédons étape par étape comme pour le classeur N°3.
Puis sélectionnez n’importe quelle table, ça n’a pas d’importance. Ce que nous cherchons ici,
c’est la possibilité de créer deux paramètres dans Excel, deux paramètres de type
Alphabétique. Car, pour obtenir la possibilité dans Excel d’avoir des paramètres, à ma
connaissance, il faut passer par MS QUERY.
Voici nos deux paramètres créés qui seront utilisables dans Excel.
Ma procédure stockée attend deux paramètres alpha. Je créés donc 2 paramètres dans MS
QUERY de type alphanumérique.
Dans cet exemple nous avons appelé une procédure stockée, mais pour les connaisseurs de
SQL on pourrait imaginer qu’il s’agisse aussi d’une UDTF.
On peut aussi s’appuyer sur des RPGs qui feraient appel à des APIs.
���� Excel_06_SQL_BLOB.xls
DB2 UDB accepte les champs BLOB (binaires) qui peuvent être des photos, mp3, vidéos etc..
Dans cette feuille Excel, les lignes DB2 sont lues une à une à partir d’une requête SQL en
VBA.
La table JEUDESSAI.emp_photo contient des BLOBs. Ils sont chargés dans le répertoire
temporaire de Windows.