retsch hat geschrieben: ↑27.05.2023 14:59
Soll man so ein Update immer mittels Z-Verbunchungsbausteine für Z-Tabellen machen? Was ist der Unterschied, wenn man kein Verbuchungsbaustein verwendet?
Bei Z-Tabellen kannst Du machen, was Du willst. Das ist Deine eigene Tabelle; da gibt es keine Konsistenzabhängigkeiten mit dem SAP-Standard, die eine Rolle spielen könnten.
retsch hat geschrieben: ↑27.05.2023 14:59
was genau bedeutet VERBUCHUNG?
Die "Verbuchung" im SAP-Sinne hat msfox gut beschrieben. Im allgemeinen Sinne bedeutet "Verbuchung", dass Änderungen zunächst nur in einen Puffer gepackt und erst später (nämlich bei der Verbuchung) auf die Datenbank geschrieben werden, und zwar auf SAP-Ebene
(und nicht wie beim COMMIT auf Datenbankebene).
Wie schon erwähnt, habe ich mir ein eigenes Verbucher-Framework programmiert, auf das ich sehr stolz bin und das sehr gut funktioniert. Es ist immer dann nützlich, wenn die Daten nicht sofort in Deinem Code geändert werden können, beispielsweise weil da irgendwelche Sperren drauf liegen. Dann stellt mein Programm einen "Verbucher-Task" in mein Verbucher-Framework ein. Dieser "Task" ist nichts anderes als der Name einer Methode zusammen mit passenden Parametern für diese Methode. Dies wird in einer Tabelle der auszuführenden Tasks gespeichert. Alle 3 Minuten startet das Verbucher-Framework als Job und schaut nach, ob offene Tasks anliegen. Wenn ja, dann versucht es, diese Methode mit diesen Parametern aufzurufen. Die Methode
(die natürlich gleichfalls von mir ist) versucht dann, die Werte zu schreiben. Klappt das, liefert sie einen leeren Errorstring zurück, und das Verbucherframework setzt den Task auf "erledigt". Klappt es nicht, liefert die Methode eine entsprechende Nachricht im Errorstring zurück (z.B.
"Personalnummer gesperrt von Benutzer xyz"). Das Verbucherframework lässt den Task dann offen und probiert es beim nächsten Mal erneut. Dabei gibt es einen Timeout, dass ein Task, der eine gewisse Anzahl von Stunden nicht erfolgreich ausgeführt werden konnte, als final gescheitert angesehen wird.
Außerdem merkt sich das Verbucherframework in einer DB-Tabelle, welchen Task es gerade bearbeitet, bevor es die Methode startet. Sollte die Methode crashen
(Dump oder anderweitig nicht die Kontrolle an das rufende Programm zurückgegeben), dann wird dies 3 Minuten später beim nächsten Verbucherframework-Lauf erkannt und dieser Task auf "crashed" gesetzt und nicht mehr ausgeführt. Die übrigen offenen Tasks, die ggf. durch diesen Crash nicht ausgeführt werden konnten, laufen dann also 3 Minuten später, was in aller Regel kein Drama ist.
Über eine Verbucher-Admin-Transaktion kann man sich jederzeit alle Tasks mit ihren jeweiligen Status anschauen und auch bei gescheiterten oder gecrashten Tasks manuell einen Retry anstoßen. Dadurch ist diese Admintransaktion ein vollwertiges Log, so dass ich in der SM37 keine Joblogflut für den alle drei Minuten laufenden Verbucherjob benötige. Daher hat dieser einen zweiten Step, der immer das Log vom vorherigen Lauf löscht, so dass die SM37 sauber bleibt und das Joblog nicht über Gebühr belastet wird.