mainframerexx

Writing rexx output logically to a dataset using EXECIO?


I have this Rexx program which I want to write the output to a particular dataset. However I can't get to print the exact output produced on the terminal to the dataset.

/* REXX */
"FREE FI(outdd)"
"ALLOC FI(outdd) DA('Z01510.OUTPUT(SAMPLCBL)') SHR REUSE" 
row = 0
hline = '      *-----------------------'
mline.0 = '       IDENTIFICATION DIVISION.'
mline.1 = '      *'
mline.2 = '       PROGRAM-ID. '
mline.3 = '      *'
mline.4 = '      *'
mline.5 = '      * Description :'
mline.6 = '      *'
mline.7 = '      * Created on : 'date()
mline.8 = '      * Created by : '
mline.9 = '      *            : Userid('')'
mline.10 = '      *            : Using' '()'
mline.11 = '      *'
mline.12 = '      * Called by :'
mline.13 = '      *'
mline.14 = '      * Calls :'
mline.15 = '      * Change Activity :'
mline.16 = '      *             ©Copyright of -----.'
mline.17 = '       ENVIRONMENT DIVISION.'
mline.18 = '       INPUT-OUTPUT SECTION.'
mline.19 = '       DATA DIVISION.'
mline.20 = '       WORKING-STORAGE SECTION.'
mline.21 = '       LINKAGE SECTION.'
mline.22 = '       PROCEDURE DIVISION.'
mline.23 = '       A-MAIN SECTION.'
mline.24 = '           STOP RUN.'

mline.25 = '      *           End of '
say hline
say mline.0
say hline
say mline.2
say hline
do i = 4 to 16
    say mline.i
end
say hline
do i=17 to 24
    say mline.i
    say hline
end
say mline.25
"EXECIO * DISKW outdd (STEM mline."
"EXECIO 0 DISKW outdd (FINIS"
"FREE FI(outdd)" 
exit

I run the Rexx script on the z/OS terminal and I get the following sample output which I want copied to the dataset in the exact same way.

    *-----------------------
       IDENTIFICATION DIVISION.
      *-----------------------
       PROGRAM-ID.
      *-----------------------
      *
      * Description :
      *
      * Created on : 14 Oct 2020
      * Created by :
      *            : Userid(')
      *            : Using ()
      *
      * Called by :
      *
      * Calls :
      * Change Activity :
      *             ©Copyright of -----.
      *-----------------------
       ENVIRONMENT DIVISION.
      *-----------------------
       INPUT-OUTPUT SECTION.
      *-----------------------
       DATA DIVISION.
      *-----------------------
       WORKING-STORAGE SECTION.
      *-----------------------
       LINKAGE SECTION.
      *-----------------------
       PROCEDURE DIVISION.
      *-----------------------
       A-MAIN SECTION.
      *-----------------------
           STOP RUN.
      *-----------------------
      *           End of

Solution

  • There's a few ways to achieve what you're looking for, but the easiest way would likely be to:

    1. Replace each say with QUEUE to place the lines on the stack
    2. Change EXECIO to accommodate writing out the stack
    3. Clear the stack with DELSTACK

    So, your script would look like this:

    /* REXX */                                                                      
    "FREE FI(outdd)"                                                                
    "ALLOC FI(outdd) DA('Z01510.OUTPUT(SAMPLCBL)') SHR REUSE"               
    row = 0                                                                         
    hline = '      *-----------------------'                                        
    mline.0 = '       IDENTIFICATION DIVISION.'                                     
    mline.1 = '      *'                                                             
    mline.2 = '       PROGRAM-ID. '                                                 
    mline.3 = '      *'                                                             
    mline.4 = '      *'                                                             
    mline.5 = '      * Description :'                                               
    mline.6 = '      *'                                                             
    mline.7 = '      * Created on : 'date()                                         
    mline.8 = '      * Created by : '                                               
    mline.9 = '      *            : Userid('')'                                     
    mline.10 = '      *            : Using' '()'                                    
    mline.11 = '      *'                                                            
    mline.12 = '      * Called by :'                                                
    mline.13 = '      *'                                                            
    mline.14 = '      * Calls :'                                                    
    mline.15 = '      * Change Activity :'                                          
    mline.16 = '      *             Copyright of -----.'                            
    mline.17 = '       ENVIRONMENT DIVISION.'                                       
    mline.18 = '       INPUT-OUTPUT SECTION.'                                       
    mline.19 = '       DATA DIVISION.'                                              
    mline.20 = '       WORKING-STORAGE SECTION.'                                    
    mline.21 = '       LINKAGE SECTION.'                                            
    mline.22 = '       PROCEDURE DIVISION.'                                         
    mline.23 = '       A-MAIN SECTION.'                                             
    mline.24 = '           STOP RUN.'                                               
                                                                                    
    mline.25 = '      *           End of '                                          
    QUEUE hline                                                                     
    QUEUE mline.0                                                                   
    QUEUE hline                                                                     
    QUEUE mline.2                                                                   
    QUEUE hline                                                                     
    do i = 4 to 16                                                                  
        QUEUE mline.i                                                               
    end                                                                             
    QUEUE hline                                                                     
    do i=17 to 24                                                                   
        QUEUE mline.i                                                               
        QUEUE hline                                                                 
    end                                                                             
    QUEUE mline.25                                                                  
    "Execio "Queued()" DISKW outdd (FINIS"                                          
    "FREE FI(outdd)"                                                                
    "DELSTACK"                                                                      
    exit