Demonstrate a technique where a sub file appears to have multiple record format.
Subfile of the third kind - "Flexible subfile"
Subfiles have been around for many years now. Almost any programmer uses them.
There are two familiar techniques to use subfiles:
SFLPAG *EQ SFLSIZ
-----------------
Pro
----
- Field conditioning, thus allowing different record format.
Con
----
- The subfile record can become quite complex due of the heavy use of indicators.
- Each page scrolling requires the program to go back to the database to fetch records. (Most application do not need that.)
- If you use option field (Work with screen design) you have to use
extra code to remember the marked records. (Since you have to clear the subfile every time there is a need to scroll.)
SFLPAG *NE SFLSIZ
-----------------
Pro
----
- Easy to implement.
- Allow for forward page at the time scrolling (performance benefit).
- Marked records are retained.
Con
----
- Field conditioning is a no no!
As you can see neither technique is perfect.
It seems that we need field conditioning on "SFLPAG *NE SFLSIZ"
May I introduce you to "Flexible subfile"?
Flexible subfile
-----------------
In the subfile record I created a single SFLLIN field, which will be filled using the eval
operation, This field will be visible to the user.
Display file DEM01102
As you can see I code the data base fields as hidden fields,
those fields will be available for future READC operation.
A DSPSIZ(27 132 *DS4)
A CHGINPDFT(UL)
A MSGLOC(24)
A PRINT
A R S0R10 SFL
A RECID 10A H TEXT('Record Id')
A ORDER R H REFFLD(ORDHDR/ORDER *LIBL/QORDHDR)
A CUST R H REFFLD(ORDHDR/CUST *LIBL/QORDHDR)
A ORDDAT R H REFFLD(ORDHDR/ORDDAT *LIBL/QORDHDR)
A SHPVIA R H REFFLD(ORDHDR/SHPVIA *LIBL/QORDHDR)
A ORDSTS R H REFFLD(ORDHDR/ORDSTS *LIBL/QORDHDR)
A ORDAMT R H REFFLD(ORDHDR/ORDAMT *LIBL/QORDHDR)
A TOTLIN R H REFFLD(ORDHDR/TOTLIN *LIBL/QORDHDR)
A INVNUM R H REFFLD(ORDHDR/INVNUM *LIBL/QORDHDR)
A QTYORD R H REFFLD(ORDDTL/QTYORD *LIBL/QORDDTL)
A PARTNO R H REFFLD(ORDDTL/PARTNO *LIBL/QORDDTL)
A PARTDESC R H REFFLD(ORDDTL/PARTDESC *LIBL/QORDDT-
A L)
A UNITAMT R H REFFLD(ORDDTL/UNITAMT *LIBL/QORDDTL)
A TOTAMT R H REFFLD(ORDDTL/TOTAMT *LIBL/QORDDTL)
A USEOPT 1Y 0B 7 2DSPATR(CS)
A EDTCDE(Z)
* The output fields
A SFLLIN 128A O 7 4
A R S0C10 SFLCTL(S0R10)
A SFLSIZ(0032)
A SFLPAG(0018)
A 41 SFLDSP
A 42 SFLDSPCTL
A C10DR 4S 0H SFLRCDNBR(CURSOR)
A C10AR 4S 0H TEXT('Active record')
Program DEM01102
- The Hex fields (x'21',X'29') are display attributes that
can be used (Yes ! we do color !!!).
- Numeric fields are edited as part of the eval operation using
%EDITC and %EDITW function.
FDEM01102 cf e workstn sfile(s0r10:c10ar)
*
*
* files qordhdr & qordhdr are usuly found at QGPL
fqordhdr if e k disk
fqordhdr if e k disk
*
Ddspatr01 s 1
*
C *entry plist
c parm order
*
c klist02 klist
c kfld order
*
C klist02 chain QORDHDR
*
C eval dspatr01 = x'21'
* Compose the header string
* Field RECID can be used later for record identification
* when using READC operation
B01 C if %found
01 C eval RECID = 'ORDHDR'
01 c eval sfllin =
01 C 'Customer number:' +
01 C CUST + ' ' +
01 C 'Order number:' + %EDITC(ORDER:'Z') + ' ' +
01 C 'Dated:' + %EDITW(ORDDAT:' / / ') + ' ' +
01 c 'Ship via:'+ dspatr01 + shpvia + x'20' +
01 C 'Total items in order:' + %EDITC(TOTLIN:'Z')
E01 C ENDIF
*
c eval c10ar = c10ar + 1
c write s0r10
*
* Create empty line
c eval c10ar = c10ar + 1
*
* Loop on the detail records
C klist02 setll QORDDTL
*
B01 C dou %eof(QORDDTL)
01 *
01 C klist02 reade QORDDTL
01 *
B02 C if %eof(QORDDTL)
02 C leave
E02 C EndIf
*
01 * Compose the detail string
01 C eval RECID = 'ORDDTL'
01 c eval sfllin =
01 C ' ' + X'29' + 'Low' + X'20'+
01 C 'Part number:' + %EDITC(PARTNO:'Z') + ' ' +
01 C PARTDESC +
01 C 'Order quantity:' + %EDITC(QTYORD:'L')
01 *
01 c eval c10ar = c10ar + 1
01 c write s0r10
01 *
E01 C EndDo
*
* Show the masterpiece
C eval *in41 = *on
C eval *in42 = *on
C eval c10dr = 1
C exfmt S0C10
*
C eval *inlr = *on
*
Command DEM01102 (Make calling program easier)
CMD PROMPT('Order Display')
PARM KWD(ORDER) TYPE(*DEC) LEN(5 0) PROMPT('Order +
number')
This was first published in July 2002