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