使用 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 输出逻辑写入数据集?的主要内容,如果未能解决你的问题,请参考以下文章