Поскольку 12 200 человек посмотрели на этот вопрос и не получили ответа:
DFSORT и SyncSort являются основными продуктами сортировки мэйнфреймов. Их контрольные карты имеют много общего и некоторые отличия.
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A)
JOINKEYS FILE=F2,FIELDS=(key2startpos,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200)
SORT FIELDS=COPY
"JOINKEYS" состоит из трех задач. Подзадача 1 - это первые СОЕДИНЕНИЯ. Подзадача 2 является вторым JOINKEYS. Основная задача следует и где обрабатываются объединенные данные. В приведенном выше примере это простая операция COPY. Объединенные данные будут просто записаны в SORTOUT.
Оператор JOIN определяет, что наряду с сопоставленными записями записи UNPAIRED F1 и F2 должны быть представлены главной задаче.
Оператор REFORMAT определяет запись, которая будет представлена главной задаче. Более эффективный пример, представляющий, что три поля требуются от F2, это:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100)
Каждое из полей в F2 определено с начальной позицией и длиной.
Запись, которая затем обрабатывается главной задачей, имеет длину 5311 байтов, а на поля из F2 можно ссылаться как 5201,10,5211,1,5212,100 с записью F1, равной 1,5200.
Лучший способ добиться того же - уменьшить размер F2 с помощью JNF2CNTL.
//JNF2CNTL DD *
INREC BUILD=(207,1,10,30,1,5100,100)
Некоторые установки SyncSort не поддерживают JNF2CNTL и даже там, где это поддерживается (начиная с Syncsort MFX для z / OS версии 1.4.1.0 и далее), не задокументированы SyncSort. Для пользователей 1.3.2 или 1.4.0 доступно обновление от SyncSort для обеспечения поддержки JNFnCNTL.
Следует отметить, что JOINKEYS по умолчанию сортирует данные с опцией EQUALS. Если данные для файла JOINKEYS уже находятся в последовательности, следует указать SORTED. Для DFSORT также можно указать NOSEQCHK, если проверка последовательности не требуется.
JOINKEYS FILE=F1,FIELDS=(key1startpos,7,A),SORTED,NOSEQCHK
Хотя запрос странный, так как исходный файл не может быть определен, все несопоставленные записи должны идти в отдельный выходной файл.
В DFSORT есть маркер соответствия, указанный с помощью? в РЕФОРМАТ:
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100,?)
Это увеличивает длину записи REFORMAT на один байт. ? может быть указан в любом месте записи REFORMAT, и не должен быть указан. ? разрешается DFSORT для: B, данные получены из обоих файлов; 1, непревзойденная запись от F1; 2, непревзойденная запись из F2.
SyncSort не имеет маркера совпадения. Отсутствие или наличие данных в записи REFORMAT должно определяться значениями. Выберите байт в обеих входных записях, которые не могут содержать определенное значение (например, в пределах числа, выбрать нечисловое значение). Затем укажите это значение в качестве символа FILL в REFORMAT.
REFORMAT FIELDS=(F1:1,5200,F2:1,10,30,1,5100,100),FILL=C'$'
Если позиция 1 на F1 не может иметь «$» и позиция 20 на F2 тоже не может, то эти две позиции могут использоваться для установления результата матча. При необходимости можно протестировать всю запись, но затрачивает больше процессорного времени.
Очевидным требованием является запись всех несопоставленных записей из F1 или F2 в один файл. Для этого потребуется оператор REFORMAT, включающий обе записи целиком:
DFSORT, выводить несопоставленные записи:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
SyncSort, выводить несопоставленные записи:
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
Кодировка SyncSort также будет работать с DFSORT.
Получить записанные совпадающие записи легко.
OUTFIL FNAMES=MATCH,SAVE
SAVE гарантирует, что все записи, не записанные другим OUTFIL, будут записаны здесь.
Требуется некоторое переформатирование, в основном для вывода данных из F1, но для выбора некоторых полей из F2. Это будет работать для DFSORT или SyncSort:
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
Все, с произвольными запусками и длинами:
DFSORT
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200,?)
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(10401,1,SS,EQ,C'1,2'),
IFTHEN=(WHEN=(10401,1,CH,EQ,C'1'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)
Syncsort
JOINKEYS FILE=F1,FIELDS=(1,7,A)
JOINKEYS FILE=F2,FIELDS=(20,7,A)
JOIN UNPAIRED,F1,F2
REFORMAT FIELDS=(F1:1,5200,F2:1,5200),FILL=C'$'
SORT FIELDS=COPY
OUTFIL FNAMES=NOMATCH,INCLUDE=(1,1,CH,EQ,C'$',
OR,5220,1,CH,EQ,C'$'),
IFTHEN=(WHEN=(1,1,CH,EQ,C'$'),
BUILD=(1,5200)),
IFTHEN=(WHEN=NONE,
BUILD=(5201,5200))
OUTFIL FNAMES=MATCH,SAVE,
BUILD=(1,50,10300,100,51,212,5201,10,263,8,5230,1,271,4929)