[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2003
    Beiträge
    91

    Gruppenwechsel / Änderung Datensatz

    Hilfe, stehe etwas neben mir :-)

    Suche Lösung für RPGLE

    Problem: READ BESTELLUNG

    - Änderung des Datensatzes

    UPDATE BESTELLUNG

    Es soll eine Historie erstellt werden, die nur geschrieben wird wenn sich tatsächlich in BESTELLUNG etwas ändert.

    wie kann ich am einfachsten mit einer Datenstruktur arbeiten?
    danke für eure Hilfe

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Das löst du am einfachsten mit einem Trigger.
    Durch den Vergleich After/Before-Immage (falls nicht alle Felder relevant sind) kannst du dann ein Kopie wegschreiben mit ggf. Ergänzung Timestamp o.ä.

    Das gewährleistet, dass auch Änderungen auf einem anderen Weg (SQL, UPDDTA, ODBC) festgehalten werden.

    Alles andere ist da eher weniger hilfreich, da ggf. nicht sauber implementiert.

    Ansonsten kannst du mit "qualified" Strukturen arbeiten, wobei du bereits bei den F-Bestimmungen die Ziel-DS qualified angeben solltest. Nach dem Read die DS kopieren.
    Dann kannst du per DS-Vergleich die Änderung feststellen.

    Zu beachten ist allerdings dann, dass alle Feldreferenzierungen dann qualified erfolgen müssen.
    Das ist insbesonders dann problematisch, wenn man identische Feldnamen in verschiedenen Dateien (PF und DSPF oder PRTF) verwendet um sich den Move zu sparen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Wir haben das gleiche Problem und es folgendermaßen gelöst:

    1. Definition einer externen Datenstruktur, die auf BESTELLUNG basiert.
    2. Eine Alpha-Variable definieren, die immer die Länge der Datenstruktur hat und die vor der Änderung mit dem alten Datensatzinhalt gefüllt wird.
    3. Vor dem Update einen Vergleich des Datensatzes mit dem gesicherten Alphafeld.

    Hier der Code:
    D BestellSatz E DS EXTNAME(bestellung)
    D BestellKopie S like(BestellSatz)

    read Bestellung // dadurch wird Struktur BestellSatz gefüllt
    BestellKopie = BestellSatz // Alten Datensatzinhalt sichern

    - Änderung des Datensatzes (oder auch nicht)

    if BestellSatz <> BestellKopie
    writeHistorie;
    endif

    Bei Datenstrukuränderungen (z.B. wenn in der Tabelle BESTELLUNG ein neues Feld eingefügt wird) reicht es, das Programm neu zu kompilieren, da die Alpha-Variable mit like definiert ist und damit immer die richtige Länge hat.

    Bei uns klappt das Verfahren seit Jahren problemlos.

    Das mit dem Trigger geht natürlich auch. Dabei hat man den Vorteil, dass alle Änderungen (z.B. auch mit SQL) die Historie fortschreiben

    Gruß,
    Dieter

  4. #4
    Registriert seit
    Sep 2003
    Beiträge
    91
    danke für die Hilfe

    werde mich heute Abend dran setzen !!

  5. #5
    Registriert seit
    Jan 2008
    Beiträge
    90
    Zitat Zitat von dschroeder Beitrag anzeigen
    Wir haben das gleiche Problem und es folgendermaßen gelöst:

    1. Definition einer externen Datenstruktur, die auf BESTELLUNG basiert.
    2. Eine Alpha-Variable definieren, die immer die Länge der Datenstruktur hat und die vor der Änderung mit dem alten Datensatzinhalt gefüllt wird.
    3. Vor dem Update einen Vergleich des Datensatzes mit dem gesicherten Alphafeld.

    Hier der Code:
    D BestellSatz E DS EXTNAME(bestellung)
    D BestellKopie S like(BestellSatz)

    read Bestellung // dadurch wird Struktur BestellSatz gefüllt
    BestellKopie = BestellSatz // Alten Datensatzinhalt sichern

    - Änderung des Datensatzes (oder auch nicht)

    if BestellSatz <> BestellKopie
    writeHistorie;
    endif

    Bei Datenstrukuränderungen (z.B. wenn in der Tabelle BESTELLUNG ein neues Feld eingefügt wird) reicht es, das Programm neu zu kompilieren, da die Alpha-Variable mit like definiert ist und damit immer die richtige Länge hat.

    Bei uns klappt das Verfahren seit Jahren problemlos.

    Das mit dem Trigger geht natürlich auch. Dabei hat man den Vorteil, dass alle Änderungen (z.B. auch mit SQL) die Historie fortschreiben

    Gruß,
    Dieter
    Hallo!

    Ich hab das auch schon mehrmals so gemacht, aber statt eines Alpha-Feldes eine zweite DS mit dem Schlüsselwort PREFIX verwendet. Dadurch bekommen alle Variablen-Namen ein Prefix z.B. 'H' für Hilf o.ä. vorangestellt.
    Dann braucht man nicht mit qualified arbeiten und kann die DS auch mit Like definieren. Vor dem Update wird die DS1 in die DS1H gemoved und mit einem Chain der Satz aus der DB in DS1 gelesen
    Der Vergleich ist dann durch ein einfaches if ds1 <> ds1h erledigt. Wenn Unterschiede herrschen, DS1H zurückmoven und damit die DB updaten.


    Gruß,
    Günter

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von gue_br Beitrag anzeigen
    Ich hab das auch schon mehrmals so gemacht, aber statt eines Alpha-Feldes eine zweite DS mit dem Schlüsselwort PREFIX verwendet. Dadurch bekommen alle Variablen-Namen ein Prefix z.B. 'H' für Hilf o.ä. vorangestellt.
    Dann braucht man nicht mit qualified arbeiten und kann die DS auch mit Like definieren.
    Die Geschichte mit dem Präfix klapp allerdings nur, wenn die neuen Feldnamen (inklusive Präfix) 10 Zeichen nicht überschreiten. Sofern die Feld/Spalten-Namen in der Datei/Tabelle 10 Zeichen lang sind, bekommst Du ein Problem.

    Was ist übrigens Dein Problem mit qualifizierten Datenstrukturen?

    Seit Release V5R2M0 kann man Datensätze direkt in (qualifizierte) externe Datenstrukturen oder Datenstrukturen die mit dem Schlüssel-Wort LikeRec oder LikeDS (basierend auf einer externen Datenstruktur) eingelesen werden. Die Datenstruktur wird dabei in Faktor 2 angegeben. Bei WRITE und DELETE und ab 7.1 sogar bei EXFMT kann ebenfalls eine Datenstruktur angegeben werden. Bei lokalen F-Bestimmungen ist eine Ausgabe und Verarbeitung über Datenstruktur sogar erforderlich.

    Der Vergleich von qualifizierten Datenstrukturen kann ebenfalls mit Datenstruktur1 = Datenstruktur2 (bzw. Datenstruktur1 <> Datenstruktur2) erfolgen.
    Die Übernahme von qualifizierten Datenstrukturen kann ebenfalls über EVAL Datenstruktur2 = Datenstruktur1 erfolgen. Besser ist allerdings an dieser Stelle EVAL-CORR (ab Release V5R4) zu verwenden.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Jan 2008
    Beiträge
    90
    Hallo Brigitta!

    Stimmt natürlich, mit der Länge muß man aufpassen. Bei der Firma in der ich arbeite stammt noch vieles aus RPG III und da war sowieso bei 6 Zeichen für Feldnamen Schluß.
    Auch stimmt es, daß es elegantere Lösungen für das Problem gibt. Qualifizierte DS hab ich auch schon verwendet.

    Mir ging es bei dem Eintrag lediglich darauf hinzuweisen, daß man statt eines langen Charakter-Feldes auch eine zweite DS nehmen könnte. Mehr nicht.

    Es zeigt sich immer wieder, daß es in der Programmiererei immer verschiedene Wege gibt, manche eleganter manche weniger, um zum Ziel zu kommen.

    Trotzdem Danke für die Hinweise.

    Günter

Similar Threads

  1. Datensatz sperren
    By Easyrider in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 06-12-06, 07:48
  2. nach Insert neu gen. Datensatz ermitteln
    By M.Kasper in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 25-08-06, 07:32
  3. Subfile + Overlay und letzter Datensatz
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-06-06, 08:47
  4. Einen Datensatz mit mehreren Sessions benutzen
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 12-05-05, 15:46
  5. Datensatz von Tabelle A nach Tabelle B
    By Schorsch in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 07-05-04, 11:18

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •