Изменить 1: В соответствии с предложениями @ NicC в разделе «Комментарии» этого ответа вы можете попробовать следующий код:
INREC IFTHEN=(WHEN=INIT,BUILD=(1,16)),
IFTHEN=(WHEN=(13,1,CH,NE,X'40',AND,13,1,CH,NE,X'00'),OVERLAY=(5:8C'-'))
SORT FIELDS=COPY
В качестве альтернативы, вытакже можете попробовать следующий код.
Во-первых, мы используем OUTFIL
с FTOV,VLTRIM=C' '
для преобразования входных записей в VB с RDW.Это полезно, потому что мы можем получить доступ к RDW, чтобы получить длину данных до первого непустого символа.Но, как получить доступ к RDW? См. Следующий шаг.
Во-вторых, мы строим запись в файле T2 с фактическими данными, за которыми следует длина данных (RDW находится в 1,2,BI
. Вычтите 4 из 1,2,BI
, чтобы получить длину данных).
Наконец, используйте INREC IFTHEN
, чтобы проверить, равна ли длина данных GE
13 или нет.Отформатируйте данные как требуется.
Примечание: Следующий код необходимо изменить для имен DD, положения поля длиной 16 цифр и других полей ввода в записи.
//STEP1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN DD DSN=... input file (FB)
//TEMP1 DD DSN=&&TEMP1,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//TEMP2 DD DSN=&&TEMP2,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//OUT DD DSN=... output file (FB)
//TOOLIN DD *
COPY FROM(IN) USING(CTL1)
COPY FROM(TEMP1) TO(TEMP2) USING(CTL2)
COPY FROM(TEMP2) TO(OUT) USING(CTL3)
/*
//CTL1CNTL DD *
OUTFIL FNAMES=TEMP1,FTOV,VLTRIM=C' '
/*
//CTL2CNTL DD *
OUTFIL FNAMES=TEMP2,VTOF,
BUILD=(5,16,X,1,2,BI,SUB,+4,TO=ZD,LENGTH=2)
/*
//CTL3CNTL DD *
INREC IFTHEN=(WHEN=(18,2,ZD,GE,13),BUILD=(1:1,4,5:8C'-',13:13,4),
IFTHEN=(WHEN=(18,2,ZD,LT,13),BUILD=(1:1,6))
SORT FIELDS=COPY