View Full Version : Workdatei CL / RPG Free
... da wird nix zurück gegeben! Die Workdatei wird (vermutlich) in QTEMP erstellt, damit existiert sie nur für den Job, dann schreibt das erste Programm da rein und das zweite liest und druckt.
Diesen Ablauf habe ich mittlerweile nachvollzogen und ist in genau dieser Form gewünscht.
Kleine Änderungen macht man ohne Aufhübscherei, bei mittleren Änderungen könnte man das maschinell nach Freeformat konvertieren (dafür gibt es Tools) und dann ändern, bei größeren Änderungen schmeißt man weg und schreibt neu, wobei man Redesign des Ablaufs nicht vergessen sollte.
Die Programme wurden auf der grünen Wiese in **free geschrieben und funktionierten auch einwandfrei, da ich hier das Druckprogramm als Prototyp übergegeben habe.
....wobei man Redesign des Ablaufs nicht vergessen sollte.
Und jetzt kommen wir zum Ablauf, der bei uns verlangt, dass das ganze mit einem CL gesteuert wird. In dem CL werden Bibliothekslisten gesetzt, die Workdatei erstellt, der Eintrag in der Aktivprüfung gepflegt und das eigentliche Programm gestartet.
Ich glaube das Problem liegt im erstellen der Workfile und wie ich diese im **free RPG einbinde und bearbeite.
Ich glaube das Problem liegt im erstellen der Workfile und wie ich diese im **free RPG einbinde und bearbeite.
Eine einfache Variante ist:
- ein Template in der passenden Lib der Applikation (leere Datei per DDS oder SQL erstellen)
- die leere Datei in den Programmen als extern beschriebene Datei einbinden
- im CL per CRTDUPOBJ oder CPYF das Template in die QTEMP erstellen
- anschließend OVRDBF auf Jobebene, der auf die Datei in der QTEMP zeigt
D*B
Da doch wohl dieser Vorgang als CLP bereits vorliegt, müsste dieser doch ebenso funktionieren?
Was dir nur im DCL-F fehlt ist der RENAME des Fileformats.
Inputfelder werden automatisch deklariert, allerdings ist hier eine Umbenennung erforderlich:
dcl-f ..... rename(MYFILE:MYFILEF);
dcl-ds FileDS extname('MYFILE');
MyFld extfld(MYFILE);
end-ds;
... warum so umständlich?
CREATE TABLE FOO
(
FOO CHAR (20 ) NOT NULL WITH DEFAULT
, FOFO CHAR (10 ) NOT NULL WITH DEFAULT
)
rcdfmt poo
oder einfach per SQL lesen/schreiben. Rename war einmal!
D*B
SQL hatte ichja oben schon mal vorgeschlagen, scheint wohl aber kein Thema zu sein.
Ich habe das ganze jetzt versucht mit SQL zu lösen.
exec sql setOptionnaming=*sys, commit = *none;
PGM1
exec sql
create table bib.wrkfle1(
...
);
exec sql
insert into bib.wrkfle1
values(...);
PGM2 nach der Verarbeitung wird zum Schluss eine Unterprozedur aufgerufen
exec sql
drop table bib.wrkfle1
In der Theorie(ACS) funktioniert dieser drop Befehl.
In der Praxis leider nicht, obwohl er im Debug aufgerufen wird.
Prüfe nach dem Drop Statement den SQLSTATE oder den SQLCODE. Beide Felder sind in der SQL Communications Area (SQLCA) hinterlegt.
Die SQLCA wird vom SQL Precompiler automatisch in das Programm integriert. Bei jedem SQL-Statement, das zur Laufzeit ausgeführt wird, wird die SQLCA aktualisiert.
Die Felder SQLSTATE und SQLCODE kannst Du wie andere Variablen in Deinem Programm verwenden oder den Inhalt beim Debuggen anzeigen.
Ein negativer SQLCODE oder ein SQL Status, der weder mit 00, noch 01 noch 02 beginnt signalisiert einen SQL Fehler.
Der SQLCODE oder der SQLSTATE sollte übrigens nach jedem SQL Statement geprüft werden und im Fehlerfall entsprechende Aktionen ausgeführt werden.
Birgitta
Positionierung der Prozedur war falsch, da die Datei noch geöffnet war..
Jetzt funktionieren die Programme, CLs´ und der Ablauf.
Ein Dankeschön an alle Antworten, die mich enorm weitergebracht haben
und mir die Möglichkeit bieten mich mit anderen Wegen zu beschäftigen.
----------------------------ERLEDIGT----------------------------
Ich habe das ganze jetzt versucht mit SQL zu lösen.
exec sql setOptionnaming=*sys, commit = *none;
PGM1
exec sql
create table bib.wrkfle1(
...
);
exec sql
insert into bib.wrkfle1
values(...);
PGM2 nach der Verarbeitung wird zum Schluss eine Unterprozedur aufgerufen
exec sql
drop table bib.wrkfle1
In der Theorie(ACS) funktioniert dieser drop Befehl.
In der Praxis leider nicht, obwohl er im Debug aufgerufen wird.
... das ist ohnehin schräges Design und funzt nicht wirklich wenn:
- das Programm zweimal gleichzeitig läuft
- das Programm zwischendrin abkackt
außerdem kannst Du keine externe Datenstruktur nutzen, da die Datei zur Compiletime nicht da ist.
Mach das doch einfach so, wie in einem vorhergehenden Beitrag von mir empfohlen.
D*B
Das macht dem Compiler inzwischen gar nichts mehr, da er Namen, die zu diesem Zeitpunkt nicht existieren, für globale Variablen hält. Erst zur Laufzeit erfolgt die tatsächlich Prüfung.
Ausnahmen sind Namen die explizit erkannt werden wie z.B. insert into (f1, f2, ) bzw. update table set f1 = ...
Ein "select abc from myfile" ist dem compiler erst mal egal.
Das ist der Nachteil seit der Einführung globaler Variablen, dass der Compiler Schreibfehler nicht mehr meldet und Fehler erst zur Laufzeit festgestellt werden.
Schöne neue Welt....