Fehler im Standard: Stapelbuchen

9. April 2009 10:29

Einem Kunden, der im EK und VK heftigst das Stapelbuchen verwendet, ist aufgefallen daß die Rabattberechnung falsch ist.

hier die korrigierte Version des Verkaufs:

Code:
CalculateInvoiceDiscount()
SalesLine.RESET;
SalesLine.SETRANGE("Document Type","Sales Header"."Document Type");
SalesLine.SETRANGE("Document No.","Sales Header"."No.");
IF SalesLine.FIND('-') THEN BEGIN
//statt:  IF SalesCalcDisc.RUN(SalesLine) THEN BEGIN
    SalesCalcDisc.RUN(SalesLine);
    "Sales Header".GET("Sales Header"."Document Type","Sales Header"."No.");
    COMMIT;
  END;

Re: Fehler im Standard: Stapelbuchen

9. April 2009 11:08

In NAV 2009 lautet der Code übrigens auch noch immer so:

Code:
IF SalesLine.FIND('-') THEN
  IF SalesCalcDisc.RUN(SalesLine) THEN BEGIN
    "Sales Header".GET("Sales Header"."Document Type","Sales Header"."No.");
    COMMIT;
  END;

Re: Fehler im Standard: Stapelbuchen

9. April 2009 11:29

Kommt bei fehlerfreiem Durchlauf der Codeunit ja auch aufs Gleiche raus.

Re: Fehler im Standard: Stapelbuchen

9. April 2009 11:47

Sollte der Code nicht so lauten?

Code:
IF SalesLine.FIND('-') THEN BEGIN
  IF SalesCalcDisc.RUN(SalesLine) THEN;
  Sales Header".GET("Sales Header"."Document Type","Sales Header"."No.");
  COMMIT;
END;


Denn wenn aus welchen Gründen auch immer SalesCalcDisc.RUN auf einen Fehler läuft, bricht bei deiner Lösung die Stapelverarbeitung ab - oder was genau wolltest du damit korrigieren?
Im Augenblick sehe ich nicht, was an der Standardlösung genau falsch war.

Re: Fehler im Standard: Stapelbuchen

9. April 2009 13:30

Natalie hat geschrieben:Sollte der Code nicht so lauten?

Code:
IF SalesLine.FIND('-') THEN BEGIN
  IF SalesCalcDisc.RUN(SalesLine) THEN;
  Sales Header".GET("Sales Header"."Document Type","Sales Header"."No.");
  COMMIT;
END;


Denn wenn aus welchen Gründen auch immer SalesCalcDisc.RUN auf einen Fehler läuft, bricht bei deiner Lösung die Stapelverarbeitung ab - oder was genau wolltest du damit korrigieren?
Im Augenblick sehe ich nicht, was an der Standardlösung genau falsch war.


Laut 'F1' und auch dem Beispiel beim kunden darf der Rückgabewert einer Codeunit nicht abgefragt werden. Deswegen ist if codeunit.run flasch.

Re: Fehler im Standard: Stapelbuchen

9. April 2009 13:34

was heist hier "darf" ?

wenn etwas einen Rückgabewert hat, wieso sollte ich den nicht mit IF abfragen dürfen?

Re: Fehler im Standard: Stapelbuchen

9. April 2009 13:35

Markus Merkl hat geschrieben:Laut 'F1' und auch dem Beispiel beim kunden darf der Rückgabewert einer Codeunit nicht abgefragt werden.
????
Beim Stapelvorgängen MUSS ich den Rückgabewert einer Codeunit abfragen, damit bei Fehlern der Stapel weiter läuft.

Re: Fehler im Standard: Stapelbuchen

9. April 2009 14:20

Hallo,

da gibts doch diese NAV- Fehlermeldung, wenn man in einer Schreibtransaktion ein Form.RunModal macht. In dieser Meldung war auch was mit Codeunit.RUN, hab die Meldung aber gerade nicht parat. :wink:
Könnte die Änderung evtl. damit was zu tun haben?

Gruß, Fiddi

Re: Fehler im Standard: Stapelbuchen

9. April 2009 14:52

Ja genau, /das/ war auch der Inhalt der Fehlermeldung.

Im Stapelbuchenreport -mit der Option 'Rabatt berechnen' wird im Report in der Report-Funktion die Codeunit mit if... aufgerufen.

Re: Fehler im Standard: Stapelbuchen

9. April 2009 14:57

Hallo Markus,

der Rechnungsrabatt ist sicherlich falsch, wenn man die Zeilenrabatte erst berechnet und damit die Zeilensumme und damit die Belegsumme, wenn man die Rechnungsrabatt schon berechnet hat :wink:.

ich denke, wenn du die Rabattberechnung vertauscht, kannst du auch das 'if...' wieder aktivieren.

Gruß, Fiddi

Re: Fehler im Standard: Stapelbuchen

9. April 2009 23:47

fiddi hat geschrieben:da gibts doch diese NAV- Fehlermeldung, wenn man in einer Schreibtransaktion ein Form.RunModal macht. In dieser Meldung war auch was mit Codeunit.RUN, hab die Meldung aber gerade nicht parat.
Könnte die Änderung evtl. damit was zu tun haben?

Diese Fehlermeldung sagt aber doch auch, dass man sie durch ein Commit vermeiden kann, oder meint ihr eine andere? Das Commit steht ja jedenfalls da, was es nach "if Codeunit.run .. " auch muss, wenn ich mich nicht irre.

Bei "if codeunit.run .." werden meines Wissens nach auch die darin enthaltenen Variablen bei jedem Aufruf automatisch neu gecleart. Je nach Definition der Variable SalesCalcDisc (global/lokal) passiert das nun nicht mehr, so dass mir das jetzt eher fehleranfällig vorkommt.

Ein anderes ganz schönes Beispiel für den Aufruf einer Codeunit unter Verwendung des Rückgabewerts ist der Planungslauf in der Produktion (ab 5.0). Da werden die während des Laufs aufgelaufenen Fehler bei entsprechend aktivierter Option ausgewertet und am Ende in einer Liste ausgegeben.

Re: Fehler im Standard: Stapelbuchen

14. April 2009 09:36

@McLane,

die Fehlermeldung besagt, das man während einer Schreibtransaktion die Objekte nicht aufrufen darf, da sie NAV blockieren würden. Eine Schreibtransaktion wird i.d.R. durch ein Commit abgeschlossen. D.h. das Commit muss vor dem Codeunit.Run kommen, damit die Schreibtransaktion abgeschlossen ist.

Gruß, Fiddi

Re: Fehler im Standard: Stapelbuchen

14. April 2009 12:46

Stimmt, vor dem if Codeunit.run muss alles commited sein. Ich hatte die C/Side-Hilfe anscheinend grad nicht auswendig parat :-/