Как отправить двоичный файл (в формате ebcdic) с переменными блоками (каждая запись имеет переменную длину) из системы unix в мейнфрейм unix через 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=$1
DEST_FILE=`basename $1`
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. Но ничего не может сделать на стороне мэйнфрейма клиента. Как я могу изменить свой скрипт для отправки файла в виде записей переменной длины?
PS: я прочитал все темы, связанные с этой темой. Я перепробовал почти 100 изменений за последние 3 месяца. Ничто действительно не работает для меня.
3 ответа
Странно.. Я много пробовал с 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=$1
DEST_FILE=`basename $1`
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_
Это странно, потому что ранее выдается ошибка типа "тип данных не VB". Но теперь он принял тип данных =VB после изменения RECFM и LREL.
Вы пробовали следующее:
setop01 copy from (
SYSOPTS=":DATATYPE=VB:"
file=$NDM_FILE
pnode
)
Вы должны использовать FB и установить размер блока.
Ваш формат записи VB на самом деле работает правильно, и поэтому он заполняет различные строки.
Как упоминалось ранее в @BillWoodger, вы отправляете его в структуру набора данных z/OS, когда указываете блок, recfm, циклиндеры, а не файловую структуру Unix z/OS, которая работает на мэйнфрейме (USS - Unix System Services), например 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%