如何通过NDM从unix系统向unix主机发送一个可变块(每条记录长度可变)的二进制(ebcdic格式)文件?
How to send a binary (ebcdic format) file with variable blocks (each record has variable length), from a unix system to a unix mainframe through NDM?
这是我的 NDM 脚本:
#!/bin/bash -x
#/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
#sub maxdelay=unlimited statemnt process snode=$DEST_NODE
export NDMAPICFG=/home/drone/ndmscripts/ndmapi.cfg
NDM_FILE=
DEST_FILE=`basename `
DEST_NODE=AAA
/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
sub maxdelay=unlimited testcopy process snode=$DEST_NODE snodeid=(BBB,123)
setop01 copy from (
SYSOPTS=":DATATYPE=BINARY:XLATE=NO:STRIP.BLANKS=NO:"
file=$NDM_FILE
pnode
)
COMPRESS EXTENDED
to (
DSN=$DEST_FILE(+1)
UNIT=(BATCH,2)
SPACE=(CYL,(500,500),RLSE)
DCB=(RECFM=VB,LRECL=726,BLKSIZE=0)
snode
)
pend;
_EOF_
我在这里将 LRECL 指定为 1004,因为最大记录长度为 1000。我将 RECFM 指定为 VB 以表示这是一个可变块记录。但仍然在 unix 大型机上,他们收到的文件是固定长度 1000。
我的前 3 条记录的长度分别为 132、32、1000。
它用前2条记录(164)和第三条记录的836位置填充第一行并将第三条记录的提醒放在第二行等等。
所以,我在 unix 大型机上的位置不匹配。
我只能在 unix 方面进行更改。但在客户端的 unix 大型机端无能为力。
如何更改我的脚本以将文件作为可变长度记录发送?
P.S : 我已经通读了与该主题相关的所有主题。在过去的 3 个月里,我尝试了将近 100 项更改。没有什么对我有用。
你必须使用 FB 并设置块大小。
您的 VB 记录格式实际上工作正常,这就是它填充不同行的原因。
正如@BillWoodger 之前提到的,当您指示 block、recfm、cyclinders 而不是 运行 上的 z/OS Unix 文件结构时,您将它发送到 z/OS 数据集结构大型机(USS - Unix 系统服务),例如 HFS 或 zFS。
我们在将 BIN 修复和 PTFS 上传到 z/OS 数据集文件结构时体验到这是我们的商店。如果我们采用默认值,它将变得一团糟,无法阅读。
我们必须 FTP 使用如下内容:
set pri=20
set sec=20
set proddataset=IPP.PROD
set dsntype=cylinders
set recfm=fb
set lrecl=27998
set blksize=27998
set volume=PPINS2
echo quote site pri=%pri% sec=%sec% %dsntype% recfm=%recfm% lrecl=%lrecl% blksize=%blksize% volume=%volume%
您是否尝试过以下方法:
setop01 copy from (
SYSOPTS=":DATATYPE=VB:"
file=$NDM_FILE
pnode
)
奇怪.. 我用 SYSOPTS=":DATATYPE=VB:" 尝试了很多,但没有任何效果。
然后我尝试将 RECFM 作为 VB 而不是 VBM(由 IBM 指定)并将 LRECL 作为 1004(我的报告的默认值)而不是 726(实际最大记录长度)并且它有效。
这是我的 NDM 脚本:
#!/bin/bash -x
#/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
#sub maxdelay=unlimited statemnt process snode=$DEST_NODE
export NDMAPICFG=/home/drone/ndmscripts/ndmapi.cfg
NDM_FILE=
DEST_FILE=`basename `
DEST_NODE=XXX
/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
sub maxdelay=unlimited testcopy process snode=$DEST_NODE snodeid=(AAA,123)
setop01 copy from (
SYSOPTS=":DATATYPE=VB:XLATE=NO:STRIP.BLANKS=NO:"
file=$NDM_FILE
pnode
)
COMPRESS EXTENDED
to (
DSN=$DEST_FILE(+1)
UNIT=(BATCH,2)
SPACE=(CYL,(500,500),RLSE)
DCB=(RECFM=VB,LRECL=1004,BLKSIZE=0)
snode
)
pend;
_EOF_
这很奇怪,因为之前它抛出了 "data type is not VB" 这样的错误。但现在它在更改 RECFM 和 LREL 后接受了数据类型=VB。
这是我的 NDM 脚本:
#!/bin/bash -x
#/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
#sub maxdelay=unlimited statemnt process snode=$DEST_NODE
export NDMAPICFG=/home/drone/ndmscripts/ndmapi.cfg
NDM_FILE=
DEST_FILE=`basename `
DEST_NODE=AAA
/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
sub maxdelay=unlimited testcopy process snode=$DEST_NODE snodeid=(BBB,123)
setop01 copy from (
SYSOPTS=":DATATYPE=BINARY:XLATE=NO:STRIP.BLANKS=NO:"
file=$NDM_FILE
pnode
)
COMPRESS EXTENDED
to (
DSN=$DEST_FILE(+1)
UNIT=(BATCH,2)
SPACE=(CYL,(500,500),RLSE)
DCB=(RECFM=VB,LRECL=726,BLKSIZE=0)
snode
)
pend;
_EOF_
我在这里将 LRECL 指定为 1004,因为最大记录长度为 1000。我将 RECFM 指定为 VB 以表示这是一个可变块记录。但仍然在 unix 大型机上,他们收到的文件是固定长度 1000。 我的前 3 条记录的长度分别为 132、32、1000。 它用前2条记录(164)和第三条记录的836位置填充第一行并将第三条记录的提醒放在第二行等等。 所以,我在 unix 大型机上的位置不匹配。 我只能在 unix 方面进行更改。但在客户端的 unix 大型机端无能为力。 如何更改我的脚本以将文件作为可变长度记录发送?
P.S : 我已经通读了与该主题相关的所有主题。在过去的 3 个月里,我尝试了将近 100 项更改。没有什么对我有用。
你必须使用 FB 并设置块大小。
您的 VB 记录格式实际上工作正常,这就是它填充不同行的原因。
正如@BillWoodger 之前提到的,当您指示 block、recfm、cyclinders 而不是 运行 上的 z/OS Unix 文件结构时,您将它发送到 z/OS 数据集结构大型机(USS - Unix 系统服务),例如 HFS 或 zFS。
我们在将 BIN 修复和 PTFS 上传到 z/OS 数据集文件结构时体验到这是我们的商店。如果我们采用默认值,它将变得一团糟,无法阅读。
我们必须 FTP 使用如下内容:
set pri=20
set sec=20
set proddataset=IPP.PROD
set dsntype=cylinders
set recfm=fb
set lrecl=27998
set blksize=27998
set volume=PPINS2
echo quote site pri=%pri% sec=%sec% %dsntype% recfm=%recfm% lrecl=%lrecl% blksize=%blksize% volume=%volume%
您是否尝试过以下方法:
setop01 copy from (
SYSOPTS=":DATATYPE=VB:"
file=$NDM_FILE
pnode
)
奇怪.. 我用 SYSOPTS=":DATATYPE=VB:" 尝试了很多,但没有任何效果。 然后我尝试将 RECFM 作为 VB 而不是 VBM(由 IBM 指定)并将 LRECL 作为 1004(我的报告的默认值)而不是 726(实际最大记录长度)并且它有效。
这是我的 NDM 脚本:
#!/bin/bash -x
#/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
#sub maxdelay=unlimited statemnt process snode=$DEST_NODE
export NDMAPICFG=/home/drone/ndmscripts/ndmapi.cfg
NDM_FILE=
DEST_FILE=`basename `
DEST_NODE=XXX
/cdunix/ndm/bin/ndmcli -x -e 4 << _EOF_
sub maxdelay=unlimited testcopy process snode=$DEST_NODE snodeid=(AAA,123)
setop01 copy from (
SYSOPTS=":DATATYPE=VB:XLATE=NO:STRIP.BLANKS=NO:"
file=$NDM_FILE
pnode
)
COMPRESS EXTENDED
to (
DSN=$DEST_FILE(+1)
UNIT=(BATCH,2)
SPACE=(CYL,(500,500),RLSE)
DCB=(RECFM=VB,LRECL=1004,BLKSIZE=0)
snode
)
pend;
_EOF_
这很奇怪,因为之前它抛出了 "data type is not VB" 这样的错误。但现在它在更改 RECFM 和 LREL 后接受了数据类型=VB。