[Gelöst] Fehler beim automatischen Stapelbuchen

22. Juli 2010 16:15

Hallo zusammen,

für eine automatische Belegstapelverarbeitung führe ich über unseren Verarbeitungskalender einen Report aus, der die automatische Verarbeitung der Stapel vorbereitet.
Nach der Vorbereitung wird der Report 298 aufgerufen. Hier wird eine Codunit mit Codeunit.RUN benutzt, welche auf folgenden Fehler läuft

Fehlermeldung hat geschrieben:CodeUnit.Run() ist in Schreibtransaktionen nur dann erlaubt, wenn der Rückgabewert nicht benutzt wird. Nicht erlaubt ist zum Beispiel 'OK := CodeUnit.Run()'.


Mir ist durchaus bewusst was mir die Meldung sagen will. Allerdings weis ich gerade keine Möglichkeit den Aufruf der Codeunit zu umgehen. Der Aufruf sieht wie folgt aus:

Code:
CLEAR(SalesPost);
SalesPost.SetPostingDate(ReplacePostingDate,ReplaceDocumentDate,PostingDateReq);
IF SalesPost.RUN("Sales Header") THEN BEGIN


Den Report 298 rufe ich folgendermaßen auf:

Code:
IF NOT SalesHeader.FINDFIRST THEN
  CurrReport.SKIP;
ExtDocNo := SalesHeader."External Document No.";
PostDate := SalesHeader."Posting Date";

CASE SalesHeader."Document Type" OF
  SalesHeader."Document Type"::Invoice:
    BEGIN
      //Rechnungen verbuchen     
    END;
  SalesHeader."Document Type"::"Credit Memo":
    BEGIN
      //Gutschriften verbuchen
      BatchPostSalesCrMem.USEREQUESTFORM := FALSE;
      BatchPostSalesCrMem.Parameter(ExtDocNo,PostDate,TRUE);
      BatchPostSalesCrMem.RUNMODAL;
    END;
END;


Habt ihr eine Idee, wie ich mein Problem lösen kann?

Viele Grüße
Herdi
Zuletzt geändert von Herdi am 23. Juli 2010 11:58, insgesamt 3-mal geändert.

Re: Fehler beim automatischen Stapelbuchen

22. Juli 2010 17:55

Hallo

Du musst vor IF SalesPost.RUN("Sales Header") THEN BEGIN ein Commit schreiben.

Code:
Commit;
IF SalesPost.RUN("Sales Header") THEN BEGIN


Gruss

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 08:23

Danke, das war die Lösung!

Aber ich versteh ehrlich gesagt noch nicht so ganz warum das hilft.
Ich mach mit der Sales Header Tabelle ja nichts weiter. Kann mir das jemand erklären?

Viele Grüße
Herdi

Re: [Gelöst] Fehler beim automatischen Stapelbuchen

23. Juli 2010 08:30

Führst du noch außerhalb des veröffentlichten Quelltextes irgendwo ein MODIFY (egal welche Tabelle) aus?

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 08:37

Herdi hat geschrieben:Danke, das war die Lösung!

Aber ich versteh ehrlich gesagt noch nicht so ganz warum das hilft.
Ich mach mit der Sales Header Tabelle ja nichts weiter. Kann mir das jemand erklären?

Viele Grüße
Herdi


Das Buchungsdatum vielleicht setzen? :wink:

mfg,
winfy

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 08:38

winfy hat geschrieben:Das Buchungsdatum vielleicht setzen?

Im Standard setzt die Funktion SetPostingDate kein MODIFY ab - bisher glaube ich, dass das nicht der Auslöser ist.

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 10:48

winfy hat geschrieben:Das Buchungsdatum vielleicht setzen? :wink:

mfg,
winfy


Also das Buchungsdatum ist eigentlich schon gesetzt...

Natalie hat geschrieben:Führst du noch außerhalb des veröffentlichten Quelltextes irgendwo ein MODIFY (egal welche Tabelle) aus?


Nach dem veröffentlichen Text wird ein Log per Modify(True) geschrieben. Kann das der Störenfried sein?

Aktuell ist die Lösung meines Problems folgende:
Code:
// -002
IF RepAutomatisch THEN
  COMMIT;
// +002
CLEAR(SalesPost);
SalesPost.SetPostingDate(ReplacePostingDate,ReplaceDocumentDate,PostingDateReq);
IF SalesPost.RUN("Sales Header") THEN BEGIN


RepAtuomatisch ist ein Kenner den ich während dieser Verarbeitung setze. Ich bin aber auch nicht sicher ob ich an dieser Stelle des Reports 298 einen COMMIT ausführen will/soll?

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 10:52

Herdi hat geschrieben:Nach dem veröffentlichen Text wird ein Log per Modify(True) geschrieben. Kann das der Störenfried sein?

Eigentlich nur, wenn dieses MODIFY vor dem CODEUNIT.RUN aufgerufen wird.

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 10:56

Nein, der MODIFY(TRUE) läuft definitiv erst nach dem Codeunit.RUN Aufruf.

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 10:58

