Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.

Pause-café #49

Janvier 2009

Version 6 de IBM i (suite).




Nouveautés du compilateur RPG-IV en V6R10

|


 Nouveautés V6R10 du compilateur RPG-IV
 -Support complet du multitrhreading avec THREAD(*CONCURRENT) en specif H
   Chaque thread possède une copie des variables déclarées STATIC
   certaines variables peuvent être partagées par STATIC(*ALLTHREAD)
   le mot-clé SERIALIZE sur une procédure demande à ce que cette dernière     ne puisse être lancée que par un thread à la fois.

 -support plus souple d'UNICODE
   une conversion implicite est réalisée lors des affectations(EVAL/EVALR)     et des tests (IF, DOW/DOU, ...) entre une variable EBCDIC et une     variable UNICODE, sans utilisation des fonctions %CHAR() et %UCS2()

   cette conversion implicite était déja réalisée par MOVE/MOVEL

|

-la taille maxi des constantes passe à 16380 (la moitié pour UNICODE)
-la taille maxi des variables caractères passe de 65535 à 16 Mo !!

 le nombre d'occurences d'une DS ou d'un tableau n'est plus limité    qu'à la taille globale maxi de 16.773.104 octets ( 16 Mo )

 le mot-clé LEN peut être utilisé à la place des colonnes 33/39 (lg)    sur la définition d'une zone ou d'une DS (spécif D)

 le mot-clé VARYING admet un paramètre (2 ou 4) indiquant le nombre d'octets   utilisés pour stocker la lg.Sans paramètre, le compilateur calcul.

 la fonction %ADDR() admet un deuxième argument *DATA quand elle s'applique   sur une zone VARYING, demandant à ce que l'adresse pointe sur la partie   significative de la variable (et non les octets binaires de début)

