pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #33
Quelques annonces logicielle :
Host Publisher est retiré du catalogue IBM à Février 2004, ce qui devrait simplifier la liste des produits de Webisation IBM :
- HATS (une version Limited Edition est livrée avec Client Access)
La version complète permet de personnaliser chaque écran avec un plug-in pour WDS client.
- Iseries Access for the WEB, option de la famille Client Access (maintenant
Iseries Access), contient un sous ensembles des options proposées par Operation
Navigator, plus un émulateur.
- Webfacing (partie du produit Websphere dev. Studio Client), permet de transformer
les DSPF (à partir des sources) en pages JSP.
Une version 5.1 (patchée 5.1.0.1, depuis début Janvier) vient de sortir, elle apporte quelques amméliorations,
pour webfacing :• Gestion des styles
• reconnaissance dynamique des touches de fonction
• quelques modifications de paramétrage
(on utilise plus le fichier d'invocation, tous les paramètres sont dans web.xml)
• des correctifs sur les principaux dysfonctionnements
HATS LE (livré avec Iseries Access)
Il s'agit d'une version limitée de HATS V4, permettant un accès à un AS/400 depuis un navigateur WEB.
- Vous devez demander un refresh de CLIENT ACCESS pour obtenir cette nouvelle
version (en V5r10 ou V5r20 de l'OS/400)
-
ATTENTION, il faut Websphere Application Serveur version 5 : l'installation se fait sous forme d'une application EAR
Configuration
Quand l'installation est terminée, saisissez l'URL suivante : "http://<votre as400>/HATSLE"
le produit passe automatiquement en mode configuration à la première utilisation, signez vous
Cette affichage correspond à l'URL "http://<votre as400>/HATSLE/config"
poursuivons l'assistant :
Indiquez ici les paramètres de configuration, malheuresement, il n'y a qu'une seule config par instance de WAS
- l'hôte auquel se connecter ( ce peut être un autre AS/400)
- le port telnet (23 par défaut)
- la page de code (297 en France, 1147 si vous utilisez le caractère €)
- Comment nommer l'unité écran. (*) représente un caractère générique.
- Si vous souhaitez utiliser des sessions cryptées
Puis choisissez un style
IseriesAccess |
Sports |
ClassicTerminal |
Blank |
Choisissez aussi :
- l'apparition ou non d'un bloc de touches propre à HATS (déconnexion, etc...)
- l'apparition ou non d'un bloc de touches (F01 à F04, sous forme de boutons)
- L'utilisation possible du clavier pour les principales touches de fontion (F3 par exemple)
Puis définissez l'apparence de la fenêtre
et Enfin le comportement de HATS
- Détection des touches de fonction (f3=Exit sous forme de lien)
- Détection des liste de sélection (options de menu sous forme
de lien)
- Détection de tableau
Exemple avec la commande WRKSYSSTS :
- Détection de tableau non activée
- Activée
- Détection de tableau non activée
- Détections de sous-fichiers
Exemple avec la commande WRKSPLF :
- Détection de sous fichiers activée
- Non activée
- Détection de sous fichiers activée
- Utilisation du rendu caractère par caractère, insère
des espaces s'il le faut afin de garder rigoureusement l'alignement
(ce que nous subissons sur l'écran ci-dessus dans la zone OPT, par exemple)
Enfin, sur cette dernière fenêtre, clquez sur Fin pour confirmer
votre paramétrage
Puis essayez, toujours avec l'URL "http://<votre as400>/HATSLE"
Exemples en utilisation de notre application SPOOL2, qui reproduit la commande WRKSPLF avec des options supplémentaires.
- HATS LE
- Iseries Access for the WEB (ou WEBACCESS)
- Ecrans transformés par WEBFACING
Introduction à VisualAge RPG
Ce produit est livré aujourd'hui avec WDS Client V5, qui propose une vue spécifique à ce produit
Choisissez EDIT ou EDIT with Prompt - vous verrez apparaître l'espace de travail, composé comme suit :
la logique est celle de toutes les applications de programmation PC d'aujourd'hui.
- Un projet contenant la liste des fenêtres de l'application
- chaque fenêtre contient des objets graphiques
- la palette d'outils propose la liste des objets graphiques pouvant être insérés dans la fenêtre.
- Après avoir composé visuellement votre fenêtre, vous devez définir le code associé à un événement.
Soit l'application suivante (liste des cours) :
le plus simple est de faire référence à la base de données (comme avec SDA), par "Serveur/Définition des zones de référence"
pour chaque objet :
on peut définir les propriétés : |
parmi les propriétés remarquables, citons:
|
ensuite il faudra associer du code à un événement :
- getfocus : devient l'objet en cours (ayant le focus)
- lost focus : perd le focus (voir ci-dessus)
- mouseenter: la souris passe par dessus
- mousexit : la souris quitte l'objet
- press (pour un bouton): on appuie sur le bouton
- select pour un bouton radio ou une case à cocher, etc...
vous passerez alors sous l'éditeur de source "CODE/400" .
tous les sous programmes liès à un événement sont structurés de la manière suivante:
- BEGACT : équivalent BEGSR, mais pour un événement
- facteur1 : le nom de l'objet
- facteur2 : l'événement
- Zone résultat : le nom de la fenêtre "mère".
regardons ensemble le code:
- Spécif F "normale", si ce n'est le mot-clé remote qui
indique un fichier AS/400
(en l'absence de ce mot-clé les fichiers sont considérés comme locaux [c'est à dire PC] et doivent être en interne.)Vous devez cependant, configurer vos serveur de données (on utilise en fait DDM/IP)
par l'option "Serveur/Définition des options AS/400"
Puis vos ressource (particulièrement vos fichiers) en les attachant à un serveur :
- Définition des variables:
msg est une constante, retour une variable numérique.
par contre msgerr de type M est une particularité de
Vrpg permettant une définition de message :
le type est M (à la place de S pour single, C pour constant,
etc....)
style définit le type de message : *INFO , *WARN , *HALT
button , les boutons affichés (et donc utilisables)
*OK | *CANCEL | *NOBUTTON |
*ABORT | *IGNORE | *YESBUTTON |
on peut utiliser trois boutons
tout cela permet d'envoyer un message à l'utilisateur par DSPLY
regardons ce sous programme :
les fonctions %getatr , %setatr permettent de retrouver
/ ou de modifier une propriété d'un objet.
(les codes opération SETATR et GETATR sont admis)
Par exemple un objet image possède un attribut FILENAME indiquant le chemin et le nom du fichier image à charger.
vous pouvez utiliser :
C 'IMAGE1' SETATR path 'FILENAME' ou bien C eval %setatr('FENETRE':'IMAGE1':'FILENAME') = path
La version livrée avec WDS client 5.1 supporte le formet libre et nous pourrions écrire : /free |
Dans l'extrait de code ci-dessus %GETATR retourne la propriété 'TEXT'
de l'objet AF4MDL , c'est à dire son contenu
Pour les variables d'une fenêtre, vous pouvez aussi utiliser WRITE et
READ, pour renseigner ou retrouver
tous les champs à la fois.
En fait vous devez considérer que VARPG possède plusieurs exemplaires d'une même zone :
Pour affecter à la zone mémoire, le contenu d'une variable
d'une fenêtre, utilisez %GETATR Pour affecter la zone dans la fenêtre, utilisez %SETATR ou WRITE
. Vous pouvez aussi utiliser les ordres suivants :
|
Effectuons un CHAIN sur le fichier Base de Données (nous venons de faire une lecture sur le fichier REMOTE)
si aucun enregistrement n'est trouvé, affichage d'un message d'erreur sous forme d'une boite de dialogue.
Sinon chargement de l'objet sous fichier. Quelques différences avec les sous-fichiers 400 :
la mise à blanc se fait par CLEAR |
l'ajout (l'écriture) se fait par WRITE sans gestion du numéro de rang. |
READS est un nouvel ordre qui permet de lire les enregistrements SÉLECTÉS. (READC reste valide, pour lire enregistrements modifiés) |
l'affichage se fait (par défaut) en temps réel (ligne à ligne,
type minitel ....) eval %setatr('FENETRE' : 'SOUSFICHIER' : 'REPAINT') = 0/1 |
et enfin la fin du programme (bouton "sortie") :
et enfin, l'autre RPG : e-RPG
Il s'agit de routines livrées sur le site www-922.ibm.com .
le fonctionnement est basé sur CGI et donc des programmes RPG ou COBOL.
On vous fournit un programme de service, permettant de d'affranchir du la complexité de CGI
ZhbGetInput(query : structure-qusec) | pour recevoir la saisie utilisateur |
ZhbGetVar('nom-variable' ) | pour extraire une variable du flot recu |
Gestion du résultat | |
GetHtml(fichier:bib:membre) | charge en mémoire une page html (venant d'un membre source) |
GetHtmifs(/chemin/fichierhtml) | charge en mémoire une page html (venant d'un fichier stream) |
UpdHtmlVar('nom-variable' : variable) | remplace /%nom-variable%/ par variable dans la page résultat |
Wrtsection('section') | écrit la partie section, dans le flot de données en sortie (il faut terminer par la pseudo-section '*fini') |
WrtnoSection(data : datalg) | écrit un flot de données (sans utiliser de page HTML modèle) |
Exemple:
la page HTMl résultat (générée avec WDS client)
$titre <HTML> <BODY> <P><h1>Affichage d'un producteur</FONT></h1></P> $erreur <BR><font color="red">Code producteur erroné recommencez </font> <FORM action="/cgi-bin/affprod.pgm"> Entrez un code producteur <INPUT type="text" name="pr_code" size="6" maxlength="6"><BR> <BR>puis <INPUT type="submit" name="validez" value="validez"> </FORM> $detail <h3>/%pr_nom%/</h3><br> <TABLE border="1"> <TBODY> <TR> <TD>Adresse </TD> <TD>/%pr_adr%/</TD> </TR> <TR> <TD>commune</TD> <TD>/%pr_commune%/</TD> </TR> <TD>tel</TD> <TD>/%pr_tel%/</TD> </TR> <TR> <TD>fax</TD> <TD>/%pr_fax%/</TD> </TR> </TBODY> </TABLE> <P> <BR><BR> </P> $pied </BODY> </HTML> |
et le pgm RPG lancé
H bnddir('CGIDEV2/TEMPLATE2':'QC2LE':'QUSAPIBD') * Saved query string Dsavedquerystring... D s 32767 varying * code producteur (en aplha) D pr_codeA s 6 * flag pour prb sur code producteur D probleme s n /free SetNoDebug(*off); gethtmlifs('/html/cgi/cgidev2_01r.html': '$'); nbrvars = zhbgetinput(savedquerystring:qusec); pr_codeA = zhbgetvar('pr_code') ; probleme = *off; monitor ; pr_code = %dec(pr_codeA:6:0) ; on-error *all ; probleme = *on ; endmon ; if not probleme ; chain pr_code prodf1; endif; ClrHtmlBuffer() ; wrtsection('titre') ; if not probleme and %found(produ00001) ; updHTMLvar('pr_nom' : pr_nom) ; updHTMLvar('pr_adr' : pr_adresse) ; updHTMLvar('pr_commune' : pr_commune) ; updHTMLvar('pr_tel' : pr_tel) ; updHTMLvar('pr_fax' : pr_fax) ; wrtsection('detail') ; else ; wrtsection('erreur') ; endif ; wrtsection('pied') ; wrtsection('*fini') ; return; /end-free |