Herdi hat geschrieben:Nein, der MODIFY(TRUE) läuft definitiv erst nach dem Codeunit.RUN Aufruf.

Dann habe ich schlichtweg keine Ahnung, warum das System das COMMIT verlangt. Scheinbar reicht auch eine Recordveränderung ohne MODIFY aus??? :oops:

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:19

Natalie hat geschrieben:
Herdi hat geschrieben:Nein, der MODIFY(TRUE) läuft definitiv erst nach dem Codeunit.RUN Aufruf.

Dann habe ich schlichtweg keine Ahnung, warum das System das COMMIT verlangt. Scheinbar reicht auch eine Recordveränderung ohne MODIFY aus??? :oops:


Ich versuch jetzt einfach mal schemenhaft den Vorlauf zu meinem Aufruf auzuzeigen, evtl hilft das.
Code:
Report automatische Verarbeitung
  DataItem Stapel <DataItemIndent = 0>: nur Filter setzen
    DataItem Belege <DataItemIndent = 1>: Report 298 aufrufen und den entsprechenden Stapel mitgeben
      Report "Batch Post Sales Credit Memos"
        DataItem "Sales Header" <DataItemindent = 0>: Fenster öffnen und updaten
        DataItem "Sales Header" <DataItemindent = 0>: Die Codeunit aufrufen (IF CODEUNIT.RUN THEN;)
    DataItem Belege <DataItemIndent = 1>: Nach Report 298 Verarbeitungslog schreiben (MODIFY(TRUE))


Der Report automatische Verarbeitung wird von einem automatischen Verarbeitungskalender aufgerufen. Dieser trägt auch schon was in das Verarbeitungslog, ich haber bisher noch nicht gefunden ob nach diesem Eintrag ein COMMIT erfolgt.
Denke das hier höchstens noch das Problem liegen könnte, da hier eine Tabellenänderung vor dem Codunit.RUN erfolgt.
Ansonsten bin ich grade etwas ratlos...

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:21

Herdi hat geschrieben:Nein, der MODIFY(TRUE) läuft definitiv erst nach dem Codeunit.RUN Aufruf.


Oder vielleicht durch andere Funktionen wie
Code:
CalculateInvoiceDiscount

die auch in diesem Report 298 ausgeführt wird, aber im Standard auch ein COMMIT hat.
Vielleicht gibt es hier weitere Anpassungen / Funktionen die kein COMMIt haben?

Was ist eigentlich dieses
Code:
BatchPostSalesCrMem.Parameter(ExtDocNo,PostDate,TRUE);

?

mfg,
winfy

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:24

Der Report 298 führt seinerseits doch schon eine Buchung aus. Dabei werden natürlich Datensätze geschrieben, geändert oder gelöscht -> Posten werden z.B. erzeugt.
Würdest du - nur zum Test - den Aufruf auskommentieren, müsste doch rein theoretisch dein IF Codeunit.RUN (beim erstmaligen Aufruf) funktionieren.

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:26

winfy hat geschrieben:Was ist eigentlich dieses
Code:
BatchPostSalesCrMem.Parameter(ExtDocNo,PostDate,TRUE);

?


Das ist eine extra angelegte Funktion um benötigte Parameter mitzugeben, die in meiner Verarbeitung gebraucht werden.
Ich nutze da Variablen, weil ich erst dachte dass hier die direkte Verwendung der Tabelle Sales Header zu meinem Problem führt. Die beiden Variablen werden wie folgt gefüllt:
Code:
ExtDocNo := SalesHeader."External Document No."
PostDate := SalesHeader."Posting Date"

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:27

Natalie hat geschrieben:Der Report 298 führt seinerseits doch schon eine Buchung aus. Dabei werden natürlich Datensätze geschrieben, geändert oder gelöscht -> Posten werden z.B. erzeugt.
Würdest du - nur zum Test - den Aufruf auskommentieren, müsste doch rein theoretisch dein IF Codeunit.RUN (beim erstmaligen Aufruf) funktionieren.


Lasse ich den Report 298 alleine über den Verarbeitungskalender laufen bzw. starte ich ihn direkt, habe ich kein Problem mit dem Codeunit Aufruf. Allerdings muss ich den vorgelagerten Report lassen, da nur extra eingerichtete Stapel verarbeitet werden dürfen.

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:31

Ich sagte ja auch "nur zum Test", um damit meine These zu bestätigen.
Du kommst also um das COMMIT nicht herum, es sei denn, der Report soll bei Laufzeitfehlern (durch CODEUNIT.RUN ohne IF) abbrechen.

Re: Fehler beim automatischen Stapelbuchen

23. Juli 2010 11:46

Natalie hat geschrieben:Ich sagte ja auch "nur zum Test", um damit meine These zu bestätigen.
Du kommst also um das COMMIT nicht herum, es sei denn, der Report soll bei Laufzeitfehlern (durch CODEUNIT.RUN ohne IF) abbrechen.


War ja auch nur ein Test ;-) Aber wie gesagt:
Herdi hat geschrieben:Allerdings muss ich den vorgelagerten Report lassen, da nur extra eingerichtete Stapel verarbeitet werden dürfen.