Ответ на ваш первый вопрос просто, что вы не сказали оператора COUNT ICETOOL, как долго вы хотите, выходные данные, чтобы быть, так он пришел со своей собственной фигурой.
Это из Руководства по программированию DFSORT Application:
WRITE (countdd) Определяет DDNAME данных подсчета, установленным, чтобы быть производства ICETOOL для этой операции. Оператор countdd DD должен быть . ICETOOL устанавливает атрибуты набора данных счетчика следующим образом:
v RECFM установлен в FB.
против LRECL установлен в одно из следующих значений:
- Если указана ШИРИНА (п), LRECL установлен в п. Используйте WIDTH (n), если длина записи count и LRECL должны быть установлены на определенное значение (для примера , 80) или если вы хотите, чтобы длина записи отсчета не превышала определенный максимум (например, 20 байт).
- Если значение WIDTH (n) не указано, LRECL устанавливается на вычисленную требуемую длину записи . Если вашему LRECL не нужно устанавливать значение , вы можете позволить ICETOOL определить и установить соответствующее значение LRECL , не указав WIDTH (n).
А:
ЦИФРЫ (д)
Указывает d цифры для подсчета в выходной записи, перекрывая по умолчанию 15 цифр. d может быть от 1 до 15. Счет записывается как d десятичные цифры с начальными нулями. ЦИФРЫ можно указать только в том случае, если задано WRITE (countdd).
Если вы знаете, что ваш счетчик требует менее 15 цифр, вы можете использовать меньшее количество цифр (d), указав DIGITS (d). Для Например, если указано ЦИФРЫ (10), 10 цифр используются вместо 15.
При использовании DIGITS (D) и количество перетекает количество цифр, используемых , ICETOOL завершает операцию.Вы можете предотвратить переполнение , указав соответствующее значение D выше для DIGITS (d). Например, для , если DIGITS (5) приводит к переполнению, вместо этого вы можете использовать DIGITS (6) .
И:
WIDTH (п)
Определяет длину записи и LRECL вы хотите ICETOOL использовать для набора данных счета. n может быть от 1 до 32760. WIDTH может быть указан только , если указан WRITE (countdd). ICETOOL всегда вычисляет записи длину, необходимую для записи количество записей и использует его следующим образом:
v Если ШИРИНА (п) определяется и рассчитывается длина записи меньше чем или равно п, ICETOOL устанавливает длину записи и LRECL - n. ICETOOL колодки отсчет записи справа с записями к записи длина.
v Если указана спецификация WIDTH (n), а вычисленная длина записи больше чем n, ICETOOL выдает сообщение об ошибке и завершает операцию.
v Если WIDTH (n) не указан, ICETOOL задает длину записи и LRECL для рассчитанной длины записи.
Использование WIDTH (п), если ваша длина количества записей и LRECL должны быть установлены на особого значение (например, 80), или если вы хотите, чтобы убедиться, что отсчета длина записи не превышает определенный максимум (например, 20 байт). В противном случае вы можете позволить ICETOOL рассчитать и установить соответствующую длину записи и LRECL, не указав WIDTH (n).
Для вашего второго вопроса, да, это можно сделать за один шаг и значительно упростить.
Дело в том, что его можно упростить, сделав что-то еще. Точно, что еще зависит от вашей фактической задачи, чего мы не знаем, мы знаем только о том решении, которое вы выбрали для своей задачи.
Например, вы хотите знать, когда один файл находится в пределах 10% от размера другого. Один из способов, если точность точки на месте не требуется, заключается в том, чтобы поговорить с техническим персоналом, который управляет вашим хранилищем. Скажите им, что вы хотите сделать, и у них, вероятно, уже есть что-то, что вы можете использовать для этого (при обсуждении этого помните, что это технические наборы данных, а не файлы).
В качестве альтернативы, что-то уже ранее читало или записывало эти файлы. Если последняя программа для этого не производит подсчета того, что она прочитала/написала (на мой взгляд, стандартная передовая практика, при согласовании программы также), тогда измените программы, чтобы сделать это сейчас. Там. Магия. У вас есть счет.
Упорядочить, что эти подсчеты должны быть в наборе данных (предпочтительно с типами записей, заголовками/трейлерами, более стандартной практикой).
Один шаг, чтобы принять большее (ожидание) из двух отсчетов, «выработать» то, что было бы 00% (не нужно ничего, кроме простого вычитания, с нужными данными) и генерировать файл формата SYMNAMES (фиксированная длина 80-байтных записей) с символом SORT для константы с этим значением.
Второй шаг, который использует INCLUDE/OMIT с символом по сравнению со вторым счетом, используя NULLOUT или NULLOFL.
Преимущество вышеуказанных типов решений заключается в том, что они в основном используют очень мало ресурсов. На мэйнфрейме клиент оплачивает ресурсы. В конце года ваш клиент не может быть так счастлив, что обнаружил, что заплатил за чтение и «подсчет» 7,3 млн записей только для того, чтобы вы могли установить RC.
ОК, возможно, 7,3 м не так велика, но, когда у вас есть свое «решение», следующий человек собирается сделать это с 100 000 записей, а затем с 1 000 000 записей. Все, чтобы установить RC. Любой из них (даже с примером из 10000 записей) перевешивает расходы на решение «мэйнфрейма», которое будет работать каждый день в течение следующих 15 лет.
Для вашего третьего вопроса:
OUTREC OVERLAY=(15:X,1,6,ZD,DIV,+2,M11,LENGTH=6,X,
(8,6,ZD,MUL,+100),DIV,1,6,ZD,MUL,+100,EDIT=(TTT.TT))
OUTREC обрабатывается после SORT/Слить и SUM (если он присутствует), в противном после ИПРЭК. Обратите внимание, что физический порядок, в котором они указаны в JCL, не влияет на порядок, в котором они обрабатываются.
OVERLAY говорит: «Обновляйте информацию в текущей записи с помощью этих манипуляций с данными (BUILD всегда создает новую копию текущая запись)
15:. это "колонна 15" (позиция 15) на запись
Х вставляет пустой
1,6, ZD означает «информацию, в этот момент.. , в стартовом положении один для длины шесть, который представляет собой формат с зонированным десятичным значением ".
DIV - это divde.
+2 - числовая константа.
1,6, ZD, DIV, + 2 означает «взять шестизначное число, начинающееся с позиции 1, и разделить его на два, давая« результат », который будет помещен в следующее доступное положение (16 в вашем случае).
M11 - это встроенная маска редактирования. Подробнее о том, что это за маска, посмотрите в руководстве, так как в это время вы обнаружите другие полезные предопределенные маски. для форматирования результата.
ДЛИНА = 6 ограничивает результат до шести цифр.
до сих пор, число в первые шесть позиций будут разделены на два, обработанной (маской) в качестве ип подписанная зонально-десятичная цифра из шести цифр, начиная с позиции 16.
Остальные элементы утверждения аналогичны. Кронштейны влияют на «приоритет» числовых операторов обычным способом (ознакомьтесь с руководством, чтобы ознакомиться с правилами приоритета).
EDIT = (TTT.TT) - это заданная маска редактирования, в этом случае вставка десятичной точки, обрезание иначе существующей левой цифры и наличие значительных начальных нулей при необходимости.
Предположительно, ваши файлы довольно большие? Это сделает весь процесс неэффективным. Возьмите подсчеты из того, что уже читает данные, а затем у вас есть что-то действительно простое и эффективное. Каковы RECFM и LRECL для ваших входных данных? Вы прочитали документацию по COUNT (Нет, это ответ, так ли это)? –
@ На мои оба входных файла приходится около 10000 записей. – deepaklearner
Я добавил DIGITS (6) в step001 и изменил его ниже OUTFIL FNAMES = SETRC, NULLOFL = RC4, INCLUDE = (23,6, CH, GT, C'090,00 '). Теперь он работает отлично. – deepaklearner