PDA

View Full Version : Dateiabgleich in RPG



Seiten : [1] 2

dino
14-12-07, 13:02
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?

Fuerchau
14-12-07, 13:17
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.

BenderD
14-12-07, 14:56
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.

Fuerchau
14-12-07, 15:23
@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).

B.Hauser
14-12-07, 15:35
@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

Fuerchau
14-12-07, 16:24
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).

BenderD
14-12-07, 16:40
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).

Fuerchau
14-12-07, 16:47
Tja Dieter, man muss sich da auch mal mit Altlasten herumschlagen.

Kann denn SQL inzwischen mit Qualified-DS umgehen ?

B.Hauser
14-12-07, 18:59
@ 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!).

BenderD
14-12-07, 19:33
@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