Как я могу использовать SYNCSORT для форматирования упакованного десятичного поля со значением знака Specc? - PullRequest
2 голосов
/ 08 октября 2010

Я хочу использовать SYNCSORT, чтобы все поля упакованного десятичного знака имели отрицательное значение знака.Критическим требованием является то, что 2-й клев должен быть шестнадцатеричным «D».У меня есть метод, который работает, но он кажется слишком сложным.В соответствии с принципом KISS, я надеюсь, у кого-то есть лучший метод.Возможно, используя битовую маску на последних 4 битах?Вот код, который я придумал.Есть ли лучший способ?

*
* This sort logic is intended to force all Packed Decimal amounts to
* have a negative sign with a B'....1101' value (Hex 'xD').
*
 SORT FIELDS=COPY
 OUTFIL FILES=1,
   INCLUDE=(8,1,BI,NE,B'....1..1',OR,     * POSITIVE PACKED DECIMAL
            8,1,BI,EQ,B'....1111'),       * UNSIGNED PACKED DECIMAL
   OUTREC=(1:1,7,                         * INCLUDING +0
           8:(-1,MUL,8,1,PD),PD,LENGTH=1,
           9:9,72)
 OUTFIL FILES=2,
   INCLUDE=(8,1,BI,EQ,B'....1..1',AND,    * NEGATIVE PACKED DECIMAL
            8,1,BI,NE,B'....1111'),       * NOT UNSIGNED PACKED DECIMAL
   OUTREC=(1:1,7,                         * INCLUDING -0
           8:(+1,MUL,8,1,PD),PD,LENGTH=1,
           9:9,72)

Ответы [ 4 ]

1 голос
/ 26 апреля 2012

Возможен просмотр последнего байта упакованного поля.Вы хотите, чтобы от положительного / без знака до отрицательного, поэтому, если оно больше -1, вычтите его из нуля.

Из кратковременного ответа от MikeC теперь известно, что данные содержат non-preferred знаков (то есть он может содержать от A до F в полубайте младшего разряда, тогда как знак preferred будет C (положительным) или D (отрицательным). F без знака, считается положительным.

Это проверено с помощью DFSORT. Должно работать с SyncSORT. Оказывается, что DFSORT может понимать отрицательный упакованный десятичный ноль, но не будет создавать отрицательный упакованный десятичный ноль (этопозволит создать зонально-десятичный отрицательный ноль из упакованного десятичного числа с отрицательным нулем.

Идея состоит в том, что знак non-preferred действителен и будет точно подписан для ввода в десятичную машинную инструкцию,но результатом всегда будет знак preferred, и он будет правильным. Таким образом, если сначала добавить ноль, то поле превратится в знак preferred, а затем проверка на -1 будет работать, как и ожидалось. С данными в знаке-nybbНапример, для упакованных десятичных полей у SORT есть несколько специфических и задокументированных действий, которые здесь просто не помогут.

Поскольку существует только одно значение, чтобы стать отрицательным нулем, X'0C 'после нормализации знаков уже проводится простая проверка и замена на константу X'0D 'для отрицательного нуля.Поскольку отрицательный ноль не будет работать, второй тест будет изменен с исходного минус один на ноль.

С непривлекательными знаками в данных:

SORT FIELDS=COPY
INREC IFTHEN=(WHEN=INIT,
               OVERLAY=(32:+0,ADD,32,1,PD,TO=PD,LENGTH=1)),
      IFTHEN=(WHEN=(32,1,CH,EQ,X'0C'),
               OVERLAY=(32:X'0D')), 
      IFTHEN=(WHEN=(32,1,PD,GT,0), 
               OVERLAY=(32:+0,SUB,32,1,PD,TO=PD,LENGTH=1))

С предпочтительными знаками вданные:

SORT FIELDS=COPY
INREC IFTHEN=(WHEN=(32,1,CH,EQ,X'0C'),
               OVERLAY=(32:X'0D')), 
      IFTHEN=(WHEN=(32,1,PD,GT,0), 
               OVERLAY=(32:+0,SUB,32,1,PD,TO=PD,LENGTH=1))

Примечание: Если знаки non-preferred вставляются через программу COBOL, не использующую опцию компилятора NUMPROC (NOPFD), тогда результаты будут «интересными».

1 голос
/ 20 октября 2010

Рассматривали ли вы написание выхода пользователя E15? Выход пользователя E15 позволяет вам манипулировать записями, когда они вводятся в процесс сортировки. В этом случае у вас будет REXX, COBOL или другая LE совместимая языковая подпрограмма исправляет упакованное поле десятичного знака, когда оно вводится в процесс сортировки. Не нужно разбивать на несколько файлов для последующего объединения.

Вот ссылка на пример JCL для вызова выхода E15 из DFSORT (тот же JCL для SYNCSORT). Глава 4 эта ссылка описывает, как разрабатывать процедуры User Exit, опять же это руководство по DFSORT, но я считаю, что SyncSort полностью совместим в этом отношении. Написание обработчика пользователя ничем не отличается от написания любой другой подпрограммы - получите правильную связь, а остальное легко.

Это очень общий план, но я надеюсь, что это поможет.

1 голос
/ 26 октября 2010

Хорошо, потребовалось некоторое рытье, но предложение NEALB обратиться за помощью к MVSFORUMS.COM окупилось ... вот окончательный результат.Логика OUTREC, используемая с SORT / MERGE, заменяет OUTFIL и использует новые возможности (IFTHEN, WHEN и OVERLAY) в Syncsort 1.3, которые я не осознавал.Это платит за наличие текущей документации!

*                                                                
* This MERGE logic is intended to assert that the Packed Decimal 
* field has a negative sign with a B'....1101' value (Hex X'.D').
*                                                                
*                                                                
 MERGE FIELDS=(27,5.4,BI,A),EQUALS                               
 SUM FIELDS=NONE                                                 
 OUTREC IFTHEN=(WHEN=(32,1,BI,NE,B'....1..1',OR,                 
                      32,1,BI,EQ,B'....1111'),                   
                OVERLAY=(32:(-1,MUL,32,1,PD),PD,LENGTH=1)),      
        IFTHEN=(WHEN=(32,1,BI,EQ,B'....1..1',AND,                
                      32,1,BI,NE,B'....1111'),                   
                OVERLAY=(32:(+1,MUL,32,1,PD),PD,LENGTH=1))  
1 голос
/ 19 октября 2010

В коде, который обрабатывает файл VSAM, можете ли вы изменить логику чтения на GET с помощью KEY GTEQ и проверить на <0 в результате вместо выполнения специального чтения с помощью ключа? </p>

Если вы это сделалиВы можете принять все три отрицательных упакованных значения xA, xB и xD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...