Передача значения символа с помощью DFSORT в файл

Заявление: ранее файлы загружались с удаленного сервера на мейнфрейм. Затем содержимое этих файлов было получено и сохранено на мейнфрейме в последовательном файле. Но иногда имена некоторых файлов содержали пробелы. Из-за этого задание не удается получить его содержимое.

Теперь, чтобы решить эту проблему, мы получили все файлы с сервера и отделили хорошие файлы от плохих. Теперь мы получаем только хорошее содержимое файла.

Проблема: при переименовании файлов мы добавляем префикс Process_ и Odate (выбранный из Control M) к имени файла. Но раньше это делалось в jcl, как показано ниже, через unix-код.

Псевдокод: print "rename " $1 " " "Process_" %%DAT "_" $1

Мы получаем ODATE из программного управления-M.

Jcl-код:

//JOBNAME JOB (DEE),'Job Desc',CLASS=P,MSGCLASS=J,
//       MSGLEVEL=(1,1),COND=(0,NE)                           
//* %%SET  %%DAT = %%$ODATE
//STEP01 EXEC PROC1

Код PROC1:

//STEP02 EXEC PGM=SORT                                                               
//SORTIN   DD  DSN=DS.FILE1,        
//             DISP=SHR                     
//SORTOUT  DD  DSN=DS.FILE2,     
//             UNIT=SYSSF,                                   
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=0),            
//             SPACE=(27920,(29,6),RLSE),      
//             DISP=(NEW,CATLG,DELETE)                       
//SYSIN    DD  DSN=DS.PARM(PARM03),DISP=SHR       

PARM03 содержит: Здесь я создаю код unix для переименования файла:

SORT FIELDS=COPY                                               
OUTFIL BUILD=(1:C'print "get " r_fi',18:SEQNUM, -              
    3,ZD,22:C'" //DD:upload"',/,1:C'print "rename " r_fi',  -
         21:SEQNUM,3,ZD,24:C' ', -                          
25:C' " " "Process_" %%DAT "_" r_fi',53:SEQNUM,3,ZD,80:X)      
/*                                                          

Код unix, который я создаю динамически: Здесь в зависимости от количества файлов p_fi01, p_fi02, p_fi03..... генерируется. Я сохраняю код unix в наборе данных и передаю его как поток для запуска.

Проблема в том, что он не может получить значение переменной DAT. Есть ли способ передать значение D из jcl в proc и добавить к нему
«Process_», используя карту сортировки в proc.

Пример данных: содержимое файла File1.csv извлекается, а затем переименовывается в Process_20140101_File1.csv.


person deepaklearner    schedule 31.01.2014    source источник
comment
@BillWoodger Я был так взволнован, увидев здесь еще одного программиста на COBOL XD   -  person SaggingRufus    schedule 31.01.2014
comment
@BillWoodger: здесь я использовал DFSORT. Я также предоставил некоторые примеры данных.   -  person deepaklearner    schedule 01.02.2014
comment
@SaggingRufus: я не могу делиться всем кодом в соответствии с политикой. Я попытался уточнить более подробно. Если вам нужна дополнительная информация. Я буду предоставлять. Большое вам спасибо за вашу помощь.   -  person deepaklearner    schedule 01.02.2014
comment
@BillWoodger У меня Z/OS DFSORT V1R12.   -  person deepaklearner    schedule 04.02.2014
comment
@BillWoodger: Большое спасибо. Я не могу выразить, как я счастлив. Код работает. По ошибке я написал JP0 в одинарных кавычках, поэтому он писал то же самое. Еще раз спасибо. :)   -  person deepaklearner    schedule 04.02.2014
comment
@BillWoodger: Ты молодец... :)   -  person deepaklearner    schedule 04.02.2014
comment
Если вы посмотрите рядом с ответами, то увидите что-то вроде пустой галочки. Если вы нажмете на это, вы можете принять и ответить как наиболее полезный для вас. Из-за того, что вы не принимаете ответы на ваши вопросы, я не думаю, что вы знаете, как это сделать. Вы также получаете два балла за каждый ответ, который вы принимаете. Тогда, я думаю, у вас тоже было бы достаточно голосов. Таким образом, вы также можете голосовать за любые вопросы, которые вам помогли (включая те, которые вы приняли).   -  person Bill Woodger    schedule 18.05.2015


Ответы (1)


Предполагая, что остальная часть вашего кода в порядке, это довольно просто с DFSORT, используя JPn, который является специальным символом DFSORT, который позволяет использовать отдельные значения до 10 параметров в контрольных картах.

Вот пример:

// SET INPARM='ABC' 
//* 
//STEP0100 EXEC PGM=SORT,PARM='JP0"&INPARM"'
//SYSOUT   DD SYSOUT=* 
//SYMNOUT  DD SYSOUT=* 
//SORTOUT  DD SYSOUT=* 
//SYSIN    DD * 
  OPTION COPY 
  INREC BUILD=(JP0) 
//SORTIN   DD * 
IRRELEVANT DATA, JUST AN EXAMPLE 

Я использовал SET для создания символа JCL, но у вас уже есть свой символ из CONTROL-M, поэтому просто замените &INPARM в PARM вашим символом CONTROL-M.

JPn означает от JP0 до JP9. Три отдельных фрагмента данных могут выглядеть следующим образом:

//STEP0100 EXEC PGM=SORT,PARM='JP0"&INPARM1",JP1"&INPARM2",JP2"&INPARM3"'

SYMNOUNT DD является необязательным, но очень, очень полезным, так как покажет вам переведенные значения символов.

Предполагая, что остальная часть вашего кода верна, вы должны внести это изменение:

25:C' " " "Process_"',JP0,C'"_" r_fi',53:SEQNUM,3,ZD,80:X) 

И включите PARM на карту EXEC, PARM='JP0"[yourControl-M-symbol]"'

У SyncSort нет JPn, так что вам повезло, что у вас есть DFSORT. Для SyncSort потребуется другой метод.

person Bill Woodger    schedule 01.02.2014
comment
Большое спасибо. Я пытаюсь. Даст знать, работает или нет. :-) - person deepaklearner; 01.02.2014
comment
@Raushan Возможно, вы захотите принять этот ответ, чтобы другие увидели, что это: 1) то, что вы искали; 2) Правильно описал вашу проблему; 3) Является ли опубликованным лучший ответ (это может быть единственный ответ, но другие нередко публикуют последующие ответы в надежде, что им будет поставлена ​​галочка) - person NealB; 04.02.2014