Problem I (Speichermanagement)
Die Umsetzung von COBOL-Programmen in eine andere Programmiersprache ist sehr problematisch, da das Speichermanagement von COBOL so in keiner anderen Programmiersprache Anwendung findet.
D.h. um ein COBOL-Programm umsetzen zu können bedarf es erst einmal die Möglichkeit das Speichermanagement abzubilden. Dazu entwickelten wir eine Funktionsbibliothek, mit welcher das Anlegen, Auslesen und Speichern von Daten analog der Vorgehensweise in COBOL möglich ist.
Besonderheiten hier waren die Abbildung von internen Tabellen (OCCURS…), die nochmalige Definition eines Speicherbereichs (REDEFINES…) und die Unterdefinition von Variablen.
Auszug aus einem COBOL-Programm:
05 ART-TEXT PIC X(30).
05 FILLER REDEINFES ART-TEXT.
07 ART-LAENGEX PIC X(4).
07 FILLER REDEFINES ART-LAENGEX.
09 ART-LAENGE PIC 9(4).
07 FILLER PIC X.
07 ART-LAENGE-MM-TEXT PIC XX.
07 FILLER PIC X.
07 ART-BREITEX PIC X(4).
07 FILLER REDEFINES ART-BREITEX.
09 ART-BREITE PIC X(4).
07 ART-BREITE-MM-TEXT PIC XX.
07 FILLER PIC X(16).
06 FILLER REDEFINES ART-TEXT.
07 ART-TEXT-ZEICHEN PIC X OCCURS 30.
Problem II (der "GO TO"-Befehl)
Die nächste Hürde war der "GO TO"-Befehl: Mit diesem besteht die Möglichkeit innerhalb eines Programms, bzw. einer Prozedur an definierte Punkte (Labels) zu springen.
Was die wenigsten wissen: DELPHI unterstützt den GOTO-Befehl ebenfalls!!! D.h. hier konnte durch Defintion der LABELS eine 1:1-Umsetzung erfolgen!
Problem III (Die Befele START, READ, READ NEXT und WRITE)
Die letzte Hürde waren das Lesen und Schreiben der Daten, da diese nicht mehr in Dateien, sondern in SQL-Server-Tabellen gespeichert waren.
Hier war es unumgänglich jeden LESE- und SCHREIB-Befehl in neue Prozeduren, bzw. Funktionen umzusetzen, was aber nur ca. 2% der eigentlichen Umsetzungen waren.
Das Ergebnis
COBOL:
MOVE WS-ARTNR TO ARTIKEL-ARTNR.
MOVE ZERO TO ARTIKEL-ARTNR-SUBNR.
START ARTIKEL KEY NOT LESS ARTIKEL-KEY.
IF DATEI-STATUS = "99" GO TO A999.
READ ARTIKEL NEXT AT END
GO TO A999.
IF ARTIKEL-ARTNR NOT = WS-ARTNR
GO TO A999.
DELPHI:
MOVEVAR('WS-ARTNR','ARTIKEL-ARTNR');
MOVECONST(ZERO ,*ARTIKEL-ARTNR-SUBNR');
if not START_ARTIKEL() then
GOTO A999;
if not READ_ARTIKEL_NEXT() then
GO TO A999;
if GETVAR('ARTIKEL-ARTNR') <> GETVAR('WS-ARTNR') then
GOTO A999;