使用 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。
有几种方法可以达到您的要求,但最简单的方法可能是:
- 将每个
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
我有这个 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。
有几种方法可以达到您的要求,但最简单的方法可能是:
- 将每个
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