В COBOL, как преобразовать значение знака comp-3 в читаемый формат вместе со знаком

Я сталкивался с ситуацией, когда значение, поступающее из записи, находится в формате ниже 01 WS-PREMIUM PIC S9(05)V9(02) comp-3.

Как мы знаем в comp-3, знак хранится в последнем клеве. например, WS-PREMIUM со значением +1234.10 будет сохранен как x'0123410C'или WS-PREMIUM со значением -1234.10 будет сохранен как x'0123410D'.

Теперь я хочу записать это в файл отчета ((допустим, файл Daily Premium). Это значение должно быть записано в файл со знаком +1234.10$ или -1234.10$. Я искал ответ на этом форуме, но что я мог found - это предопределенная переменная знака в разделе отчета, в то время как я ищу идентификацию знака во время выполнения по последнему клеву и записи в файл соответственно. Я также слышал, что есть способ сделать это в Java, но не конечно как.

Я знаю, когда мы используем DISPLAY, он показывает распакованный десятичный знак со своим байтом знака.

Может кто-нибудь, пожалуйста, помогите мне с этим. Заранее спасибо.

Вот пример кода, который я использовал -

   IDENTIFICATION DIVISION.
    PROGRAM-ID. V1329006.

   ENVIRONMENT DIVISION.
    INPUT-OUTPUT SECTION.
        FILE-CONTROL.
        SELECT OPDATA ASSIGN TO "OPDATA.DAT"
         ORGANIZATION IS LINE SEQUENTIAL. 
   DATA DIVISION. 
    FILE SECTION.
    FD OPDATA.
    01 WS-OP-RECORD PIC X(20).

    WORKING-STORAGE SECTION.

    01 HEADER-LINE.
        05 FILLER     PIC X(08) VALUE 'DATE'.
        05 FILLER     PIC X(01).
        05 FILLER     PIC X(08) VALUE 'PREMIUM'.

    01 DETAIL-LINE.
        05 WS-DATE    PIC 9(08) VALUE '20181119'.
        05 FILLER     PIC X(01).
        05 WS-PREMIUM PIC S9(05)V9(02) comp-3.
    01 WS-INPUTS.

        05 WS-EARNED-PREMIUM    PIC S9(05)V9(02).

        05 WS-RETURN-PREMIUM    PIC S9(05)V9(02).

   PROCEDURE DIVISION.
       OPEN OUTPUT OPDATA. 
       MOVE '+1234.10' TO WS-EARNED-PREMIUM
       MOVE '-10.05' TO WS-RETURN-PREMIUM
       COMPUTE WS-PREMIUM = 
         WS-EARNED-PREMIUM + WS-RETURN-PREMIUM
        DISPLAY 'WS-PREMIUM='WS-PREMIUM 
        WRITE WS-OP-RECORD FROM HEADER-LINE
        WRITE WS-OP-RECORD FROM DETAIL-LINE
       CLOSE OPDATA.
    GOBACK.
    END PROGRAM V1329006.

Я ожидаю, что будет показано как

ДАТА ПРЕМИУМ20181119 +1224.05

2 ответа

Решение

Возможно, вам придется проверить редактирование предложения PICTURE в языке COBOL.

Несколько полезных ссылок: PICTURE Clause Editing и Edited Pictures.

Пример кода приведен ниже.

IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
DATA DIVISION. 
WORKING-STORAGE SECTION. 
01 WS-A PIC S9(05)V9(02) comp-3 VALUE -1234.10.
01 WS-GROUP.
   05 WS-B PIC +99999.99.
   05 WS-C PIC X VALUE '$'.
PROCEDURE DIVISION.
MOVE WS-A TO WS-B.
DISPLAY WS-GROUP. 
STOP RUN.

Выход:

-01234.10$

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

Я попробовал следующее на мэйнфрейме IBM COBOL и получил эти результаты.

01 DETAIL-LINE.                            
    05 WS-DATE    PIC 9(08) VALUE 20181119.
    05 FILLER     PIC X(01).               
    05 WS-PREMIUM PIC S9(05)V9(02) comp-3. 
    05 filler pic x value '$'.             

    DISPLAY DETAIL-LINE.

DATE     PREMIUM   
20181119    *$     

Это упакованный десятичный знак с неявной десятичной точкой и знаком в последней половине байта.

01 DETAIL-LINE2.                                          
    05 WS-DATE2   PIC 9(08) VALUE 20181119.               
    05 FILLER     PIC X(01).                              
    05 WS-PREMIUM2 PIC S9(05)V9(02) SIGN LEADING SEPARATE.
    05 filler pic x value '$'.                            

    DISPLAY DETAIL-LINE2.
DATE     PREMIUM
20181119 +0122405$

Итак, здесь мы получаем знак, и он читается, но мы не получаем десятичную точку и имеем ведущий ноль.

01 DETAIL-LINE3.                           
    05 WS-DATE3   PIC 9(08) VALUE 20181119.
    05 FILLER     PIC X(01).               
    05 WS-PREMIUM3 PIC +9(05).9(02).       
    05 filler pic x value '$'.             

    DISPLAY DETAIL-LINE4.
DATE     PREMIUM
20181119 +01224.05$

Итак, теперь мы получаем десятичную точку, но все еще имеем ведущий ноль.

01 DETAIL-LINE4.                            
    05 WS-DATE4   PIC 9(08) VALUE 20181119.
    05 FILLER     PIC X(01).               
    05 WS-PREMIUM4 PIC +Z(05).9(02).       
    05 filler pic x value '$'.             

    DISPLAY DETAIL-LINE4.

DATE     PREMIUM
20181119 + 1224.05$

Так что теперь у нас нет начального нуля (но есть пробел).

Спасибо @NicC за следующую часть.

01 DETAIL-LINE5.                           
    05 WS-DATE5   PIC 9(08) VALUE 20181119.
    05 FILLER     PIC X(01).               
    05 WS-PREMIUM5 PIC +++++9.9(02).       
    05 filler pic x value '$'.             

    DISPLAY DETAIL-LINE5.

DATE     PREMIUM
20181119  +1224.05$

Таким образом, с дополнительными знаками знак становится плавающим, поэтому вы больше не получаете пробелы (или ведущие нули).

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