|

 -La taille du module ou du programme objet peut être réduite par    OPTION(*NOUNREF) en spécif H ou sur la commande de compilation.
   les variables non utilisées ne sont plus répercutées dans l'objet.
   la valeur par défaut est *UNREF (même résultat qu'aujourd'hui)

 -les informations concernant le pgm et ces paramètres pouvaient déja    être notées dans un fichier stream au format PCML par PGMINFO(*PCML) 
  ce fichier PCML était utile pour des apppels depuis JAVA, mais aussi    pour la création de services WEB.
  la création de services web étant facilité en V6R10 (nouveau serveur    d'application intégré) ces informations peuvent maintenant être stockées
         dans l'objet PGMINFO(*PCML:*MODULE) dans un fichier IFS PGMINFO(*PCML : *STMF)

ou dans les deux PGMINFO(*PCML : *ALL)


|

 - la spécif F possède de nouveaux paramètres
   sur les versions précédentes, il était possible d'indiquer un nom réel     de fichier à utiliser à l'exécution, par EXTFILE, évitant des OVRDBF
   EXTDESC() permettant d'indiquer le nom du fichier à la compilation
     -> cela permet de compiler avec un fichier qui n'est pas dans *LIBL         EXTDESC('BDVIN1/VINS')
     -> cela permet de manipuler un fichier ayant le même nom de format          puisque que c'est le nom en spécif F qui est utilisé
   le paramètre EXTFILE(), admet maintenant EXTFILE(*EXTDESC) demandant         à ce que le nom réel à l'exécution soit celui de EXTDESC
 - les définitions de fichier (F) et de DS (D) admettent un nouveau mot-clé      TEMPLATE indiquant que cette déclaration n'est qu'un modèle.
 - EXTNAME , mot-clé lié à une DS externe (spécif D), admet maintenant     un litéral, éventuellement qualifié

|
 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.

 la DS résultat est maintenant admise aussi pour un fichier externe   et EXFMT possède aussi cette possibilité.
 -un nom de format peut être qualifié par QUALIFIED en spécif F
  le nom de format doit être manipulé sous la forme "fichier.format"     (dans notre exemple il s'agit d'une TABLE SQL, d'où le même nom)
  il n'a plus à être unique : il n'y a plus de spécif I et O pour ce fichier       ==> les I/O doivent utiliser une DS :
  Fvins      IF   E             DISK    QUALIFIED   Din               DS                  LIKEREC(vins.vins)
   /free     read vins IN;     dsply  IN.VIN_NOM;     return;    /end-free

|
 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.

  le source ne contient donc plus que des procédures, la procédure déclarée     MAIN doit contenir EXTPGM('le-nom-du-pgm') sur le proptotype
  il n'y a plus de cycle GAP , il faut donc fermer explicitement par CLOSE    les fichiers (le compilateur signale une erreur RNF7534 de gravité 10)
source TESTMAIN 
h MAIN(ENTREE) D ENTREE          PR                  EXTPGM('TESTMAIN') D                                5A
P ENTREE          B D                 PI D parm1                          5A  /free   dsply parm1;  /end-free P ENTREE          E

|

 les spécif F sont admises maintenant locales (à l'intérieur des procédures)    entre la spécif P et les D.
  les entrées/sorties doivent être réalisées à l'aide de DS.
  les fichiers sont fermés automatiquement à la fin de la procédure, sauf à    utiliser STATIC, qui garde les fichier ouverts et les variables chargées.
Exemple, utilisation d'une fonction "lecture" qui retourne une donnée  Caractère/50 (le nom) à partir d'un code numérique en entrée.
 H DFTACTGRP(*NO) ACTGRP(*CALLER)  ALWNULL(*USRCTL)  D lecture         PR            50  D                               10I 0 CONST
  /free    dsply lecture(1) ;    *inlr = *on;   /end-free
la procédure lecture, contenant sa propre spécif F :

|

 P lecture         B  Fvins      IF   E             DISK    QUALIFIED  D                 PI            50  D code                          10I 0 CONST  Din               DS                  LIKEREC(vins.vins)
  /free    chain code vins IN;    return IN.VIN_NOM;   /end-free  P lecture         E

Cela permet de mieux gérer les fonctions dans des programmes de service  retournant des valeurs basées sur des données venant de fichier lus.
il y avait un certain nombre de restrictions qui nous poussaient à déclarer  le fichier en USROPN et à l'ouvrir et le fermer à chaque utilisation ou  bien à placer le programme de service dans un groupe d'activation à part.


|

  LIKEFILE , définition d'un fichier comme un autre
  1/ en spécif F, on récupère tous les attributs de la déclaration de       fichier d'origine, type d'ouverture, utilisation de la clé, etc...
   Attention cela implique QUALIFIED (implicite), donc DS résultat.
 Fvins      IF   E             DISK  Fproducteur                             LIKEFILE(vins)
 le GAP cherche à ouvrir les deux fichiers de la même manière, mais doivent   quand même être précisé sur le deuxième fichier :
            - COMMIT  qui n'est pas répercuté             - USROPN  qui n'est pas répercuté             - SFILE() pour le nom de la zone rang qui doit être différent             - OFLIND  qui doit avoir un indicateur différent             - EXTIND  qui doit utiliser un DS différente
 enfin EXTFILE, EXTMBR peut être indiqué sur l'une ou l'autre ou les deux    déclarations avec les règles suivantes :

|

+--------------------------------------------------+----------------------+ ! déclaration de deux fichiers en spécif F         ! fichiers ouverts     ! +--------------------------------------------------+----------------------+ !Ffic1    IF   E        DISK                       ! fic1                 ! !Ffic2                        LIKEFILE(fic1)       ! fic2                 ! +--------------------------------------------------+----------------------+ !Ffic1    IF   E        DISK  EXTFILE('bib/fic3')  ! fic3                 ! !Ffic2                        LIKEFILE(fic1)       ! fic3                 ! +--------------------------------------------------+----------------------+ !Ffic1    IF   E        DISK                       ! fic1                 ! !Ffic2                        LIKEFILE(fic1)       ! fic4                 ! !                              EXTFILE('bib/fic4') !                      ! +--------------------------------------------------+----------------------+ !Ffic1    IF   E        DISK  EXTFILE('bib/fic3')  ! fic3                 ! !Ffic2                        LIKEFILE(fic1)       ! fic4                 ! !                              EXTFILE('bib/fic4') !                      ! +--------------------------------------------------+----------------------+ !Ffic1    IF   E        DISK  EXTMBR('membreA')    ! fic1, membreA        ! !Ffic2                        LIKEFILE(fic1)       ! fic4, membreA        ! !                              EXTFILE('bib/fic4') !                      ! +--------------------------------------------------+----------------------+

|

  2/ le mot-clé LIKEFILE peut être indiqué en spécif D, sur un paramètre       de procédure, afin de passer un fichier en tant que paramètre 
     le paramètre transmis doit lui même être un fichier déclaré par EXTFILE         par un pgm appellant RPG ! (pas de COBOL, ni de C)
     le fichier référencé peut être déclaré avec TEMPLATE, afin de n'être       qu'un modèle.il doit préciser le facteur de groupage par BLOCK()
      en effet, le facteur de groupage est déterminé par le GAP en fonction        des ordres d'entrée/sortie réalisés par le programme.
        ici le fichier n'étant q'un modèle, le GAP ne peux pas décider du          type de groupage, il faut préciser :
         BLOCK(*YES) le groupage a lieu sauf pour READE/READP/READPE
         BLOCK(*NO) les enregistrements sont lus un par un.
     l'ouverture de fichier est passée par référence, elle est commune aux 2.       par exemple l'appelant peut lire et l'appelé mettre à jour.

|

Exemples :
  * test de la syntaxe, il n'y a pas d'intérêt particulier pour l'instant
 H DFTACTGRP(*NO) ACTGRP(*CALLER)  ALWNULL(*USRCTL)  Fvins      UF   E           K DISK    TEMPLATE  F                                      QUALIFIED
 FVIN2                                 LIKEFILE(VINS)  DIN               DS                  likerec(vin2.vins)
  /free    read vin2 in;    dow not %eof;      ...     read vin2 in;    enddo;    *inlr = *on;   /end-free


|
  * 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)

  /free    read vin2 in;    dow not %eof;     if in.vin_nom = ' ';      miseajour(vin2:in) ;     endif;     read vin2 in;    enddo;    *inlr = *on;   /end-free

|

 Pmiseajour        B  D                 PI  D vin_in                              LIKEFILE(VINS)  D OUT                                  LIKEDS(DS_MODELE)   /free    eval out.vin_nom = '(non précisé)' ;    update vin_in.vins out;   /end-free  Pmiseajour        E
 la procédure recoit la totalité de l'enregistrement dans OUT
 la mise à jour doit aussi avoir lieu par le biais de cette DS   (il n'y a plus de spécif I et O)


Dernier exemple, nous allons placer la procédure "miseajour" dans   un programme de service externe.


|
Source TESTFIL3F 
 H ALWNULL(*USRCTL)
 FVINS      UF   E           K DISK    TEMPLATE QUALIFIED

Source TESTFIL3D   Dds_modele        DS                  likerec(vins.vins) TEMPLATE  Dmiseajour        PR  D parm1                               LIKEFILE(vins)  D parm2                               likeds(ds_modele)
Source du Programme de service , complié par les commandes :                                                  CRTRPGMOD                                                  CRTSRVPGM     EXPORT(*ALL)  H NOMAIN   /copy af4test/manip610,testfil3F   /copy af4test/manip610,testfil3D
 pmiseajour        B                   EXPORT  D                 PI  D vin_in                              LIKEFILE(vins)  D OUT                                  LIKEDS(DS_MODELE)

|
  /free
   eval out.vin_nom = '(non précisé)' ;
   update vin_in.vins out;
  /end-free
 Pmiseajour        E

Puis le programme compilé par CRTRPGMOD puis CRTPGM / BDNSRVPGM()
  /copy af4test/manip610,testfil3F  FVIN2                                 LIKEFILE(VINS) EXTFILE('BDVIN1/VINS')   /copy af4test/manip610,testfil3D  DIN               DS                   LIKEDS(DS_MODELE)   /free    read vin2 in;    dow not %eof;     if in.vin_nom = ' ';      miseajour(vin2:in) ;     endif;     read vin2 in;    enddo;        *inlr = *on;   /end-free


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

  1. le port d'écoute du serveur d'application (10031, ici)
  2. le port du serveur apache, à modifier si vous modifiez le port d'écoute du serveur apache (80 par exemple)
  3. 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

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 -o/myconverttemp
   /QIBM/ProdData/OS/WebServices/V1/Client/samples/ConvertTemp/ConvertTemp.wsdl


   Code generation completed.
$

  • -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 :

$
> ls /myconverttemp
ConvertTempPortType.c CONVERTTEMPInput.c CONVERTTEMPResult.c
ConvertTempPortType.h CONVERTTEMPInput.h CONVERTTEMPResult.h
$

Détails du fichier wsdl

Extrait de la définition du service
---------------------------------------
<wsdl:portType name="ConvertTempPortType">
  <wsdl:operation name="converttemp_XML">
    <wsdl:input message="axis2:converttemp_XMLRequest" wsaw:Action="urn:converttemp_XML"/>
    <wsdl:output message="axis2:converttemp_XMLResponse" wsaw:Action="urn:converttemp_XMLResponse"/>
  </wsdl:operation>
  <wsdl:operation name="converttemp">
    <wsdl:input message="axis2:converttempRequest" wsaw:Action="urn:converttemp"/>
    <wsdl:output message="axis2:converttempResponse" wsaw:Action="urn:converttempResponse"/>
  </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="ConvertTempSOAP11Binding" type="axis2:ConvertTempPortType">

.../...
</wsdl:binding>

< wsdl:service name="ConvertTemp">
  <wsdl:port name="ConvertTempSOAP11port_http" binding="axis2:ConvertTempSOAP11Binding">
   <soap:address location="http://localhost:10022/web/services/ConvertTemp"/>
  </wsdl:port>
</wsdl:service>

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 {
       xsdc__string _TEMPOUT;
  } CONVERTTEMPResult;


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

  1. Le centre de santé affiche des informations sur vos base en % des maximas DB2
  2. Les moniteurs SQL propose des sélections (bibliothèque, tables, durée) au lancement et à l'affichage
  3. Consultation du cache des plans d'accès avec le même affichage que les moniteurs
  4.   ce dernier suggérant les index manquant en temps réel (assistant de gestion des index)
  5. 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 disponible

     

    QSPCLSP, QMHSNDPGM sont des API système
    (pas de source)

     

    CVTSPLSTMR possède 13 sous-routines
    (S/pgm ou procédures), donc 13 noeuds

 


Top


Copyright © 1995,2009 VOLUBIS