Problem solve Get help with specific problems with your technologies, process and projects.

Get the most out of flexible subfiles

Demonstrate a technique where a sub file appears to have multiple record format.

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:

- 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.)

- Easy to implement.
- Allow for forward page at the time scrolling (performance benefit).
- Marked records are retained.
- 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                                      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 +

Dig Deeper on iSeries CL programming

Start the conversation

Send me notifications when other members comment.

Please create a username to comment.