使用 EXECIO 将 rexx 输出逻辑写入数据集?

Writing rexx output logically to a dataset using EXECIO?

我有这个 Rexx 程序,我想将输出写入特定数据集。但是我无法将终端上产生的确切输出打印到数据集。

/* 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

我 运行 z/OS 终端上的 Rexx 脚本,我得到以下示例输出,我想以完全相同的方式将其复制到数据集。

    *-----------------------
       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

至少,你不应该使用mline.0。 EXECIO DISKW 将从 mline.1 开始写入,索引 0 被忽略。

除了这个问题,我没有看到任何输出错误,除非你想在输出文件中使用 hline 变量。在这种情况下,只需将 mline 索引与 hline 的内容插入正确的位置即可。

如果这不是您的问题,请更准确地描述“我无法打印准确的输出”是什么意思

我编辑了我之前的答案,所以它可以满足您的要求。这是调整后的答案:

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

do i = 1 to queued()
    parse pull line
    say line
    mline.i = line
end

rc = BPXWDYN( 'alloc fi(outdd) da(''Z01510.OUTPUT(SAMPLCBL)'') shr reuse' )
address 'MVS' 'EXECIO * DISKW' outdd '(finis stem mline.'
rc = BPXWDYN( 'free fi(outdd)' )
exit rc

您不应将数据存储在 mline.0 中,而应存储词干尾部的计数(mline.1 mline、2 等)并将其作为要写入的记录数传递给 EXECIO。使用 mline.0 并没有错,但 'normal' 实践是将其用作计数 - 与 EXECIO 在读入词干时所做的相同。 如果你想写你的hline,那么你需要先在适当的地方将它添加到mline stem。

有几种方法可以达到您的要求,但最简单的方法可能是:

  1. 将每个 say 替换为 QUEUE 以将行放在堆栈上
  2. 更改 EXECIO 以适应写出堆栈
  3. 使用DELSTACK
  4. 清除堆栈

因此,您的脚本将如下所示:

/* 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