[Gelöst] IF codeunit.RUN und COMMIT

8. Juni 2009 19:17

Guten Abend,

vor lauter Suchen ist mir schon fast schwindlig... Ich habe folgendes Problem:

Innerhalb eines grösseren Batch-Jobs prüfe ich unter Anderem auch Registry-Einträge. Der Aufruf der "WSHSHELL" wird in einer eigenen Codeunit durchgeführt und funktionier auch prima.
Das Problem ist aber, wenn ich diese Codeunit mehrmals nacheinander (z.B. in einem Report" aufrufe, dann erhalte ich die Fehlermeldung, dass dies mit Return Code nicht gehe und ein Commit gemacht werden müsse. Nun gut, ich habe den Commit unmitelbar vor dem Aufruf dieser Codeunit eingebaut und nun funktioniert alles einwandfrei.

Aber... ich habe ein komisches Gefühl dabei. Was wird denn nun genau "commited". Alles vorherige oder nur ein Teil und was davon?

Ich rufe z.B. auf:
Code:
Codeunit A
  > Codeunit B
    > Report C
      > Codeunit D
        > Codeunit E (Registry Einträge prüfen, Aufruf aus Codeunit D mit IF NOT Codeunit.RUN THEN)
        > Codeunit F
      > Codeunit D
        > Codeunit E (Registry Einträge prüfen, Aufruf aus Codeunit D mit IF NOT Codeunit.RUN THEN)
        > Codeunit F
      etc.

Beim zweiten Aufruf der Codeunit E hat es jeweils geknallt. Der Commit ist nun in Codeunit D vor dem Aufruf von Codeunit E eingebaut.
Aber eben, was bewirkt nun der Commit? Wenn nämlich alles zurückgeschrieben würde, wäre es ziemlich gefährlich.
Auf der anderen Seite kann ich einen nicht vorhandenen Registry Eintrag sonst nicht prüfen.

Dies ist nur ein Beispiel der Sequenz. Ich habe aber nirgends konkret etwas zum Commit und dessen Level gefunden.

VIELEN DANK, Beno
Zuletzt geändert von beno am 11. November 2009 09:12, insgesamt 1-mal geändert.

Re: IF codeunit.RUN und COMMIT

9. Juni 2009 07:45

Hi,

ich habe den COMMIT Befehl immer so verstanden, dass er alle Aenderungen (INSERT, DELETE & MODIFY), welche vorher aufgerufen wurden, endgueltig abschliesst / ausfuehrt.

Da COMMIT ja ein eigenstaendiger Befehl ist, nehme ich nicht an, dass es da eine Unterscheidung nach Levels gibt.

Gruesse
feri

Re: IF codeunit.RUN und COMMIT

9. Juni 2009 07:52

Ja, das habe ich eigentlich auch so verstanden.

Aber in einem Beitrag von Timo (http://www.msdynamics.de/viewtopic.php?f=8&t=1897&hilit=IF+codeunit+run) steht:

---
Wenn die Codeunit mit IF Codeunit.RUN(Codeunit::"Meine Codeunit") THEN [...] aufgerufen wird, dann ist alles, was innerhalb dieser Codeunit abläuft eine eigenständige Transaktion.
Das Protokollieren muss innerhalb der Codeunit erfolgen oder vom Aufruf (IF NOT Codeunit.RUN(...) THEN ...) abgefangen werden.
Einen Rollback kannst du dann innerhalb der Codeunit mit einem "leeren" ERROR(''); erzeugen.
---

Interpretiere ich dies nun falsch, wenn ich davon ausgehe, dass es eben mehrere Transaktions- (Commit) Levels gibt?

Re: IF codeunit.RUN und COMMIT

9. Juni 2009 09:20

Hallo Beno,

hier scheinst du wirklich etwas falsch zu verstehen.
NAV unterstützt keine verschachtelten Transaktionen.

Mein von dir zitierter Text ist hier auch ein wenig aus dem Kontext gerissen, denn diese Antwort bezieht sich auf eine andere Problematik.

Da ein IF Codeunit.RUN(...) THEN eine eigenständige Transaktion darstellt, müssen die vorherigen Transaktionen abgeschlossen sein.
Alternativ einfach nur ein Codeunit.RUN(...);, so fällt die Verarbeitung innerhalb der Codeunit in dieselbe Transaktion des aufrufenden Objektes.