h nomain copyright('Serge GOMES') h Option( *SrcStmt ) FQSYSPRT O F 198 PRINTER OFLIND(*INOF) USROPN *--------------------------------------------------------------------------------------------* * Programme de SERVICE BUFSCRSRV => * Utilisation de Dynamic Screen Manager APIs *--------------------------------------------------------------------------------------------* * Compilation CrtRPGMod Module(BIB/BUFSCRSRV) * SrcFile(BIB/QRPGLESRC) * CrtSrvPgm SrvPgm(BIB/BUFSCRSRV) * SRCFILE(QSRVSRC) * ACTGRP(*CALLER) *--------------------------------------------------------------------------------------------* /COPY SERGE/PROTOTYPE,BUFSCRSRV *--------------------------------------------------------------------------------------------* dZLIBUF s 136 inz dSystemeDS SDS d nompgm 10 overlay(systemeDS) d nomjob 10 overlay(systemeDS:244) d user 10 overlay(systemeDS:254) d jobnbr 6 overlay(systemeDS:264) d QCmdExc pr extpgm('QCMDEXC') d Cmd 256a const d Length 15p 5 const *--------------------------------------------------------------------------------------------* *?CrtInputBuffer - API to create screen input buffer d CrtInputBuffer PR 10I 0 ExtProc( 'QsnCrtInpBuf' ) d 10I 0 d 10I 0 Options( *Omit ) d 10I 0 Options( *Omit ) d 10I 0 Options( *Omit ) d 272 Options( *Omit ) *?ReadScreen - API to read screen image - d ReadScreen PR 10I 0 ExtProc( 'QsnReadScr' ) d 10I 0 Options( *Omit ) d 10I 0 Options( *Omit ) d 10I 0 Options( *Omit ) d 10I 0 Options( *Omit ) d 272 Options( *Omit ) *?RtvBufferPtr - API to retrieve pointer to input buffer data d RtvBufferPtr PR * ExtProc( 'QsnRtvDta' ) d 10I 0 d * Options( *Omit ) d 272 Options( *Omit ) *--------------------------------------------------------------------------------------------* OQSYSPRT E OF TITBUF 1 1 O ZLIBUF 136 OQSYSPRT E DETBUF 0 O ZLIBUF 136 OQSYSPRT E SOUBUF 1 O ZLIBUF 136 *--------------------------------------------------------------------------------------------* *?Procédure RtvScr *?Description... Capture et Récup du buffer écran *--------------------------------------------------------------------------------------------* P RtvScr B Export d RtvScr PI 3565A d TypeEcran 1A d P_deb 2 0 Options( *NoPass ) d P_fin 2 0 Options( *NoPass ) d APIError 272 Options( *NoPass ) * - Variables de travail - d BufferEcran s 3565 inz(*blank) d BufferHdl S 10I 0 * 80*24 => 1920 132*27 => 3564 d BufferSize S 10I 0 Inz( 0 ) d BufferIncr S 10I 0 Inz( 0 ) d NbrBytesRead S 10I 0 d BufferPtr S * INZ d BufferDtaFld S 3565 Based(BufferPtr) d BufferDta S 3565 d BufferPos S 10I 0 Inz(1) d PosDeb S 10I 0 Inz(0) d LngFin S 10I 0 Inz(0) d NoAPIError C Const( *Zero ) d APIErrorPassed S 1N d Buffer80 S 80 Inz(*Blanks) d Buffer132 S 132 Inz(*Blanks) d NbrBytesParm S 10I 0 Inz(0) d LigDeb S 2 0 inz(0) d LigFin S 2 0 inz(0) d APIErrorDS DS d BytesProvided 10I 0 Inz( %Size( APIErrorDS ) ) d BytesAvail 10I 0 Inz( *Zero ) d MsgID 7 Inz( *Blanks ) d Reserved 1 Inz( X'00' ) d MsgDta 256 Inz( *Blanks ) * - Determine si le param API error à été transmis c If %Parms >= 4 c Eval APIErrorPassed = *On c EndIf c if %Parms >=3 c Eval LigDeb = P_deb c Eval LigFin = P_fin c EndIf c If TypeEcran = '1' * Ecran 80*24 c Eval BufferSize = 1920 c Eval BufferIncr = 1920 c Else * Ecran 132*27 c Eval BufferSize = 3564 c Eval BufferIncr = 3564 c End *--------------------------------------------------------------------------------------------* * - Create input buffer * *--------------------------------------------------------------------------------------------* c Reset APIErrorDS c Eval BufferHdl = CrtInputBuffer( c BufferSize : c BufferIncr : c *Omit : c *Omit : c APIErrorDS c ) c If BytesAvail <> NoAPIError c ExSr ReturnStatus c EndIf *--------------------------------------------------------------------------------------------* * - Read screen image * *--------------------------------------------------------------------------------------------* c Reset APIErrorDS c Eval NbrBytesRead = ReadScreen( c *Omit : c BufferHdl : c *Omit : c *Omit : c APIErrorDS c ) c If BytesAvail <> NoAPIError c ExSr ReturnStatus c EndIf * - Retrieve pointer to buffer data - c Reset APIErrorDS c Eval BufferPtr = RtvBufferPtr( c BufferHdl : c *Omit : c APIErrorDS c ) c If BytesAvail <> NoAPIError c ExSr ReturnStatus c EndIf * Retrieve input buffer data - c Eval BufferDta = BufferDtaFld c Eval BufferEcran = *Blanks c ExSr CalculPos c Eval BufferEcran = %Subst(BufferDta:PosDeb:LngFin) c ExSr ReturnStatus *--------------------------------------------------------------------------------------------* c ReturnStatus BegSr c If APIErrorPassed c Eval APIError = APIErrorDS c EndIf c Return BufferEcran c EndSr *--------------------------------------------------------------------------------------------* c CalculPos BegSr c Eval PosDeb=0 c Eval LngFin=0 c If TypeEcran = '1' c If LigDeb > 0 And LigDeb < 25 c Eval PosDeb = (LigDeb * 80) - 79 c Endif c If LigFin > 0 And LigFin < 25 c Eval LngFin = ((LigFin * 80) - PosDeb) + 1 c Endif c Else * TypeEcran = '2' c If LigDeb > 0 And LigDeb < 28 c Eval PosDeb = (LigDeb * 132) - 131 c Endif c If LigFin > 0 And LigFin < 28 c Eval LngFin = ((LigFin * 132) - PosDeb) + 1 c Endif c Endif c If PosDeb <= 0 Or LngFin <= 0 c Eval PosDeb = 1 c EndIf c If LngFin = 0 c If TypeEcran = '1' c Eval LngFin = 80 * 24 c Else c Eval LngFin = 132 * 27 c Endif c EndIf c EndSr P RtvScr E *--------------------------------------------------------------------------------------------* *?Procédure BufPrt * *?Description... Edition du buffer écran * *--------------------------------------------------------------------------------------------* * PARAMETRES : * 1 - TIMESTAMP capture 26 Z * 2 - Colonne de début de la capture 2;0 * 3 - Colonne de fin de la capture 2;0 * 4 - Editer cadre capture N * 5 - Supprimer le buffer d'écran dans BASBUF O/N N * 6 - User de la capture 10 A *--------------------------------------------------------------------------------------------* P BufPrt B export d BufPrt PI dP_time z dP_coldeb 2 0 options(*nopass) dP_colfin 2 0 options(*nopass) dP_cadre n options(*nopass) dP_supbuf n options(*nopass) dP_user 10a options(*nopass) d Caract DS d 1a Inz(X'24' ) d 1a Inz(X'25') d 1a Inz(X'26') d 1a Inz(X'2C') d 1a Inz(X'2D') d 1a Inz(X'2E') d 1a Inz(X'34') d 1a Inz(X'35') d 1a Inz(X'36') d 1a Inz(X'3C') d 1a Inz(X'3D') d 1a Inz(X'3E') d 1a Inz(X'20') d 1a Inz(X'21') d 1a Inz(X'22') d 1a Inz(X'23') d 1a Inz(X'27') d 1a Inz(X'28') d 1a Inz(X'29') d 1a Inz(X'2A') d 1a Inz(X'2B') d 1a Inz(X'30') d 1a Inz(X'31') d 1a Inz(X'32') d 1a Inz(X'33') d 1a Inz(X'37') d 1a Inz(X'38') d 1a Inz(X'39') d 1a Inz(X'3A') d 1a Inz(X'3B') d 1a Inz(X'3C') d CarSpe 1 Dim(30) d Overlay(Caract) d Soulig 1 Dim(12) d Overlay(Caract) dW_coldeb s 2 0 inz(0) dW_colfin s 2 0 inz(0) dW_cadre s n inz(*on) dW_supbuf s n inz(*on) dW_user s 10a inz dW_type s 1a inz('1') dW_titre s 136a inz(*blank) dW_buffer s 3565a inz(*blank) dlngScr s 3 0 inz(80) dW_car s 2 dW_soulig s 1 dW_deb S 3 0 dW_fin S 3 0 dW_ligbuf S 132 dW_slg S 136 inz(*blank) dW_pos S 5 0 dW_lng S 3 0 dmax_col S 3 0 inz(132) dmax_lig S 3 0 inz(27) dW_cmd s 256a dW_carspe s n dW_lig S 3 0 dW_y S 3 0 *------------------------------------------------------------------* c if %parms >= 3 c eval W_coldeb = P_coldeb c eval W_colfin = P_colfin c endif * c if %parms >= 4 c eval W_cadre = P_cadre c endif * c if %parms >= 5 c eval W_supbuf = P_supbuf c endif * c if %parms >= 6 c eval W_user = P_user c endif c if W_user = *blank c eval W_user = user c endif c/exec sql c+ Set Option Commit = *NONE, c+ DatFmt = *ISO, c+ TimFmt = *ISO, c+ DecMpt = *COMMA c/end-exec c/exec sql c+ Select TYPSCR, TITSCR, BUFSCR c+ into :W_type , :W_titre , : W_buffer c+ From BUFSCR Where c+ TIMSCR = :P_time and USRSCR = :W_user c/end-exec * c exsr OvrPrt c open QSYSPRT BI1 c if sqlcod = 0 *?OK BI2 c if W_type = '1' * Ecran 80 * 24 c eval max_lig = 24 c eval max_col = 80 EI2 c endIf c eval W_lng = max_col BI2 c if W_coldeb <> 0 AND c W_colfin <> 0 c eval W_lng = (W_colfin - W_coldeb)+ 1 EI2 c endIf c eval %subst(W_slg:1:W_lng+ 4)=*ALL'-' *?Edition du titre de l'état BI2 c if W_titre <> *blank BI3 c if %len(%trim(W_titre)) < W_lng c eval w_y = (W_lng - %len(%trim(W_titre)))/ 2 + 1 c eval %subst(ZLIBUF:W_y: c %len(%trim(W_titre))) = W_titre XI3 c else c eval ZLIBUF = W_titre EI3 c endIf c except TITBUF EI2 c endIf *?Edition du trait du cadre en haut de la page c eval ZLIBUF=*blank BI2 c if W_cadre c eval ZLIBUF =W_slg c except SOUBUF EI2 c endIf * c eval W_lig=1 BD2 c dow W_lig <= max_lig c eval ZLIBUF = *blank c eval W_pos=(W_lig * max_col) - max_col c + W_coldeb + 1 c eval W_ligbuf=%subst(W_buffer:W_pos:W_lng) * *?Traitement des caractères de soulignement BI3 c if W_ligbuf <> *BLANK c eval W_y = 1 c eval W_soulig = *blank c eval W_carspe = *off * BD4 c DOW W_y <= W_lng c eval W_car = %subst(W_ligbuf:W_y:1) * BI5 c if %lookup(W_CAR:CarSpe) > *zero c eval W_carspe = *on * BI6 c if %lookup(W_CAR:Soulig) > *zero c eval W_soulig = '_' XI6 c else c eval W_soulig = *blank EI6 c endIf EI5 c endIf * BI5 c if not W_carspe c eval %subst(ZLIBUF:W_y:1)= W_soulig XI5 c else c eval W_carspe = *off c eval %subst(ZLIBUF:W_y:1)= *blank EI5 c endIf c eval W_y = W_y + 1 c ED4 c endDo EI3 c endIf * Edition du format de soulignement c except SOUBUF *?Edition du format buffer écran BI2 c if W_cadre c eval ZLIBUF = '| '+ %subst(W_ligbuf:1:W_lng) + c ' |' c else c eval ZLIBUF = W_ligbuf c endif c except DETBUF c eval W_lig = W_lig + 1 ED2 c endDo *?Edition du trait du cadre en bas de la page BI2 c if W_cadre c eval ZLIBUF =W_slg c except SOUBUF EI2 c endIf *?Suppression du buffer BI2 c if W_supbuf c/exec sql c+ Delete From BUFSCR Where c+ TIMSCR = :P_time and USRSCR = :W_user c/end-exec EI2 c endIf XI1 c else *?ERREUR Edition du titre de l'état BI2 c if W_titre <> *blank c eval ZLIBUF = %subst(W_titre:max_col) c* eval ZPGM = nompgm c* eval ZUSER = user c except TITBUF EI2 c endIf * c eval ZLIBUF = *blank c except SOUBUF c c eval ZLIBUF='Aucune sélection: le contenu entier'+ c ' du fichier sera imprimé' c except DETBUF EI1 c endIf c close QSYSPRT c exsr OvrDlt c return *------------------------------------------------------------------------- c OvrPrt BegSr c eval W_cmd=*blank BI01 c if W_cadre and W_type='2' c eval W_cmd = 'OVRPRTF FILE(QSYSPRT) ' + c 'PAGESIZE(66 198 *ROWCOL)' XI01 c else c eval W_cmd = 'OVRPRTF FILE(QSYSPRT) ' + c 'PAGESIZE(66 132 *ROWCOL)' EI01 c EndIf c callp QCmdExc (W_cmd: %size(W_cmd)) c EndSr *------------------------------------------------------------------------- c OvrDlt BegSr c eval W_cmd=*blank c eval W_cmd = 'DLTOVR FILE(QSYSPRT)' c callp QCmdExc (W_cmd: %size(W_cmd)) c EndSr P BufPrt E *?------------------------------------------------------------------------------------------?* *?Procédure BufIns *?Description... Inscription buffer dans BASBUF (renvoi un TIMESTANMP) *?------------------------------------------------------------------------------------------?* * PARAMETRES : * 1- 1A Type Ecran '1'=80 colonnes '2'=132colones OBLIGATOIRE * 2- 3565A Buffer écran OBLIGATOIRE * 3- 136A Titre capture OPTIONNEL * 4- 10A User capture OPTIONNEL *?------------------------------------------------------------------------------------------?* *?Inscription Buffer P BufIns B Export d BufIns PI z d P_type 1A d P_buffer 3565A d P_titre 136A Options( *NoPass ) d P_user 10A Options( *NoPass ) dW_time s z inz(*loval) dW_user s 10A dW_tit s 136A inz(*blank) c if %parms >= 4 c eval W_user = P_user c endif c if W_user = *blank c eval W_user = user c endif c if %parms >= 3 c eval W_tit = P_titre c endif * c/exec sql c+ SET :W_time = now() c/end-exec c Eval W_time = W_time c/exec sql c+ INSERT INTO BUFSCR (USRSCR, TITSCR, TIMSCR, TYPSCR, BUFSCR) c+ VALUES(:W_user, :W_tit , :W_time, :P_type , c+ :P_buffer ) c/end-exec c if sqlcod <> 0 c eval W_time = *loval c endif c Return W_time P BufIns E