pause-café
rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.
Pause-café # 3
Septembre 1994
VERSION 2 EDITION 3.0 ############################### !-> # fichier format action # ° DDS graphiques ! # ---------:...........------ # ! # : Caract. : # - Barre de menu (fmt MNUBAR) ---! # !-> : Héxa : # # ! :..........: # - Menus déroulants (fmt PULLDOWN) ----- # -----! # # # ############################### R BARRE MNUBAR CHOIX 2Y 0B 1 2MNUBARCHC(1 MD01 '>Fichier') MNUBARCHC(2 MD02 'Forma>t') MNUBARCHC(3 MD03 '>Action') Le format BARRE est une barre de menu (mot-clé MNUBAR) MD01,MD02 et MD03 sont des menus déroulants (mot-clé PULLDOWN) associés à ce format. Si le curseur est positionné devant "Format" le format MD02 sera affiché (sans action de la part du pgm), ... etc ...
R MD01 PULLDOWN MD1CHX 2Y 0B 1 2SNGCHCFLD CHOICE(1 '>Ouvrir') CHOICE(2 '>Fermer') CHOICE(3 '>Quitter' *SPACEB) * la ligne "Quitter" sera précédée d'une ligne blanche R MD02 PULLDOWN MD2CHX 2Y 0B 1 2SNGCHCFLD CHOICE(1 '>Caractère') CHOICE(2 '>Hexa') R MD03 PULLDOWN MD3CHX 2Y 0B 1 2SNGCHCFLD CHOICE(1 '>Add') CHOICE(2 '>Delete') R FMT MNUBARDSP(BARRE &mnu &opt) MNU 2Y 0H OPT 2S 0H Votre programme utilise FMT et recoit dans MNU le n° du menu déroulant dans OPT le n° de l'option du menu.
RUMBA/400 affiche: + les barres de menu + les menus déroulants etc ... + TOUTES LES FENETRES (mot-clé WINDOW) avec un "look micro" (type OS/2) si vous renseignez le paramètre ENHDSP à *YES (ce qui est la valeur/dft) sur les commandes CRTDSPF et CHGDSPF. Si vous indiquez *NO, le résultat sera semblable à l'affichage sur un écran passif. Le début d'un REWAMPING temps réel ? (IBM annonce les ascenceurs et les boutons poussoirs pour la V3R10 ?!?)
RUMBA peut être une aide au client serveur. En effet il est possible d'établir un lien DDE entre une application WINDOWS et une session RUMBA. Cela est particulièrement interessant pour les applications capables d'engager un lien DDE à l'aide de "MACROS" comme EXCEL, WORD, etc ... C'est aussi réalisable avec Visual Basic qui sait gérer les liens DDE. Il s'agit d'un dialogue de type client/serveur entre votre application WINDOWS (le client) et RUMBA/400 (le serveur). Les liens DDE sont basés sur la notion de message.Quelques exemples : FSET("chaine", ligne, col) = entrée automatique de caractères à l'écran KEY(touche-5250) = envoi de touches 5250 (Entrée,Fx,ROLLUP,...) FSEARCH("chaine", li, col) = recherche d'une chaine de car. sur l'écran COPYBLOCK(l1, c1, l2, c2) = extraction d'informations à partir de RUMBA vers l'application WINDOWS.
Cela permet, par exemple, à partir d'un classeur EXCEL de : 1/ démarrer automatiquement RUMBA. 2/ ouvrir une session AS/400. 3/ appeller le pgm qui va afficher les données à copier. 4/ copier ces données dans EXCEL, afin de ré-actualiser un graphique par exemple. 5/ fermer la session RUMBA. Et TOUT CELA SANS ACTION CLAVIER de la part de l'utilisateur, voir même automatiquement à l'ouverture du classeur. ENFIN, RUMBA propose des services indentiques par l'intermédiaire de EHLLAPI Emulation High Level Language A P I. qui est en fait un ensemble de DLL WINDOWS utilisabes principalement en C (l'utilisation de DLL est beaucoup plus rapide que les liens DDE)
O D B C. WINDOWS nous à déja montré qu'il était un outil fédérateur: sous DOS, quand vous installez une nouvelle imprimante, elle doit être reconnue (ou émuler une imprimante reconnue) par votre traitement de texte favori. Sous WINDOWS, ce problème ne se pose plus. En effet, vous installez un gestionnaire sous WINDOWS (un "driver") (qui doit etre conforme à la manière dont WINDOWS prévoit de dialoguer avec lui, il y a donc une norme) Et vos applications vont demander à WINDOWS d'imprimer. Nous avons donc ajouté une couche logiciel qui assure la plus parfaite transparance.(les docs américaines disent SEAMLESS = sans coutures)
MICROSOFT est en train d'étendre ce concepts aux connexions entre systèmes. il s'agit de WOSA = WINDOWS OPEN SERVICES ARCHITECTURE. qui offre une interface entre des applications WINDOWS et des services rendus par des systèmes dans un environnement hétérogène et distribué. ................. ................. ................. : Application : : Application : : Application : : WINDOWS : : WINDOWS : : WINDOWS : :...............: :...............: :...............: ! ! ! !-------------------!--------------------! ! APIs WOSA | | | DLL "clientes" | APIs WOSA ! !-------------------!-------------------! ................ ................... ............... : SERVEUR : : : : autres : : B de D. : : Messagerie : : services.. : :..............: :.................: :.............:
Comme tous les composants WOSA, ODBC se compose d'APIs installées sur la plateforme cliente (installées sous forme de DLL sur votre micro) et d'un ensemble de pgm SPI (Service Provider Interface) qui s'installent dans notre cas sur l'AS/400. Une fois votre driver ODBC installé (en deux parties, donc), toute application WINDOWS conforme à la norme ODBC peut accéder à des sources de données ODBC. Applications clientes: ACCES, EXCEL (via MS-QUERY), Visual BASIC, POWER BUILDER, ... sources de données sur micro Bases ACCES, fichier DBF, PARADOX, FOXPRO, ... distantes DB2, SQL/400, DB2/2, HP, DEC, ORACLE, PROGRESS La première chose que demande une application cliente au driver c'est son niveau de conformité (il en existe TROIS) "Qu'est-tu capable de faire ?" (SHOWCASE répond : "niveau 2")
Puis le dialogue s'engage sur la base de la grammaire SQL. vous pouvez donc : 1/ demander la liste des tables la structure des tables 2/ faire de l'extraction (requêtes) 3/ faire des mises à jour, des suppressions, ... 4/ Créer des tables, des indexs, ... 5/ et, avec le driver ODBC pour AS/400, travailler sous contrôle de validation (COMMIT/ROLLBACK) Ce driver est aujourd'hui proposé par la société SHOWCASE. il devrait être incorporé dans CLIENT/ACCES (PCS V3R10), probablement avec un peu moins de possibilités que SHOWCASE (à suivre...)
Une autre facon de faire du client serveur est d'établir un dialogue entre un programme à vous sur micro et un programme à vous sur l'AS Cela est possible sur la base du dialogue APPC (égal à égal) en utilisant des APIs fournies avec PCS (sous la forme de DLL) et qui vous permettent d'utiliser le routeur (qui doit être actif) Tous les languages WINDOWS sachant utiliser des DLLs, peuvent mettre en place en tel dialogue Nous allons regarder un exemple écrit en Visual Basic (partie micro) et en RPG, plus fichier ICF (partie AS/400)
SPLAF4 est un petit outils Client/serveur permettant de visualiser la liste des spools en attente sur l'AS/400 auquel vous êtes connecté (via PCS), dans une fenêtre WINDOWS. Pratique, pour les utilisateurs du driver AFPDS afin d'avoir des infos sur les spools générés (est-il déja imprimé ?) sans avoir besoin d'ouvrir une session WSF ou RUMBA. ASPECT Général de la fenêtre (de haut en bas) + un menu déroulant "Actions" contenant deux options : Sortie (= F3 ; = Bouton sortie) : Refresh(= F5 ; = Bouton Refresh) + un objet texte (label) = constante, c'est le titre. + un objet grille (GRID) = tableau à deux dimensions géré par VB + deux "PUSH BUTTON" : SORTIE et REFRESH
-| Spools AS/400 |v|^ # Actions # # # # Liste des spools en attentes # # # # .................................................................. # # : Nom : Pages : Usrdta : Etat : Outq : # # :-----------:-----------:---------------:------------:-----------: # # : xxxxxxxxx : zzz : aaaaaaaa : *WRITING : PRT01 : # # : xxxxxxxxx : zzz : : *HELD : PRTxx : # # : : : : : : # # : : : : : : # # : : : : : : # # : : : : : : # # : : : : : : # # :...........:...........:...............:............:...........: # # # # | | | | # # | Exit F3 | | Refresh F5 | # # # ######################################################################
fonctions évenementielles # la philosophie VISUAL BASIC étant de définir des objets WINDOWS dans une fenètre, de les nommer et de définir leurs propriétés. # puis d'associer à ces objets un évenement possible (suivant le type). # VISUAL BASIC propose alors un sous prog. portant le nom OBJET_EVENEMENT à remplir par le programmeur. C'est le cas des sous prog. qui suivent: xxxx_click = click souris sur un objet (bouton,...) xxxx_LOAD = chargement d'une fenètre (la première est chargée à l'appel du programme) xxxx_change= zone de saisie modifiée a noter xxxx.text = texte d'une constante ou d'une boite de saisie Toutes les fonction EHN---- ont étées copiées à partir de RTRSAMP.GBL et représentent des appels aux API PCS/400 contenues dans la DLL WINDOWS "EHNAPPC.DLL" (depuis la V2R20, exemples dans I:\QIWSTOOL)
Evenements gérés par le pgm : Chargement du programme (de la feuille) = FORM_LOAD (initialisation du dialogue) ! !-> EVOKE du pgm SPLAF4CL ! ! ADDLIBLE AF4TOOL ! puis appel v dialogue APPC <-------SPLICF<--SPLAF4 qui utilise SPLICF ! ! RMTLOCNAME(*REQUESTER) click sur Bouton Refresh = REFRESH_CLICK Click sur bouton Exit = EXIT_CLICK
Option Refresh du menu = REFRESHM_CLICK execute REFRESH_CLICK Option Exit du menu = EXITM_CLICK execute EXIT_CLICK L'objet grille se manipule de la facon suivante: pour acceder à une cellule Grille.ROW=x Grille.COL=y puis pour la renseigner Grille.text= 'valeur' Pour fixer le nombre de lignes Grille.ROWS=x Le nombre de colonnes à été figé à 5, lors de la conception.
SPLAF4.FRM (pgm Visual Basic V3.0) __________ Dim datatosend As String * 5 Dim FIN As String Dim nblignes As Integer Dim largecol As String Dim f3use As String ________________________________________ Sub Form_Load () 'FONCTION CHARGEE A L'APPEL DU PGM chargegrille End Sub __________________________________________ Sub chargegrille () Screen.MousePointer = 11 msg.Caption = "chargement en cours ....." initgrille Show splaf4.Refresh ' par defaut "liste vide" grille.Row = 1
grille.Col = 0 grille.Text = "(Liste vide)" Do nblignes = nblignes + 1 uneligne datatosend = "SUITE" Loop Until FIN = "O" grille.Row = 1 grille.Col = 0 msg.Caption = " " Screen.MousePointer = 0 End Sub ________________________________________ Sub refresh_click () 'BOUTON REFRESH chargegrille End Sub ________________________________________ Sub refreshm_Click () 'OPTION DU MENU OU F5 refresh_click End Sub ____________________________________________
Sub initgrille () ' Declare les variables locales. Dim col2 ' Efface le contenu de la grille. grille.Rows = 2 nblignes = 0 datatosend = "DEBUT" ' Reinitialise l'image dans la cellule 0, 0 grille.Row = 0 grille.Col = 0 ' Place les en-tetes de col dans la 1ere ligne. grille.Text = "Nom" grille.Col = 1 grille.Text = "Pages" grille.Col = 2 grille.Text = "Usrdta" grille.Col = 3 grille.Text = "Etat" grille.Col = 4 grille.Text = "Outq" 'Centre le texte dans la 1ere col. For col2 = 0 To 4
grille.FixedAlignment(col2) = 2 If largecol <> "O" Then grille.ColWidth(col2) = grille.ColWidth(col2) * 2 End IfSPLAF4.FRM - 3 Next col2 ' ne pas retailler les colonnes largecol = "O" ' msg liste en cours ... grille.Row = 1 grille.Col = 0 grille.Text = "En cours..." grille.Col = 1 grille.Text = "" grille.Col = 2 grille.Text = "" grille.Col = 3 grille.Text = "" grille.Col = 4 grille.Text = "" End Sub __________________________________________
Sub uneligne () 'RECUPERE UN SPOOL (DIALOGUE APPC) ' If there is no conversation active, it will be allocated at this time. Dim Header As String * 4 ' String to receive formatted header Dim record As String * 46 ' String to receive record from the AS/400 ' String to hold data to be sent If ConvId = 0 Then ' If conversation is not active rc% = Allocate() ' Allocate a conversation End If Call AsciiToEbcdic(datatosend) ' Convert data to EBCDICSPLAF4 If Send(datatosend) = 0 Then ' Send data to the AS/400 If RecvW(4, Header) = 0 Then ' Receive 4 byte header If RecvW(46, record) = 0 Then ' Receive 46 byte record Call EbcdicToAscii(record) ' Convert record to ASCII FIN = Left$(record, 1) If FIN <> "O" Then If nblignes > 1 Then grille.Rows = (nblignes + 1) End If grille.Row = nblignes grille.Col = 0 grille.Text = Mid$(record, 2, 10) ' nom
grille.Col = 1 grille.Text = Mid$(record, 12, 5) ' pages grille.Col = 2 grille.Text = Mid$(record, 17, 10) ' usrdta grille.Col = 3 grille.Text = Mid$(record, 27, 10) ' etat grille.Col = 4 grille.Text = Mid$(record, 37, 10) ' outq End If rc% = RecvW(0, GetSend$) ' Do one more receive to get change ' direction indicator (WhatReceived End If End If End If End Sub ________________________________________ Sub exit_click () 'BOUTON EXIT deallocate f3use = "O" End End Sub
________________________________________ Sub exitm_Click () 'OPTION DU MENU OU F3 exit_click End Sub ________________________________________ ' SORTIE DU PGM DEMANDEE Sub Form_QueryUnload (cancel As Integer, UnloadMode As Integer) If f3use <> "O" Then MsgBox "Conversations en cours, Utilisez Exit.", 16, "Attention" cancel = 1 End If End Sub ' FONCTION COPIÉES PARTIR DES OUTILS PCS (QIWSTOOL) ______________________________________________________ Function Allocate () As Integer ' This function allocates a conversation with AS/400 program ' splaf4CL in library AF4tool ' The conversation has the following characteristics: ' Mapped conversation ' 271 byte router buffer (minimum required)
' Sync Level - none ' No pip data ' If successful, the conversation ID is returned PipData$ = Chr$(0) ' This routine sends no pip data ' systeme par defaut getdefsys rc% = EHNAPPC_Allocate(hWnd, 271, EHNAPPC_MAPPED, EHNAPPC_SYNCLEVELNONE, sys me, "SPLAF4CL.AF4TOOL", 0, PipData$, ConvId) If rc% <> 0 Then FIN = "O" MsgBox ("Allocate impossible /code retour : " + Str$(rc%)) End If Allocate = rc% End Function ___________________________________________ Sub deallocate () ' This subroutine deallocates the active conversation ' specified in the ConvID global variableSPLAF4.FRM - 2 rc% = EHNAPPC_Deallocate(hWnd, ConvId, EHNAPPC_DEALLOCATESYNCLEVEL) End Sub Sub EbcdicToAscii (StrName As String)
' This routine converts a String from EBCDIC to ASCII Dim tlen As Integer Target$ = Space$(Len(StrName)) ' Initialize target string tlen = Len(Target$) ' Set target string length rc% = EHNDT_EBCDICToASCII(hWnd, StrName, Target$, Len(StrName), tlen) StrName = Left$(Target$, tlen) ' Move target to original string End Sub _________________________________________ Sub getdefsys () ' This routine gets the default system into variable DefSys$ sysname = Space$(10) rc% = EHNAPPC_GetDefaultSystem(hWnd, sysname) End Sub __________________________________________ Sub AsciiToEbcdic (StrName As String) ' This routine converts a String from ASCII to EBCDIC Dim tlen As Integer Target$ = Space$(Len(StrName)) ' Initialize target string tlen = Len(Target$) ' Set target string length rc% = EHNDT_ASCIIToEBCDIC(hWnd, StrName, Target$, Len(StrName), tlen) StrName = Left$(Target$, tlen) ' Move target to original string End Sub
_______________________________________ Function RecvW (Rlen As Integer, buff As String) As Integer ' This function Receives data from the Router for the length specified ' and returns it in the string specified. IntBuff$ = Space$(Rlen) ' Set up an intermediate buffer to receive data rc% = EHNAPPC_ReceiveAndWait(hWnd, ConvId, EHNAPPC_BUFFER, Rlen, IntBuff$, W tRec%, Rts%, ActLen%) If rc% <> 0 Then FIN = "O" MsgBox ("Reception en erreur / code retour : " + Str$(rc%)) Else buff = Left$(IntBuff$, ActLen%) ' Move received data to output string Rlen = ActLen% ' Return actual length End If RecvW = rc% ' Return return code End Function _______________________________________ Function Send (Sdata As String) As Integer ' This function sends the specified data to the AS/400 ' It does not wait for a reply ' The data sent will be preceeded by the proper GDS header (llID) Dim GDSHdr As String * 4 ' GDS Header
Dim FData As String ' Formatted Data (header + data) Call flip(Len(Sdata) + 4, Dlen$) ' Get length into proper forma GDSHdr = Dlen$ + Chr$(&H12) + Chr$(&HFF) ' Format of GDS header is llID ere ID=x'12FF' FData = GDSHdr + Sdata ' Put together formatted data rc% = EHNAPPC_SendData(hWnd, ConvId, Len(FData), FData, rqs%) If rc% <> 0 Then FIN = "O" MsgBox ("Envoi en erreur / code retour : " + Str$(rc%)) End If Send = rc% ' Return return code End Function PGM CL appellé par SPLAF4.EXE sur le micro: PGM MONMSG CPF0000 ADDLIBLE AF4TOOL CALL SPLAF4 ENDPGM
RPG utilisant le fichier ICF * * Ce pgm dialogue avec un pgm sur micro via fichier ICF * * il recoit le code "DEBUT" OU "SUITE" * --> renvoi la LISTE DES SPOOLS H FSPLICF CF E WORKSTN F KNUM 1 F KINFDS FEEDBK F KINFSR EXCPTH IFEEDBK DS I 38 45 FMTNM I 401 404 MAJMIN I 401 402 MAJCOD I 403 404 MINCOD IPAGA DS I 1 50PAGDEC * QUSLSPL ****************************************************** ILIST DS I 51 66 JOBID I 67 82 SPLFID
* QUSRSPLA ***************************************************** IRCVVAR DS I B 1 40BYTRTN I B 5 80BYTVAL I 67 76 NOM I 91 100 USRDTA I 101 110 ETAT I B 141 1440PAGEB I 183 192 OUTQ **************************************************************** * ENTETE USER SPACE IRTVINF DS I B 1 40OFFS I B 5 80TAILLE I B 9 120NBSPL I B 13 160LGPOST * DECLARATION DE VARIABLES BINAIRES IBINDS DS I B 1 40DEBUT I B 5 80LG I B 9 120LGRCV I I 192 B 13 160LGVAR
I I 0 B 17 200RCVSPN * QUALIF/ USER SPACE ET CMDE IQUALDS DS I I 'SPLAF4' 1 10 SPCNAM I I 'QTEMP' 11 20 SPCLIB I 1 20 USRSPC * CODE ERREUR API IERRDS DS I B 1 40LGDS I B 5 80LGERR I 9 15 MSGID I 16 16 RESERV C* DEBUT DU PGM * C 'SPLDEV' ACQ SPLICF c* création du *USRSPC et lecture du fichier ICF C EXSR CRTUS C READ CODEF 88 C *IN82 DOWEQ*OFF C *IN66 ANDEQ*OFF * premier appel ou REFRESH C CODE CASEQ'DEBUT' INIT C ENDCS
C EXSR LECTUR C WRITEENVOIF * C READ CODEF 88 C ENDDO C* Demande de fin de travail par le micro (66 =erreur, 82 = DETACH) C 'SPLDEV' REL SPLICF C CLOSE*ALL C ARRET TAG C EXSR DLTUS C MOVE *ON *INLR C RETRN * * C* Sous programme de gestion des erreurs/ fichier ICF * C EXCPTH BEGSR C MAJCOD IFGT '00' C GOTO ARRET C ENDIF C ENDSR * C CRTUS BEGSR
C MOVEL'LISTSPL 'EXT 10 C Z-ADD1024 TAILLE C MOVE ' ' INT 10 C MOVEL'*USE' AUT 10 C MOVEL' ' TXT 50 * dlt du user space si présent dans QTEMP C EXSR DLTUS * CREATION USER SPACE PAR API QUSCRTUS C CALL 'QUSCRTUS' C PARM USRSPC C PARM EXT C PARM TAILLE C PARM INT C PARM AUT C PARM TXT C ENDSR C INIT BEGSR * REMPLISSAGE DU USER SPACE VIA API C CALL 'QUSLSPL' 99 C PARM USRSPC C PARM 'SPLF0100'FMT 8 C PARM '*CURRENT'PROFIL 10
C PARM '*ALL' POUTQ 20 C PARM '*ALL' PFORM 10 C PARM '*ALL' PUSRD 10 C *IN99 IFEQ *ON C Z-ADD0 NBSPL C ELSE * EXTRACTION DES INFOS D'ENTETE (donne le nombre de spools) C Z-ADD125 DEBUT C Z-ADD16 LG C CALL 'QUSRTVUS' C PARM USRSPC C PARM DEBUT C PARM LG C PARM RTVINF C ENDIF C NBSPL IFGT 0 C Z-ADDLGPOST LG C OFFS ADD 1 DEBUT 1ER POSITION C ENDIF C Z-ADD0 NBLU 50 C ENDSR *
* LECTURE D'UN SPOOL C LECTUR BEGSR C ADD 1 NBLU C NBLU IFGT NBSPL C MOVE 'O' FIN C ELSE C MOVE 'N' FIN * EXTRACTION D'UN POSTE PAR API QUSRTVUS (-> DONNE LE NOM ) C CALL 'QUSRTVUS' C PARM USRSPC C PARM DEBUT C PARM LG C PARM LIST C CALL 'QUSRSPLA' 98 détails C PARM RCVVAR C PARM LGVAR C PARM 'SPLA0100'FMT C PARM '*INT' RCVJOB 26 C PARM JOBID C PARM SPLFID C PARM '*INT' RCVSPL 10 C PARM RCVSPN
* C *IN98 IFEQ *OFF C Z-ADDPAGEB PAGDEC C ELSE C MOVEL' *ERR' NOM C MOVE *BLANK PAGA C MOVE *BLANK USRDTA C MOVE *BLANK ETAT C MOVE *BLANK OUTQ C ENDIF * C ADD LG DEBUT C ENDIF C ENDSR * C DLTUS BEGSR * DLT DU USER SPACE (Y COMPRIS EN CAS DE PLANTUS) API QUSDLTUS C Z-ADD16 LGDS C CALL 'QUSDLTUS' 99 C PARM USRSPC C PARM ERRDS C ENDSR
Source du fichier ICF (+ passer la commande, après la création) ADDICFDEVE FILE(SPLICF) PGMDEV(SPLAF4) RMTLOCNAME(*REQUESTER) A INDARA * 66 = erreur A RCVFAIL(66) * format lu par le pgm RPG (reception d'informations) A R CODEF * 82 = demande d'arret de la conversation de la part du micro * (sinon CODE contient "DEBUT" OU "SUITE" A RCVDETACH(82) A CODE 5A A * format écrit par le pgm RPG (envoi d'informations) A R ENVOIF A FIN 1A A NOM 10A A PAGA 5A A USRDTA 10A A ETAT 10A A OUTQ 10A