Multiple Occurrence DS Use
Processing a multiple occurrence data structure.
In this example, the get diagnostics function of SQL is used to determine the number of rows there are to process. The FETCH then returns all the rows into a multiple occurrence data structure in a single FETCH. The data structure is then processed, using a FOR loop to move through the occurences.
**FREE ctl-Opt DEBUG(*YES) OPTION(*SRCSTMT : *NODEBUGIO) DFTACTGRP(*NO) Main(CSG078RP) EXTBININT(*YES) ActGrp('DLYRPT') BndDir( 'QC2LE' ); //******************************************************************** //* Program Name : CSG078RP * //* Program Description : CSG IMB missing scan summary * //* Date : 1/22/19 * //* Author : Steve Croy * //******************************************************************** //* * //* Modification Log * //* * //* Project Marker Date Description * //* * //******************************************************************** Dcl-F CSG078PR printer(*ext) oflind(*in73) usropn ; Dcl-PR Exit Extproc('exit') ; *N uns(3:0) value ; End-PR; Dcl-S indPtr pointer inz( %addr(*in) ) ; Dcl-DS indicators len(99) based( indPtr ) ; overFlowLine ind pos(73) ; End-DS ; Dcl-DS textRecords Occurs(366); trnDate zoned(8:0) ; unIndexed int(10) ; fileName char(8) ; END-DS; Dcl-DS imageRecords Occurs(700); idxDte char(10) ; idxRec int(10) ; csgName char(40) ; END-DS; Dcl-C SQLstsOK '00000' ; Dcl-C SQLstsEOF '02000' ; Dcl-S rows int(10) ; Dcl-S rowCount int(10) ; Dcl-S x int(10) ; Dcl-S billable zoned(9:2) ; Dcl-S records int(10) ; Dcl-S firstDate date ; Dcl-S lastDate date ; Dcl-S dateToday date ; Dcl-S printDate date ; Dcl-S fromDate zoned(8:0) ; Dcl-S toDate zoned(8:0) ; Dcl-S printJob char(8) ; Exec SQL set option Commit = *None, Naming = *Sys, DECRESULT = (63, 63, 0), datfmt = *ISO ; Dcl-Proc CSG078RP ; Dcl-PI *N extPgm('CSG078RP') ; sysPrint char(2) const ; startDate char(8) const options(*NoPASS) ; EndDate char(8) const options(*NoPASS) ; END-PI; Monitor ; If %parms < 3 ; firstDate = %date() ; lastDate = firstDate + %days(1) ; Else ; firstDate = %date(startDate:*ISO0) ; lastDate = %date(endDate:*ISO0) ; Endif ; On-error ; exit(0) ; EndMon ; fromDate = %dec(firstDate:*ISO) ; toDate = %dec(lastDate:*ISO) ; dateToday= %date() ; Clear *all TextRecords ; rowCount = 0 ; records = 0 ; Exec SQL Close CSG078c1 ; //* create cursor for report Exec SQL Declare CSG078c1 insensitive cursor for ( SELECT prtdate, count(*), substr(prpdffil,1,8) FROM csglogpf a Left join csgpompf b on A.PRGUID = B.PMGUID Where prtdate between :fromDate and :toDate and prpdffil like '%' concat :sysPrint concat '%' and b.pmguid is null Group by substr(prpdffil,1,8), prtdate Order by prtdate, substr(prpdffil,1,8) ) ; Exec SQL Open CSG078c1 ; EXEC SQL get diagnostics :rows = db2_number_rows; If not %open(CSG078pr) ; open CSG078pr ; EndIf ; Select ; When sysPrint = 'BB' ; mclass = 'Bulk Certificate' ; When sysPrint = 'BC' ; mclass = 'Proof of Mail' ; When sysPrint = 'BE' ; mclass = 'Certified' ; EndSl ; write CSG078h1 ; // Write title line write CSG078h2 ; // Write report heading If rows > 0 ; Exec SQL fetch CSG078c1 for :rows rows into :textRecords ; Exec SQL Close CSG078c1 ; totDue = 0 ; For x = 1 to rows ; %occur(textRecords) = x ; missing = unIndexed ; printDate = %date(trnDate:*ISO) ; ovrDue = %Diff(dateToday: printDate: *Days) ; misstot += unIndexed ; If overFlowLine ; write CSG078H1 ; write CSG078H2 ; overFlowLine = *Off ; Endif ; write CSG078d1 ; If ovrDue > 3 ; totDue += 1 ; Endif ; EndFor ; EndIf; write CSG078t1 ; // Write total line //******************************************************************** //* Missing image section * //******************************************************************** Select ; When sysPrint = 'BB' ; printJob = '76400010' ; When sysPrint = 'BC' ; printJob = '76400015' ; When sysPrint = 'BE' ; printJob = '76400025' ; EndSl ; Clear *all imageRecords ; rowCount = 0 ; records = 0 ; overFlowline = *On ; Exec SQL Close CSG078c2 ; Exec SQL Declare CSG078c2 insensitive cursor for ( SELECT pmpdte, count(*), substring(pmfile,1,40) as CSGNAME FROM csgpompf where pmpdte between :startDate and :endDate and pmindx <> 'Y' and pmfile like '%' concat :printJob concat '%' Group by pmfile,pmpdte Order by pmpdte ) ; Exec SQL Open CSG078c2 ; EXEC SQL get diagnostics :rows = db2_number_rows; write CSG078h1 ; // Write title line write CSG078h2 ; // Write report heading If rows > 0 ; Exec SQL fetch CSG078c2 for :rows rows into :imageRecords ; Exec SQL Close CSG078c2 ; totDue = 0 ; For x = 1 to rows ; %occur(imageRecords) = x ; printDate = %date(idxDte:*ISO0) ; idxDte = %char(printDate:*ISO) ; pstDue = %Diff(dateToday: printDate: *Days) ; idxCnt = idxRec ; idxtot += idxCnt ; If overFlowLine ; write CSG078H1 ; write CSG078H3 ; overFlowLine = *Off ; Endif ; write CSG078d2 ; imgCnt += 1 ; EndFor ; EndIf; write CSG078t2 ; // Write total line IF %open(CSG078pr) ; close CSG078pr ; EndIf ; *InLR = *On; exit(0) ; Return ; End-Proc CSG078RP ;