2017-01-31 11 views
2

Существует два файла FILE1.DATA и FILE2.DATA Чтобы вычислить процент (количество записей в FILE1/количество записей в FILE2) * 100, используя DFSORT в мейнфрейме. И установка кода возврата, если он пересекает порог (90%).Умножение с использованием утилиты DFSORT в Mainframe

//********Extracting Unique records data***************** 
//SORTT000 EXEC PGM=SORT 
//SYSOUT DD SYSOUT=*  
//SORTIN DD DSN=SAMPLE.DATA1,DISP=SHR 
//SORTOUT DD DSN=FILE1.DATA,       
//    SPACE=(2790,(5376,1075),RLSE),      
//    UNIT=TSTSF,          
//    DCB=(RECFM=FB,LRECL=05,BLKSIZE=0),     
//    DISP=(NEW,CATLG,DELETE)       
//SYSIN DD *             
SORT FIELDS=(10,5,CH,A) 
OUTREC FIELDS=(1:10,5) 
SUM FIELDS=NONE   
/*     
//************Getting count of records*****************  
//STEP001 EXEC PGM=ICETOOL        
//TOOLMSG DD SYSOUT=*   
//DFSMSG DD SYSOUT=*          
//SYSOUT DD SYSOUT=*          
//SYSPRINT DD SYSOUT=*          
//IN1  DD DISP=SHR,DSN=FILE1.DATA 
//IN2  DD DISP=SHR,DSN=FILE2.DATA 
//OUT1  DD DSN=FILE1.DATA.COUNT,  
//   SPACE=(2790,(5376,1075),RLSE),  
//   UNIT=TSTSF,       
//   DCB=(RECFM=FB,LRECL=06,BLKSIZE=0), 
//   DISP=(NEW,CATLG,DELETE)  
//OUT2  DD DSN=FILE2.DATA.COUNT, 
//   SPACE=(2790,(5376,1075),RLSE),  
//   UNIT=TSTSF,       
//   DCB=(RECFM=FB,LRECL=06,BLKSIZE=0), 
//   DISP=(NEW,CATLG,DELETE)  
//TOOLIN DD *           
    COUNT FROM(IN1) WRITE(OUT1) DIGITS(6)     
    COUNT FROM(IN2) WRITE(OUT2) DIGITS(6)      
/*  
//*******Calculating percentage and if above 90% setting RC 04*****             
//STEP002 EXEC PGM=SORT            
//SYSOUT DD SYSOUT=*            
//SORTIN DD DSN=FILE2.DATA.COUNT,DISP=SHR     
//   DD DSN=FILE1.DATA.COUNT,DISP=SHR     
//SORTOUT DD DSN=FILE.DATA.COUNT.OUT,  
//   SPACE=(2790,(5376,1075),RLSE),  
//   UNIT=TSTSF,       
//   DCB=(RECFM=FB,LRECL=80,BLKSIZE=0), 
//   DISP=(NEW,CATLG,DELETE)      
//SETRC DD SYSOUT=*            
//SYSIN DD *              
    INREC IFTHEN=(WHEN=INIT,BUILD=(1,6,X,6X'00',SEQNUM,1,ZD,80:X)),  
    IFTHEN=(WHEN=(14,1,ZD,EQ,2),OVERLAY=(8:1,6))      
    SORT FIELDS=(7,1,CH,A),EQUALS          
    SUM FIELDS=(8,4,BI,12,2,BI)           
    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)) 

    OUTFIL FNAMES=SETRC,NULLOFL=RC4,INCLUDE=(23,6,CH,GT,C'090.00')   
    OUTFIL BUILD=(05:C'TOTAL NUMBER RECRODS IN FILE2  : ',1,6,/, 
       05:C'TOTAL NUMBER RECRODS IN FILE1  : ',8,6,/, 
       05:C'PERCENTAGE       : ',23,6,/, 
       80:X)             
//*                 
  1. Проблема я столкнулся это наборы данных FILE1.DATA.COUNT и FILE1.DATA.COUNT становятся созданы 15 длины записи, несмотря на упоминание LRECL 6. (обратите внимание, что это вопрос, который существовал, когда первый ответ был написан и не относится теперь к вышеуказанному коду).
  2. Можем ли мы объединить оба шага в один?
  3. Что это значит, (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)), конкретно конкретно?
+0

Предположительно, ваши файлы довольно большие? Это сделает весь процесс неэффективным. Возьмите подсчеты из того, что уже читает данные, а затем у вас есть что-то действительно простое и эффективное. Каковы RECFM и LRECL для ваших входных данных? Вы прочитали документацию по COUNT (Нет, это ответ, так ли это)? –

+0

@ На мои оба входных файла приходится около 10000 записей. – deepaklearner

+0

Я добавил DIGITS (6) в step001 и изменил его ниже OUTFIL FNAMES = SETRC, NULLOFL = RC4, INCLUDE = (23,6, CH, GT, C'090,00 '). Теперь он работает отлично. – deepaklearner

ответ

3

Ответ на ваш первый вопрос просто, что вы не сказали оператора 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) - это заданная маска редактирования, в этом случае вставка десятичной точки, обрезание иначе существующей левой цифры и наличие значительных начальных нулей при необходимости.