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

Posted

技术标签:

【中文标题】使用 EXECIO 将 rexx 输出逻辑写入数据集?【英文标题】:Writing rexx output logically to a dataset using EXECIO? 【发布时间】:2020-10-14 15:37:02 【问题描述】:

我有这个 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

【问题讨论】:

您有答案,但这里有一个编码提示:如果您认为您想在 SAY 语句和 QUEUE 语句之间进行更改,请创建一个 output 子例程,将要输出的字符串传递给该子例程。在output 子例程中,SAY、QUEUE 或将传递的字符串分配给一个词干变量的下一个成员。然后在输出方法之间进行切换既快捷又简单。 这很有见地,谢谢 【参考方案1】:

您不应该将数据存储在 mline.0 中,而是存储词干尾数(mline.1 mline,2 等)并将其作为要写入的记录数传递给 EXECIO。使用 mline.0 并没有错,但“正常”的做法是将其用作计数 - 与 EXECIO 在读入词干时所做的相同。 如果您希望编写 hline,则需要先将其添加到 mline 词干的适当位置。

【讨论】:

确实,这是问题的核心。如果mline.0 不是mline. 中的行数,EXECIO * DISKW outdd (STEM mline. 不会写任何东西。【参考方案2】:

有几种方法可以实现您的目标,但最简单的方法可能是:

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

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

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

【讨论】:

您的编辑按预期工作,虽然我在终端上运行脚本后得到了这个信息:FILE OUTDD NOT FREED, IS NOT ALLOCATED @Fnechz - 该消息来自第一个 FREE FI(outdd) 语句,因为尚未分配数据集。您可以删除该声明。【参考方案3】:

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

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

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

【讨论】:

我希望 hline 变量出现在上面键入的每个分区上。如何按照我在示例终端输出中给出的有条不紊地打印 hline。【参考方案4】:

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

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

【讨论】:

我希望数据集中的输出显示为我在上面输入的内容,水平线(hline 变量)有条不紊地打印为我在上面给出的命令行终端输出

以上是关于使用 EXECIO 将 rexx 输出逻辑写入数据集?的主要内容,如果未能解决你的问题,请参考以下文章

REXX:将长字符串写入 pds 成员

从 DB2 命令获取 REXX 中的输出

用于打开、关闭、读取和写入文件到 TAPE 驱动器的 REXX 命令是啥?

如何使用 REXX 将作业日志保存到数据集中

存储过程 - 如何在 rexx 中获取数组作为输出

我可以使用 Rexx 在 zos 中读取数据集的分配参数吗?