pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #49
Version 6 de IBM i (suite).
Nouveautés du compilateur RPG-IV en V6R10
|
|
|
|
|
|
|
|
Les ordres d'entrée/sortie READ,CHAIN,UPDATE,etc, admettaient un nom de DS résultat dans le cadre d'un fichier décrit en interne. |
|
le mot-clé MAIN en spécif H permet d'indiquer une sous procédure en tant que procédure principale.Cette dernière ne peut être lancée que par CALL. |
|
|
|
|
|
|
|
|
|
|
|
|
|
* une procédure de mise à jour, qui UPDATE la ligne lue par la procédure * principale, le fichier et la DS, sont passés en paramètre. H DFTACTGRP(*NO) ACTGRP(*CALLER) ALWNULL(*USRCTL) FVINS UF E K DISK TEMPLATE QUALIFIED BLOCK(*NO) FVIN2 LIKEFILE(VINS) F EXTFILE('BDVIN1/VINS') Dds_modele DS likerec(vins.vins) TEMPLATE Dmiseajour PR D parm1 LIKEFILE(VINS) D parm2 LIKEDS(ds_modele) DIN DS LIKEDS(ds_modele) |
|
|
|
Source TESTFIL3F H ALWNULL(*USRCTL) FVINS UF E K DISK TEMPLATE QUALIFIED |
|
/free eval out.vin_nom = '(non précisé)' ; update vin_in.vins out; /end-free Pmiseajour E |
IBMi, Integreted Web Application Serveur V7.1
Il s'agit du nouveau serveur d'application intégré à l'OS pour distribuer les applications Java., remplaçant Tomcat, qui n'est plus fourni avec la V6.
Ce serveur support JSF, JSP, servlets et services web, et implique peu de ressources et d'administration, c'est le même que celui utilisé par DB2 WebQUERY, il est basé sur OSGI .
il est disponible déjà en V5R40, tel qu'indiqué par
l'APAR II14318 : PTFs - SI29102 and SI29567 are required for Integrated
Application Server 7.1 enablement which DB2 Web Query uses.
Lancez le serveur d'administration HTTP, si ce n'est déjà fait
par STRTCPSVR *HTTP HTTPSVR(*ADMIN)
Puis loggez vous sur http://<votreas400>:2001/HTTPAdmin/
- nommez le
- Indiquez le premier port IP utilisé par le serveur d'application, qui en utilise 10
- l'assistant créé en même temps un serveur APACHE associé, indiquez le port du serveur (utilisez, si vous pouvez, le port 80)
- le profil utilisateur sous lequel le serveur d'application s'exécute
- une première application, de test, est automatiquement installée
- vous voilà sur l'écran récapitulatif
infos apache,
Cliquez sur Finish, et voilà :
pour installez de nouvelles applications
Manage Installed application, puis Install
- indiquez le fichier WAR (ou WAB) représentant l'application (seul WAS connaît les fichiers EAR)
• le "point de montage"
- le port d'écoute du serveur d'application (sur notre exemple, le défaut est 10041 proposé par l'assistant)
- l'application s'installe
si vous rafraichissez, vous devez voir
Pour installez WebAccess sur un serveur d'application intégré, vous devez :
- Avoir installé le produit 5761XH2, bien sûr.
- Etre au niveau 1 du groupe PTF SF99115 (au niveau 13 de SF99114 si vous êtes en V5R40)
- passez la commande suivante (sous QSH, c'est plus simple)
- CD /QIBM/ProdData/Access/web2/install
- cfgaccweb2 -appsvrtype *INTAPPSVR -instance INTAPPSVR
(ou le nom que vous lui avez donné)
Ce qui doit vous afficher :
Configuring System i Access for web
Preparing to perform the configuration changes
System i Access for web command has completed
- donc, installer l'application Webaccess (cela peut être
long)
Si la commande cfgaccweb2 affiche des erreurs, voyez
- /QIBM/UserData/Access/Web2/logs/cmds.log
- /QIBM/UserData/Access/Web2/logs/cmdstrace.log
- Sinon, essayez l'URL suivante http://<votreas400:10041>/webaccess/iWAHome
, qui doit vous afficher
Détails techniques
- le fichier /www/INTRANET/lwiCreateINTRANET.properties contient la trace de la création par l'assistant
- le contenu de httpd.conf contient ces lignes propres au serveur d'application
intégré
LoadModule mod_ibm_lwi /QSYS.LIB/QHTTPSVR.LIB/QLWIIHSMOD.SRVPGM
LwiPluginConfig /www/INTRANET/conf/lwi-plugin-cfg.xml
< LwiProfile INTRANET>
LwiAssignUserID QLWISVR
LwiAutostartOption StartEnd
LwiStartJobQueue QHTTPSVR/QZHBHTTP HTTPWWW
< /LwiProfile>
- le fichier lwi-plugin-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
< Config RefreshInterval="300">
<Log LogLevel="Error" Name="/www/INTRANET/logs/plugin.log" />
<ServerCluster Name="serverCluster" RetryInterval="60">
<Server ConnectTimeout="0" Name="server1">
<Transport Hostname="localhost" Port="10031" Protocol="http" /> (1)
</Server>
</ServerCluster>
<VirtualHostGroup Name="virtualHosts">
<VirtualHost Name="*:10041" /> (2)
</VirtualHostGroup>
<UriGroup Name="URIgroup">
<Uri Name="/*" /> (3)
</UriGroup>
<Route ServerCluster="serverCluster" UriGroup="URIgroup" VirtualHostGroup="virtualHosts" />
< /Config>
Vous noterez
- le port d'écoute du serveur d'application (10031, ici)
- le port du serveur apache, à modifier si vous modifiez le port d'écoute du serveur apache (80 par exemple)
- les URI ou point de montage :
- /* toutes les requêtes sont transmises au serveur d'application
(serveur apache dédié)
- indiquez , au contraire, des URL, pour conserver le serveur apache pour certaines requêtes
- par exemple:
- <UriGroup Name="URIgroup">
<Uri Name="/RPGMNU/*" />
<Uri Name="/webaccess/*" />
</UriGroup>
SI vous voulez que les serveur apache traite toutes les requêtes, sauf celles commençant par RPGMNU et webaccess
- <UriGroup Name="URIgroup">
- /* toutes les requêtes sont transmises au serveur d'application
(serveur apache dédié)
Le même produit permet de monter un serveur d'application destiné à fournir des services web
en même temps que la création du serveur d'application, vous allez déployer votre premier service web
Ici un programme W_RECAP de BDVIN0, attendant une zone PR_CODE, et retournant
une DS nommée INFOCENTRE,
ce pgm a été compilé avec PGMINFO(*PCML
: *MODULE)
Indiqué le nom publique du service et un texte explicatif
et précisez le sens d'utilisation des paramètres (automatiquement découverts par l'assistant grace à PGMINFO)
Indiquez le profil utilisateur qui lancera le programme
- il doit s'agir d'un profil avec un mot de passe (*NONE provoquera une erreur), qui a des droits sur le programme.
- si vous utilisez l'option server's user ID, vous devez attribuer un mot passe à QWSERVICE
- Si vous modifiez le profil ensuite (c'est possible) il faudra redémarrer le serveur.
indiquez aussi, la liste des bibliothèques à utiliser
et voilà, vérifiez les informations récapitulatives (regardez les ports IP attribués automatiquement)
liste des services (le votre, plus un exemple nommé ConvertTemp)
Les opérations admises
soit les informations que l'on peut demander :
w_recap, les paramètres retour transmis dans l'enveloppe SOAP
w-recap_XML, les données transmises dans un flux XML
Le serveur se crée
Puis, vous basculez automatiquement sur la gestion du serveur d'application de type web services V1.3, cette fois.
Vous pouvez, ici, revenir gérer les servies déployés, ou bien, en déployer de nouveaux.
(properties, permet de changer le profil)
mais surtout, tester votre service web, par le bouton "Test Service"
Choisissez l'opération w_recap ou w_recap_XML), ici w_recap
Ajoutez un paramètre en entrée, PR _CODE est automatiquement proposé et vous ne pourrez l'ajouter qu'une seule fois
puis ajoutez une valeur (là aussi, une seule occurrence, dans ce cas) et cliquez sur GO
la réponse vous est affichée dans la fenêtre Status
Ci dessous, le résultat de w_recap_XML
et le contraire ?
En V6R1, et de manière intégrée au système d'exploitation,
nous avons des mécanismes pour accèder à un service web
depuis le langage RPG (entre autre).
on dit "consommer un service web"...
L'exemple fourni par IBM est basé sur le service ConvertTemp automatiquement créé lors de la création du serveur d'application
Allez sur la page
et récupérez le fichier de définition (WSDL) en cliquant
sur View definition
(sinon, pour cet exemple uniquement , il est déja
présent dans /QIBM/ProdData/OS/WebServices/V/client)
ensuite, il faut générer le "stub" soit le programme "proxy"
pour cela nous utiliserons l'outil WSDL2WS.SH sous shell (STRQSH)
> /QIBM/ProdData/OS/WebServices/V1/Client/bin/wsdl2ws.sh |
- -lc demande à ce que l'on génère du C (par défaut wsdl2ws.sh génère du C++, difficilement utilisable en RPG)
- -o/monrépertoire indique un répertoire de sortie
- /QIBM/...../ConvertTemp.wsld représente les coordonnées du fichier wsdl
Si vous passez la commande ls, vous devez voir :
$ |
Détails du fichier wsdl
Extrait de la définition du service <wsdl:binding name="ConvertTempSOAP11Binding" type="axis2:ConvertTempPortType"> .../... < wsdl:service name="ConvertTemp"> |
les fonctions C importantes et utilisables en RPG, sont liées au type
de port (proche de la notion d'interface en java)
l'outil a généré les fonctions de gestion du "stub" :
- get_ConvertTempPortType_stub : lancement du stub (initialisation)
- destroy_ConvertTempPortType_stub : destruction
- get_ConvertTempPortType_Status : status
- set_ConvertTempPortType_ExceptionHandler : hanlder (routine
de gestion d'erreur)
extern AXISCHANDLE get_ConvertTempPortType_stub(const char* pchEndPointUri);
extern void destroy_ConvertTempPortType_stub(AXISCHANDLE pStub);
extern int get_ConvertTempPortType_Status(AXISCHANDLE pStub);
extern void set_ConvertTempPortType_ExceptionHandler(AXISCHANDLE pStub, AXIS_EXCEPTION_HANDLER_FUNCT fp);
puis les fonctions liées aux opérations il faut passer en paramètre le pointeur recu lors de l'initialisation (de type AXISCHANDLE)
- ConvertTemp : récupération des données sous forme d'une structure
- ConvertTemp_XML : récupération des données sous forme
de flux XML
extern xsdc__string converttemp_XML(AXISCHANDLE pStub, CONVERTTEMPInput* Value0);
extern CONVERTTEMPResult* converttemp(AXISCHANDLE pStub, CONVERTTEMPInput* Value0);
La dernière fonction recoit un pointeur sur une structure de type CONVERTTEMPResult
typedef struct CONVERTTEMPResultTag { |
dont la mémoire est allouée dynamiquement, il faut donc la libérer
par Axis_Delete_CONVERTTEMPResult (voir CONVERTEMPResult.h)
En résumé :
- Initialiser la connexion par get_ConvertTempPortType_stub
- Lancer le service par converttemp
- Libérer la mémoire par Axis_Delete_CONVERTTEMPResult
- libérer la connexion par destroy_ConvertTempPortType
Dans un programme RPG ou nous allons déclarer les fonctions en prototype, puis linker tout ce petit monde...
h DFTNAME(CNVRTTEMP)
*********************************************************************
* *
* IBM Web Services Client for ILE *
* *
* FILE NAME: ConvertTempClient.RPGLE *
* *
* DESCRIPTION: Source for ConvertTemp Web service client *
* *
*--------------------------------------------------------------------
* Prototypes for the service interface and operations
* obtained from ConvertTempPortType.h file.
*--------------------------------------------------------------------
DgetStub PR * ExtProc('get_ConvertTempPortType_stub')
D pEndpoint * Value
*
DConvertTemp PR * ExtProc('converttemp')
D pWsStub * Value
D pTempInF * Value
*
DdestroyStub PR ExtProc('destroy_ConvertTempPortType _stub')
D pWsStub * Value
*--------------------------------------------------------------------
* Prototype for function to free dynamic storage obtained from
* CONVERTTEMPResult.h file.
*--------------------------------------------------------------------
DdestroyResult PR ExtProc('Axis_Delete_CONVERTTEMPResult')
D pResult * Value
D size 9B 0 Value
*--------------------------------------------------------------------
* Input data structure used by the converttemp operation. The structure
* layout is obtained from CONVERTTEMPInput.h file.
*--------------------------------------------------------------------
D Input DS
D pTempInF *
*--------------------------------------------------------------------
* Result returned by converttemp operation. The structure layout
* is obtained from CONVERTTEMPResult.h file.
*--------------------------------------------------------------------
D Result DS BASED(ResultP)
D pTempOutC *
*--------------------------------------------------------------------
* Miscellaneous declarations.
*--------------------------------------------------------------------
D WsStubP S *
D Endpoint S 100A
D TempInF S 10A
D ResultP S *
D OutputText S 50A
*--------------------------------------------------------------------
* Program entry point. The input parameter is a character field
* representing the temperature in Fahrenheit.
*--------------------------------------------------------------------
C *ENTRY PLIST
C PARM TEMPIN 32
*--------------------------------------------------------------------
* Web service logic. The code will attempt to invoke a Web
* service in order to convert temperature in Fahrenheit to Celsius
* and then display the results.
*--------------------------------------------------------------------
/FREE
// Get a Web service stub. The host and port for the endpoint may need
// to be changed to match host and port of Web service. You can pass
// *NULL to getStub() if the endpoint in the WSDL file is correct.
Endpoint = 'http://localhost:10022/web/services/ConvertTemp' + X'00';
WsStubP = getStub(%Addr(Endpoint));
// Initialize input values.
TempInF = %trim(TEMPIN) + X'00';
pTempInF = %addr(TempInF);
// Invoke the ConvertTemp Web service operation.
ResultP = ConvertTemp(WsStubP:%Addr(Input));
// Prepare output string depending on what was returned.
if (ResultP <> *NULL);
OutputText = %str(pTempInF) + ' Fahrenheit is '
+ %str(pTempOutC) + ' Celsius.';
else;
OutputText = 'No results returned...';
endif;
// Display results.
dsply OutputText;
// Clean up storage for the result and the Web service stub.
destroyResult(ResultP:0);
destroyStub(WsStubP);
/END-FREE
*--------------------------------------------------------------------
* Done.
*--------------------------------------------------------------------
C seton lr
Compilation
Placez vous dans votre répertoire (/myConvertTemp) par CD
Copier le fichier ConvertTempClient.RPGLE dans votre répertoire
et pensez à modifier (en rouge) l'URL permettant d'accèder au service web
CRTRPGMOD QTEMP/CVTTEMPCL SRCSTMF(ConvertTempClient.rpgle)
(remarquez la nouveauté V6 permettant de compiler un fichier de l'IFS)CRTCMOD QTEMP/CVTTEMPIN SRCSTMF(ConvertTempInput.c)
INCDIR('/qibm/proddata/os/webservices/v1/client/include') ENUM(*int)
CRTCMOD QTEMP/CVTTEMPRES SRCSTMF(ConvertTempResult.c)
INCDIR('/qibm/proddata/os/webservices/v1/client/include') ENUM(*int)
CRTCMOD QTEMP/CVTTEMPPT SRCSTMF(ConvertTempPortType.c)
INCDIR('/qibm/proddata/os/webservices/v1/client/include') ENUM(*int)
puis
CRTPGM PGM(MABIB/CVTTEMP) MODULE(QTEMP/CVTTEMPCL +
QTEMP/CVTTEMPIN QTEMP/CVTTEMPRES QTEMP/CVTTEMPPT°
BNDSRVPGM(QSYSDIR/QAXIS10CC)test
CALL PGM(CVTTEMP) PARM('100')
DSPLY 100 Fahrenheit is 37.77 Celsius.
ca marche !
IBM Systems Director Navigator for I5/OS
il s'agit du produit, nouveau en V6, regroupant
- Une partie des fonctionnalités d'iSeries Navigator
- Iseries Navigator Task on the Web
- Un accès au serveur web d'administration (HTTPAdmin)
il tourne en tant qu'application avec le serveur d'Administration, démarré par STRTCPSVR SERVER(*HTTP) HTTPSVR(*ADMIN)
Il utilise le port 2005, et toute requête vers la racine sur le port 2001 est redirigée vers :
Le lien Page des tâches I5/OS, vous envoi vers le serveur HTTPAdmin "classique" (ce qui vous était affiché par le port 2001)
Regardons les principales autres options
- particulièrement Performances
Il s'agit de la vraie nouveauté intégrant
- une interface pour la gestion des collectes (comme iSeries Navigator)
- des options d'affichage des données collectées (Etudes
de données)
Affichage
Vous ne trouverez pas les options suivantes (par rapport à iSeries Navigator)
- Sauvegarde, qui proposait un accès comparable au menu
SETUPBCKUP d'assistant
- Développement d'applications, pour la gestion des threads
et des sémaphores
- AFP Manager , accès aux ressources de ce produit
Vous trouverez en plus l'option permettant de configuer HASM,
si vous avez acheté ce produit.
puisque nous en parlons, voyons les nouveautés Iseries Navigator (version poste client, donc)
Commencons par celles liées à Client Access, mais concernant aussi iSeries Navigator:
le produit est livré sous forme de fichier .MSI installable par Windows Intaller
il est livré sous 3 versions:
- Windows 32 bits
- Windows 64 bits / processeur AMD
- Windows 64 bits / processeur Itanium
Appliquer SI28716 sur le système en V5R40 avant d'installer la V6
Appliquer le dernier service pack sur le serveur avant d'installer le client V6
Venons en à iSeries Navigator lui-même.
il intègre certaines nouveautés liées à I5/OS (ou IBMi) Version 6
- Nouvelles valeurs systèmes de gestion des mots de passe entre autre.
- Nouvelles informations liées aux profils utilisateurs, dont le paramètre PWDCHGBLK pour empécher un utilisateur de modifier son mot de passe
- Support des adresses IP V6
- Support de SSL par les serveurs SMTP et POP
- Support du serveur OSPF, nommé OMPROUTED
Il propose une gestion des unités de bandes virtuelles, dans configuration et maintenance
- création d'une unité de bande virtuelle
- gestion des catalogues d'image
Enfin, la gestions des fichiers intégrés propose maintenant.
- le montage NFS client
- la récupération de données détaillées concernant un répertoire (collecte d'attributs) qui passe la commande RTVDIRINF
Mais le plus gros des nouveautés concerne la base de données, particulièrement tout ce qui a trait à la surveillances des performances SQL
Rappel de la V5R40
- Le centre de santé affiche des informations sur vos base en % des maximas DB2
- Les moniteurs SQL propose des sélections (bibliothèque, tables, durée) au lancement et à l'affichage
- Consultation du cache des plans d'accès avec le même affichage que les moniteurs
- ce dernier suggérant les index manquant en temps réel (assistant de gestion des index)
- La liste des index indique quand un index a été utilisé,
même implicitement pour la dernière fois
• Moniteurs
L'affichage d'un moniteur ou du cache des plans d'accès propose le
choix des colonnes
et, sur un affichage récapitulatif, à l'affichage des instructions
(Analyse, puis clic droit sur une ligne / instructions),
l'option fichier propose, maintenant, une sauvegarde
de la liste des instructions SQL
Sur le même affichage, vous maintenant, placer la requête
SQL dans le gestionnaire de script avec les valeurs des variables, et
non les marqueurs SQL (?)
Enfin, vous pouvez comparer deux moniteurs
• Cache des plans d'accès
Les possibilités d'affichage sur une instruction ont été étendues :
- l'affichage des instructions les plus longues est limité aux 500 premières
- vous pouvez demandez la liste des travaux utilisant actuellement cette instruction
- et la liste des utilisateurs ayant utilisé cette instruction (historique de l'utilisateur)
Vous pouviez déja en V5R40 sauvegarder le cache sous forme d'images instantanées :
par l'interface graphique sous Images instantanées de mémoire cache de plan SQL
par la procédure cataloguée DUMP_PLAN_CACHE , qui en V6 est automatiquement enregistrée au même endroit.Quand le cache est plein il est automatiquement épuré, en V6 il est possible de placer un moniteur sur cet événement afin de le sauvegarder en fichier avant
Tout en gardant la possibilité de choisir les instructions sauvegardées (comme un moniteur)
• Gestion des index
Vous pouvez demander la liste des index pour un bibliothèque entière
(et non table par table) en cliquant sur Tables
Vous remarquerez aussi l'affichage des MQT, la génération d'instruction SQL (toujours pour toute la bibliothèque)
cette liste des index affiche les informations nouvelles en V6
-> clé basée sur une expression
-> clause WHERE de sélection de lignes
Bien sur, la fenêtre de création d'index a été modifiée dans ce sens
et
l'assistant de gestion d'index (qui affiche les index suggérés, globalement, pour une bibliothèque ou pour une table) a été amélioré :
- Affichage de l'instruction SQL est nouveau en V6
- ainsi que l'accès direct aux instructions qui ont provoqué cette suggestion (dans le cache)
- l'assistant affiche aussi le nombre de fois ou un index a été suggéré et, s'il a été créé automatiquement (MTI), le nombre de fois ou il a été utilisé
Ce compteur peut-être réinitialisé pour la table, par le menu contextuel suivant :
L'affichage de l'instruction SQL pour un travail a été revue :
et enfin de nouvelles options sont disponibles pour une table
a Détenteurs de verrou affiche le résultat de la commande
WRKOBJLCK
Commentaires, permet la saisie de commentaires (COMMENT ON)
dans les catalogues SQL
Pour terminer le gestionnaire de scripts subit aussi des changements
1/ une option ALLOW SAVE RESULT, permet la sauvegarde des enregistrements extraits:
ensuite, avec un clic droit sur les lignes affichées :
Les formats admis, sont :
- txt
- cvs
- Lotus 123
- tableur Excel
Les paramètres de connexion (JDBC) peuvent être modifiés temporairement ou définitivement
et proposent maintenant l'affichage des COLHDG plutôt que les noms de
zone en entête de colonne
La(les) requêtes(s) peuvent être sauvegardée(s) sur le serveur
(fichier physique ou IFS)
Ce qui accompagne très bien le nouveau paramètre SRCSTMF de la commande RUNSQLSTM
Enfin, Visual Explain peut être lancé et réactualisé, pendant l'exécution, les informations ayant bougé sont surlignées.
RDI version 7
- La liste des produits de développement est maintenant découpée
comme suit :
- Compilateurs ILE
- Compilateurs "héritage" (GAP II/GAP III, etc...)
- ADTS (PDM;SEU,SDA,RLU)
- RDI, le successeur de WDS client
Ce sont quatre lignes de facturation différentes.
1/ Installation
La procédure d'installation (proche de celle de WDS c V7) utilise IBM Installation Manager
vous devez d'abord installer IBM Installation Manager (c'est fait en automatique, si ce dernier n'est pas présent sur votre PC)
2/ Nouveautés
- Divers
- Support de la version 6.1 de I5/OS (ou maintenant IBM i)
- Support de Rational ClearCase comme produit de gestion de version (en mode Projet iSeries uniquement)
- Quelques amélioration liées au debug
- Sélection et gestion des unités d'exécution (thread) en ILE RPG
- Modification des variables VARYING en RPG.
- La nouveauté la plus importante est probablement l'intégration
de Screen Designer, toujours en version "preview",
mais phase 2
incluant, maintenant, la possibilité de tester vos écrans (comme SDA)
- Autre nouveauté, venant de la version Advanced, l'organigramme des
enchainements de programmes
Affiche, les pgm appelés, les sous-programmes et les sous-procédures
CVTSPLSTMR et QSPGETSP
sont des modules dont le source est disponibleQSPCLSP, QMHSNDPGM sont des API système
(pas de source)CVTSPLSTMR possède 13 sous-routines
(S/pgm ou procédures), donc 13 noeuds
Copyright © 1995,2009 VOLUBIS