Es wäre viel hilfreicher, wenn Sie die PICTURE/USAGE-Klauseln für das Datenelement in Ihrem Eingabedateisatz sowie die DB/2-Spaltendefinition posten würden.
Das sieht jedoch sehr ähnlich wie ein Datenkonvertierungsproblem aus. Dinge zu prüfen sind:
Ist die Eingabedatei Datensatz ein Bild/USAGE etwas wie PIC 9(5).99
haben. Der Schlüsselpunkt ist, dass in der Deklaration ein expliziter Dezimalpunkt vorhanden ist. Wenn Sie sich die Eingabedatei mit einem Texteditor (zB dem ISPF-Editor) ansehen, würden Sie eine Nummer sehen, die wie 12345.67
ist. Diese Nummern sind im Anzeigeformat. Betrachten Sie sie als Text.
DB/2-Spaltendefinition. Dezimalzahlen in DB/2 werden üblicherweise wie folgt deklariert: DECIMAL(7,2)
. Auf diese Weise deklarierte Zahlen werden von DB/2 im gepackten Dezimalformat gespeichert.
Anzeigeformat Zahlen, wie wahrscheinlich in der Eingabedatei vorhanden sind, sind nicht kompatibel mit Verpackt Dezimalzahlen (Äpfel und Orangen).
dieser Punkt zu veranschaulichen das folgende wenig COBOL-Programm betrachten:
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.
Variable A
ist im Display-Format, mit einem expliziten Dezimalpunkt. Alles, was Sie tun können, ist , dem Sie einen Wert für die Anzeige zuweisen. Wenn Sie versuchen, etwas wie ADD 1 TO A
zu tun, wird in einem Kompilierungsfehler resultieren.
Der Trick besteht darin, Zahlen im Anzeigeformat in etwas zu bekommen, das mit DB/2 kompatibel ist (zB. Packed Decimal). Das Verb COBOL MOVE erledigt diese Aufgabe. Deklarieren Sie eine neue Variable mit einem kompatiblen Datentyp zu dem von DB/2 verwendeten Datentyp. Variable B
oben ist eine solche Variable. Verschieben Sie die Anzeige formatierte Variable auf die gepackte Dezimal-Variable wie in: MOVE A TO B
. Die COBOL-Laufzeit führt diese Konvertierung aus.
Beachten Sie, dass Sie jetzt etwas zu B
hinzufügen können. Display B
(wops der Dezimalpunkt verschwunden - Ich lasse Sie herausfinden, warum).Dann verschiebe es zurück zum Anzeigeformat, hey, der Dezimalpunkt kam zurück.
DB/2 übernimmt Host-Variablen, da sie ohne Konvertierung kommen. Wenn diese Hostvariable nicht das korrekte Datenformat hat, erhalten Sie einen Fehler.
Sie müssen wahrscheinlich etwas tun:
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.
An der Fehler ist ...? und die Spalte in DB2 ist ...? Und das Bild in Cobol ist ...? –