В COBOL, как преобразовать значение знака comp-3 в читаемый формат вместе со знаком - PullRequest
0 голосов
/ 19 ноября 2018

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

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

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

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

DATE PREMIUM20181119 + 1224.05

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

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

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

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$

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

0 голосов
/ 19 ноября 2018

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

Некоторые полезные ссылки: ИЗОБРАЖЕНИЕ Пункт редактирования и Отредактированные изображения .

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

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$
...