View Full Version : Dateiabgleich in RPG
Vor dem Wochendne hab ich noch eine Frage zum RPG:
Ich möchte einzelne Sätze einer Sicherungsdatei (ausgewählt in einer Maske) mit allen Feldern in die Originaldatei übertragen. Sicherungs- und Originaldatei haben zwar unterschiedliche Namen, aber doch gleich Felder. Bei einem "Chain" auf die Originaldatei habe ich doch dann gleiche Feldnamen. Ich will aber nicht die ca. 100 Felder der Sicherungsdatei renamen.
Welchen Trick gibt es hier?
Das geht nur per ILERPG:
F DateiA .... Prefix(A)
F DateiB .... Prefix(B)
Um aber ggf. die 100 Moves zu sparen solltest du dann 2 DS definieren:
D DATEIADS E DS ..... extname(DateiA) Prefix(A)
D DATEIBDS E DS ..... extname(DateiB) Prefix(B)
eval DateiADS = DateiBDS
Vorausgesetzt die Strukturen sind identisch.
wenn man auf gequälte Datenstrukturen umsteigt, dann tut es auch der rostige Ewald - also:
D EineDatei E DS qualified
D NochEine E DS qualified
...
eval-corr EineDatei NochEine
D*B
Das geht nur per ILERPG:
F DateiA .... Prefix(A)
F DateiB .... Prefix(B)
Um aber ggf. die 100 Moves zu sparen solltest du dann 2 DS definieren:
D DATEIADS E DS ..... extname(DateiA) Prefix(A)
D DATEIBDS E DS ..... extname(DateiB) Prefix(B)
eval DateiADS = DateiBDS
Vorausgesetzt die Strukturen sind identisch.
@Dieter
Leider sind qualified DS nicht kompatibel zu F-Bestimmungen.
F-Bestimmungen generieren grundsätzlich Einzelfelder, die man dann selber genau 1 DS zuordnen kann, z.B. mit "E DS".
Wenn dann Namensgleichheit vorliegt, überträgt RPG eben die Inhalte aus den internen Dateipuffern in diese Felder, die ja dann in einer DS liegen.
Qualified hilft da leider nichts, da dies nur auf DS anwendbar ist (D-Bestimmungen)und nicht in I-Bestimmungen (automatisch bei F).
@Fuerchau,
seit Release V5R2 kann man bei allen Lese-Operationen den Datensatz direkt in eine Datenstruktur ausgeben und auch aus einer Datenstruktur updaten oder schreiben.
Damit gibt es mit Dieters Lösung überhaupt keine Probleme.
/Free
Chain MyKey MyFileF1 MyDS1;
Chain MyKey MyFileF2 MyDS2;
Eval-Corr MyDS2 = MyDS1;
Update MyFileF2 MyDS2;
/End-Free
Man lernt eben nie aus!
Allerdings hat die Sache noch einen kleinen Haken.
Die Struktur wird NACH dem Füllen der einzelnen Felder gefüllt.
D.h., zuerst werden die Felder der automatischen I-Bestimmung und anschließend die Struktur gefüllt.
Sollten also 2 Dateien mit den gleichen Feldnamen in einem Programm vorkommen, so werden mit dem Lesen in die Struktur auch die Felder der 2. Datei mit verändert !
Ausserdem bedarf es noch einer zusätzlichen Definition der DS:
dmyds1 e ds extname(teil01:*input)
d qualified
dmyds2 e ds extname(teil01:*output)
d qualified
Man muss also für den Update mit Struktur eine andere Struktur als für den Input definieren.
Auch hier passiert das Merkwürdige:
Zuerst werden die Felder aus der DS in die O-Felder übertragen und erst dann die Daten ausgegeben.
Wenn es also auch hier wiederum zu Namensgleichheit mit anderen Dateien kommt, sind diese Inhalte auf jeden Fall mit geändert.
Bei richtigem Design des Programmes fällt das ggf. nicht weiter auf, allerdings ist die mit Vorsicht anzuwenden.
Und was die Batch-Anwendungen angeht, so fängt man sich da einen nicht unerheblichen Overhead ein:
Beim Lesen werden aus dem internen Puffer die I-Felder gefüllt und anschließend in die Struktur übertragen.
Beim Schreiben genau umgekehrt, nämlich aus der Struktur in die O-Felder und daraus dann in den internen Dateipuffer.
Mit Einzel-Moves!
Bei Massendatenverarbeitung kann das schon mal eine Performancebremse sein.
Anmerkung:
Bei DB-Dateien sind I/O-Felder weitgehend identisch, Ausnahme LF mit berechneten feldern (z.B. SST).
what the hell are F Bestimmungen??? ich verwende da select into
D*B
@Dieter
Leider sind qualified DS nicht kompatibel zu F-Bestimmungen.
F-Bestimmungen generieren grundsätzlich Einzelfelder, die man dann selber genau 1 DS zuordnen kann, z.B. mit "E DS".
Wenn dann Namensgleichheit vorliegt, überträgt RPG eben die Inhalte aus den internen Dateipuffern in diese Felder, die ja dann in einer DS liegen.
Qualified hilft da leider nichts, da dies nur auf DS anwendbar ist (D-Bestimmungen)und nicht in I-Bestimmungen (automatisch bei F).
Tja Dieter, man muss sich da auch mal mit Altlasten herumschlagen.
Kann denn SQL inzwischen mit Qualified-DS umgehen ?
@ Baldur
Kann denn SQL inzwischen mit Qualified-DS umgehen ?
Ja, seit V5R3.
Und nicht nur mit qualifizierten Datenstrukturen, sondern auch mit Array-Datenstrukturen, in die man beim Muliple-Row-Fetch einen ganzen Zeilenblock ausgeben kann.
@Dieter
ich verwende da select into
Aber doch hoffentlich nicht SELECT * INTO, das würde mich jetzt doch schwer treffen.
Auch wenn ich ansonsten fast ausschließlich SQL verwende, wenn ich nur einen einzigen Datensatz komplett lesen muss, verwende ich native I/O (ist immer noch ca. 3-5 Mal schneller als der Select ... into!).
@Baldur: Altlasten sind zum ablösen da, Fallerie und Fallera
das mit dem Pre Compiler und embedded SQL, ich habe da spezielle global definierte DS mit prefix hal in die ich da fetche und dann eine Zuweisung an die qualified Datenstruktur et voila...
@Birgitta: was ist gegen ein select * auf eine View zu sagen???
D*B