2015-06-16 4 views
1
//ICETSIM1 EXEC PGM=ICETOOL 
//TOOLMSG DD SYSOUT=* 
//DFSMSG DD SYSOUT=* 
//SYMNOUT DD SYSOUT=* 
//NAMESIN DD * 

LINK_REC;1,45 
LINK_REFDATE;=,8,CH 
LINK;*,16,CH 
LINK_COLL;*,16,CH 
LINK_TYPE;*,3,CH 
LINK_LABEL;*,02,CH 
    LINK_P_LABEL;=,1,CH 
    LINK_S_LABEL;*,1,CH 


//NAMESOUT DD DSN=&NAMES,DISP=(,PASS,DELETE),SPACE=(TRK,1) 
//TOOLIN DD * 
COPY FROM(NAMESIN) TO(NAMESOUT) 

//S01  EXEC PGM=ICETOOL 
//TOOLMSG DD SYSOUT=* 
//DFSMSG DD SYSOUT=* 
//SYMNAMES DD DSN=&NAMES,DISP=(OLD,PASS) 
//SYMNOUT DD SYSOUT=* 
//IN2  DD DISP=SHR,DSN=LINKS.001 

SELECT FROM(IN2) TO(OU2) ON(LINK) FIRST USING(CTL2) 

//CTL2CNTL DD * 
OUTFIL FNAMES=OU2, 
OUTREC=(LINK_REFDATE,16X,LINK,500X,LINK_TYPE,C'22') 

Этот ICETOOL выбирает первую запись для каждого значения LINK в LINKS.001. Возникает вопрос: ожидает ли оператор SELECT сортировку ввода? Если да, его нужно сортировать по всем полям LINKS.001 (REF_DATE, LINK, LINK_COLL ...)?Оператор SELECT

+0

Вам нужно взять кейс при вставке с вашего эмулятора. У вас нет DDD-кода NAMESOUT или OU2. Ваш OUTFIL и OUTREC начинаются в столбце 1. Чтобы ответить на ваш вопрос, посмотрите на sysout с шага. Вы увидите требуемый оператор SORT. Ваши данные уже упорядочены в этом отдельном поле? –

+0

Исправлена ​​опечатка. Кстати, мои данные уже отсортированы (по всему полю), когда они идут в IN2. – Jacopo

ответ

1

Я большой поклонник символов SORT/SYMNAMES, так приятно видеть, что вы используете это и довольно продвинутым способом. Вы указываете только одну начальную позицию для своей записи и относите все остальное в предыдущее поле, что является наиболее гибким способом сделать это.

Я не понимал, что можно использовать полуколону, поэтому я заменил ее на запятую. У вас не может быть пустой строки (вы можете оставить комментарий, * в первой колонке и оставить остальную часть строки пустой.

Я не знаю, почему у вас есть первый шаг, поэтому я упал это лучший способ использовать SYMNAMES DD с DSN =, а затем PDS/PDSE с именем участника, а затем ваши карты внутри члена. Для пояснения я использую DD *.

В вашем USING-файле у вас есть контрольные карты SORT, что верно, но они должны иметь пробел в колонке.

OUTREC on OUTFIL датирован, доступен для обратной совместимости, поэтому я изменил его на BUILD (который является синонимом OUTREC на OUTFIL и FIELDS на INREC и OUTREC - см. насколько менее запутанным является придерживаться просто BUILD?).

По умолчанию оператор SELECT ICETOOL сортирует данные в каждом поле ON, указанном в указанном порядке. Если ваши данные уже находятся в правильной последовательности, вы используете ИСПОЛЬЗОВАНИЕ (которое у вас уже есть) и укажите SORT FIELDS=COPY или OPTION COPY. Затем ваши данные не будут отсортированы.

//S01  EXEC PGM=ICETOOL 
//TOOLMSG DD SYSOUT=* 
//DFSMSG DD SYSOUT=* 
//SYMNAMES DD * 
LINK_REC,1,45 
LINK_REFDATE,=,8,CH 
LINK,*,16,CH 
LINK_COLL,*,16,CH 
LINK_TYPE,*,3,CH 
LINK_LABEL,*,02,CH 
    LINK_P_LABEL,=,1,CH 
    LINK_S_LABEL,*,1,CH 
//SYMNOUT DD SYSOUT=* 
//IN2  DD * 
1111111111111111111 
1111111111111111111 
2222222222222222222 
//OU2 DD SYSOUT=* 
//TOOLIN DD * 

SELECT FROM(IN2) TO(OU2) ON(LINK) FIRST USING(CTL2) 

//CTL2CNTL DD * 
SORT FIELDS=COPY 
OUTFIL FNAMES=OU2, 
     BUILD=(LINK_REFDATE, 
       16X, 
       LINK, 
       500X, 
       LINK_TYPE, 
       C'22') 

Выше, с моими простыми тестовыми данными, производит то, что вы хотите. Было несколько других опечаток (например, OU2 DD), которые я исправил, чтобы запустить его.

Смежные вопросы