Как проверить наличие нулевого значения (или значения, отличного от "1", "2") от позиции 68 до 69 в файле блока переменных. Записи могут заканчиваться до позиции 27

Мне нужно получить счет для чего-либо, имеющего значение, отличное от '1' или '2' в позиции 688.

Возможно ли это с помощью Easytrieve или SORT в JCL? Я сделал это так

-[Символ на позиции 653 не должен быть пробелом И (проверить 688 NE 1 .'И' 688 NE '2']

 INCLUDE COND=
             ((653,5,CH,NE,C'     ',AND,((688,2,CH,NE,C '1 ',AND,688,2,CH,NE,C '2 ')))

мы можем сделать это более эффективным или другим способом?

2 ответа

Вы можете упростить человеческое понимание, используя OMIT вместо INCLUDE, чтобы избавиться от своих негативных состояний.

OPTION COPY,VLSCMP
OMIT COND=(653,5,CH,EQ,C' ',
         OR,
           688,2,CH,EQ,C '1 ',
         OR,
           688,2,CH,EQ,C '2 ')

Можно было бы использовать SS полевого типа для заключения испытаний на позиции 688, но я бы с осторожностью отнесся к этому, если ваши данные являются подозрительными (используйте SS только тогда, когда вы уверены, какие значения могут быть).

На мой взгляд, это можно упростить, используя символы SORT, чтобы избежать повторений и ошибок, которые могут с этим случиться.

Поскольку у вас есть короткие записи, которые могут помешать (вызвать сбой шага), я включил OPTION VLSCMP. Это заполнит все поля в INCLUDE/OMIT, которые не содержатся в записи (поскольку запись короткая), с двоичными нулями. Таким образом, все записи с пробелом в 653,5 будут удалены, все записи, которые не являются C'1 'или C'2 ' в 688,2, будут удалены. Все короткие записи будут включены, так как критерии отбрасывания не будут соблюдены (поля будут двоичными нулями для сравнения по INCLUDE/OMIT). Короткая запись, которая содержит место в 653,5, будет опущена. Если это не то, что вы хотите, это может быть решено путем расширения условий.

Если вам нужен отформатированный счетчик, который можно легко сделать, но если вы просто исследуете, это может быть тот случай, когда подсчет по умолчанию в sysout даст вам то, что вы хотите.

Да, можно посчитать количество записей, соответствующих критериям, как в сортировке, так и в легкой загрузке

  1. Easytrieve - очень легко, посмотрите руководство - https://www.google.com.au/?gfe_rd=cr&ei=hUBnU-XbCOfC8gep74GIBg
  2. У большинства утилит сортировки есть своего рода функции отчетности, которые можно использовать, для DFSort есть счетчик ( http://pic.dhe.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.icea100/ice1ca40124.htm) в IceTool. Даже без функций отчетности это можно сделать с помощью двухэтапного процесса

    • Выберите необходимые записи и переформатируйте и включите двоичное поле (со значением 1, используя outrec, см. Http://pic.dhe.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos .r12.icea100% 2Fice1ca50263.htm
    • Сортировать сумму файла с первого шага

    Сортировка примерно:

    // STEP1 EXEC PGM = SORT                                       
    // SYSOUT DD SYSOUT = H                                         
    // SORTIN DD DSN = INP1, DISP = SHR, UNIT = 3380, VOL = SER = SCR001       
    // SORTOUT DD DSN = && OUTPUT, DISP = (, PASS), UNIT = 3390,             
    // SPACE = (CYL, (5,1)), DCB = (LRECL = 22)                          
    // SYSIN DD *                                                
      ВАРИАНТ КОПИЯ
      OMIT COND=(653,5,CH,EQ,C' ',
             ИЛИ ЖЕ,
               688,2,CH,EQ,C '1 ',
             ИЛИ ЖЕ,
               688,2,CH,EQ,C '2 ')       
      OUTREC BUILD=(1,4,X'0000000001')  
    //*
    //STEP1    EXEC PGM=SORT                                       
    //SYSOUT   DD SYSOUT=H                                         
    //SORTIN   DD DSN=&& ВЫХОД,DISP=SHR,UNIT=3380,VOL=SER=SCR001       
    //SORTOUT  DD SYSOUT=*                    
    //SYSIN    DD *
     СОРТИРОВАТЬ ПОЛЯ =(5,1,BI)
     ОБЩИЕ ПОЛЯ =(6,4,BI)
     OUTREC BUILD=(6,4,BI,TO=ZD,LENGTH=9)

Будут области, которые вы можете улучшить

Другие вопросы по тегам