Было бы гораздо полезнее, если бы вы разместили предложения PICTURE / USAGE для элемента данных в записи входного файла, а также для определения столбца DB / 2.
Однако это выглядит многокак проблема преобразования данных.Вот что нужно проверить:
Имеет ли запись входного файла PICTURE / USAGE что-то вроде PIC 9(5).99
.Ключевым моментом является то, что в объявлении есть явная десятичная точка.Если вы посмотрите на входной файл с помощью текстового редактора (например, редактора ISPF), вы увидите число, похожее на 12345.67
.Эти числа в формате дисплея.Думайте о них как о тексте.
Определение столбца DB / 2.Десятичные числа в DB / 2 обычно объявляются примерно так: DECIMAL(7,2)
.Числа, объявленные таким образом, хранятся в DB / 2 в упакованном десятичном формате.
Номера форматов отображения, которые, вероятно, существуют во входном файле, не совместимы с упакованными десятичными числами (яблоки иапельсины).
Чтобы проиллюстрировать этот момент, рассмотрим следующую небольшую программу на языке COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 A PIC 9(6).99.
01 B PIC 9(6)V99 PACKED-DECIMAL.
PROCEDURE DIVISION.
MOVE 123456.78 TO A
DISPLAY 'A=' A
MOVE A TO B
ADD 1 TO B
DISPLAY 'B=' B
MOVE B TO A
DISPLAY 'A=' A
GOBACK.
Переменная A
имеет формат отображения с явной десятичной точкой.Все, что вы можете сделать, это присвоить ему значение для отображения.Попытка сделать что-то вроде ADD 1 TO A
приведет к ошибке компиляции.
Хитрость заключается в том, чтобы преобразовать числа в формате отображения в нечто, совместимое с DB / 2 (например, Packed Decimal).Глагол COBOL MOVE делает эту работу.Объявите новую переменную с типом данных, совместимым с тем, который используется DB / 2.Переменная B
выше является такой переменной.Переместите отформатированную переменную отображения в переменную Packed Decimal, как в: MOVE A TO B
.Среда выполнения COBOL выполняет это преобразование.
Обратите внимание, что теперь вы можете добавить что-то к B
.Дисплей B
(исчезает десятичная точка - я дам вам понять, почему).Затем верните его обратно в формат отображения, эй, вернулась десятичная точка.
DB / 2 принимает переменные хоста, которые приходят без преобразования.Если эта переменная хоста не имеет правильный формат данных, вы получите сообщение об ошибке.
Возможно, вам нужно сделать что-то вроде:
Read Record
MOVE record display data (eg. `A`) to a DB/2 compatible field (eg. `B`)
EXEC SQL
INSERT INTO table (
...
SALARY,
...)
VALUES (
...
:B,
...)
END-EXEC.