2010-12-16 15 views
0

Ich schreibe ein Cobol-Programm, um eine PS-Datei zu lesen und eine DB2-Tabelle basierend auf dem in der PS-Datei gesetzten Flag zu aktualisieren. Eines der Felder in der Datei wird im cobol-Programm als Dezimalfeld deklariert. Aber wenn ich versuche, dieses Feld in der Tabelle zu aktualisieren, zeigt es einen Fehler an. Was sollte ich das gleiche Feld in der Tabelle erklären und wie sollte ich die update Aussage für das Feld schreiben?Wie aktualisiert man eine Tabelle aus einer Datei mit Dezimalfeld?

Der Feldname ist Gehalt, das einen Dezimalpunkt hat.

+1

An der Fehler ist ...? und die Spalte in DB2 ist ...? Und das Bild in Cobol ist ...? –

Antwort

0

Der dezimale Feldtyp enthält den Wert in einem Format, das nicht mit DB2 kompatibel ist und vor der Freigabe des neuen Werts in die Datenbank konvertiert werden muss (vorausgesetzt, Sie haben Schreib- oder Aktualisierungsberechtigungen für den Datensatz). Möglicherweise müssen Sie es in ein Feld PIC 9 (6) V.99 oder ähnliches verschieben und dann den DB2-Datensatz aktualisieren. COBOL ist eine Programmiersprache mit verschiedenen Datenrepräsentationen für die Manipulation, während die Datenbank zum Speichern der Daten in einem Datensatz dient und möglicherweise weniger Formate zur Verfügung hat.

1

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. 
Verwandte Themen