Einkaufsbestellungen buchen, Zeilen überspringen

11. April 2008 14:16

Nehmen wir mal an wir haben in einer Einkaufsbestellung

Artikel A
Artikel B
Artikel C

Alle 3 Artikel haben ein Haltbarkeitsdatum. Das von Artikel B ist jedoch nur noch 1 Monat gültig. Kann also nicht verwendet werden. Kann man diese Zeile überspringen? Wenn ich einen ERROR verwende bricht er das ganze buchen ja ab. Ich will aber das A und C verbucht werden.

Kann mir da jemand helfen?

11. April 2008 14:35

Kontrollliere doch einfach, dass bei nicht mehr haltbaren Artikeln die Menge zu liefern niemals > 0 gesetzt werden kann. Oder passe die Buchungsroutine an, dass sie die Menge zu liefern wieder auf 0 zurück setzt.

Oder (...) verhindere, dass der Artikel überhaupt in die Bestellzeile eingegeben werden kann?

11. April 2008 15:00

Wie erwähnt habe ich zur Zeit einen ERROR in der CodeUnit 22 wo abgefragt wird ob das Haltbarkeitsdatum größer ist als ein halbes Jahr.

Meine Überlegung war ob der Mitarbeiter dann einfach die Zeilen aus dem Bestellvorgang löscht.. aber das wäre dann wieder mehrarbeit für den Mitarbeiter.

Die Buchungsroutine anpassen und die Menge auf 0 setzen hört sich eigentlich super an.. ABER da trau ich mich ehrlich gesagt nicht so rann. Am besten bespreche ich das mal mit den Mitarbeitern welche die Bestellungen bearbeiten und buchen.

14. April 2008 15:11

Ich arbeite grad an der Lösung das die Buchungsroutine die Menge zu Liefern wieder auf 0 setzt falls das Haltbarkeitsdatum geringer als ein halbes Jahr ist.

Mein Ansatz ist folgender:

Code:
[I]SetupSplitJnlLine(VAR ItemJnlLine2 : Record "Item Journal Line";VAR PostItemJnlLine : Boolean)[/I]
[...]

           IF NOT TempTrackingSpecification.Correction THEN BEGIN
            TempTrackingSpecification.TESTFIELD("Expiration Date");
            IF TempTrackingSpecification."Expiration Date" < CALCDATE('+6M') THEN
               PurchaseLine.RESET;
               PurchaseLine.SETFILTER("Document No.",TempTrackingSpecification."Source ID");
               PurchaseLine.SETFILTER("No.",TempTrackingSpecification."Item No.");
               IF PurchaseLine.FINDFIRST THEN BEGIN
                  PurchaseLine."Qty. to Receive" := 0;
                  MESSAGE('Haltbarkeitsdatum darf nicht kürzer als 6 Monate sein!');
               END;
            END;
[...]


Leider bucht er jedoch ganz normal weiter. Jemand einen Tipp für mich?

14. April 2008 15:28

Die Prüfung musst du schon ganz am Anfang (!) der Codeunit 80 machen.
Außerdem musst du unbedingt mit dem VALIDATE-Trigger arbeiten statt PurchaseLine."Qty. to Receive" := 0.
Und da fehlt noch der allerwichtigste Teil: das PurchaseLine.MODIFY ...

14. April 2008 15:35

Warum CodeUnit 80? Ich arbeite zur Zeit in der CodeUnit 22. Und müsste ich wenn nicht die CodeUnit 90 nehmen? Ich verkaufe ja nicht sondern kaufe ein.

14. April 2008 16:09

Sorry, war im Verkauf.

Gemeint ist die Codeunit 90, aber das Vorgehen ist das gleiche: Ganz am Anfang die Menge zu liefern ggf. auf 0 setzen, bevor die Codeunit zur eigentlichen Buchung kommt, damit die abgelaufene Zeile erst gar nicht weiter verarbeitet wird.

Wenn es Einkauf ist, dann verstehe ich aber eines nicht. Wenn du Ware bestellst und sie wird geliefert, dann buchst du diese aufs Lager - egal ob abgelaufen oder nicht, denn du hast sie ja gerade auf dem Lager.
Erst danach stellst du doch fest, welche chargennr. sie hat, ob sie abgelaufen ist etc. und schickst sie dann (via Rücklieferung oder neg. Menge in Bestellung) zurück.

Hier also den Wareneingang erst gar nicht zu buchen halte ich sogar für den falschen Weg, weil der deinen betrieblichen Prozess doch gar richtig abbildet.

14. April 2008 16:31

Es ist gewünscht das die Ware nicht ins System eingebucht wird.

Also ich habe das ganze jetzt als aller erstes in den OnRun Trigger der CodeUnit 90 gesetzt.

Code:
IF TempTrackingSpecification."Expiration Date" < CALCDATE('+6M') THEN
   PurchLine.RESET;
   PurchLine.SETFILTER("Document No.",TempTrackingSpecification."Source ID");
   PurchLine.SETFILTER("No.",TempTrackingSpecification."Item No.");
   IF PurchLine.FINDFIRST THEN BEGIN
      PurchLine.VALIDATE("Qty. to Receive",0);
      PurchLine.MODIFY;
      MESSAGE('Haltbarkeitsdatum darf nicht kürzer als 6 Monate sein!');
   END;


Er gibt mir auch meine MESSAGE aus. Aber er verbucht fröhlich die Ware. Gibt es nicht die Möglichkeit zu sagen die Zeile zu SKIPen?

14. April 2008 16:39

Da fehlt ein BEGIN ... END nach dem THEN.

14. April 2008 16:47

Das ist es aber leider auch nicht. Ich vermute mal ich muss da irgendwas anderes ändern.

14. April 2008 17:01

Schreib deinen Quelltext bitte noch mal, nur um sicher zu gehen ;-)

14. April 2008 17:08

Code:
OnRun(VAR Rec : Record "Purchase Header")
IF TempTrackingSpecification."Expiration Date" < CALCDATE('+6M') THEN BEGIN
   PurchLine.RESET;
   PurchLine.SETFILTER("Document No.",TempTrackingSpecification."Source ID");
   PurchLine.SETFILTER("No.",TempTrackingSpecification."Item No.");
   IF PurchLine.FINDFIRST THEN BEGIN
      PurchLine.VALIDATE("Qty. to Receive",0);
      PurchLine.VALIDATE("Quantity Received",0);
      PurchLine.MODIFY;
      MESSAGE('Haltbarkeitsdatum darf nicht kürzer als 6 Monate sein!');
   END;
END;

14. April 2008 17:28

PurchLine.VALIDATE("Quantity Received",0);


Das Feld wird durch die cu 90 beim Liefern gebucht. Dort steht die gelieferte Menge 'drin.

Du kannst beim Freigeben in Codeunit 415/414 die Liefermenge bearbeiten.

PurchLine.RESET;
PurchLine.SETFILTER("Document No.",TempTrackingSpecification."Source ID");
PurchLine.SETFILTER("No.",TempTrackingSpecification."Item No.");


Ich würde da noch einen Filter auf die Belegart einbauen.

14. April 2008 17:31

MrBurns hat geschrieben:
PurchLine.VALIDATE("Quantity Received",0);


Das Feld wird durch die cu 90 beim Liefern gebucht. Dort steht die gelieferte Menge 'drin.

Du kannst beim Freigeben in Codeunit 415/414 die Liefermenge bearbeiten.


Das ist eigentlich nur testweise drinne. Weil ich dachte wenn ich beide Spalten versuche auf 0 zu setzen das ich den Code damit ein wenig austrickse. Aber da hab ich wohl falsch gedacht. Ich möchte ja eigentlich das die eine Zeile gar nicht gebucht wird. Aber ich weiß halt noch nicht wie.

14. April 2008 18:18

Heike Bennerscheid hat geschrieben: Ich möchte ja eigentlich das die eine Zeile gar nicht gebucht wird. Aber ich weiß halt noch nicht wie.

Indem du (per Validate) Quantity to Receive = 0 setzt ....
Wenn das dennoch nicht klappen sollte, dann liegt der Fehler woanders.
Ich verstehe z.B. gar nicht, wo du TempTrackingSpecification holst und füllst. Hast du gedebuggt und sicher gestellt, dass die Variable richtig gefüllt wird?

Wird denn die Message ausgegeben?

15. April 2008 16:35

Ich habe das ganze jetzt umgemodelt. Das ganze sieht jetzt so aus:

Code:
PurchLine.SETRANGE("Document No.","No.");
IF PurchLine.FINDFIRST THEN BEGIN
   TempTrackingSpecification.SETRANGE("Source ID",PurchLine."Document No.");
   TempTrackingSpecification.SETRANGE("Item No.",PurchLine."No.");
   IF TempTrackingSpecification.FINDFIRST THEN BEGIN
      IF TempTrackingSpecification."Expiration Date" < CALCDATE('+6M') THEN BEGIN
         PurchLine.VALIDATE("Qty. to Receive",0);
         PurchLine.MODIFY;
         MESSAGE('Haltbarkeitsdatum darf nicht kürzer als 6 Monate sein!');
      END;
   END;
END;


Beim debuggen habe ich aber herausgefunden das er TempTrackingSpecification nicht richtig füllt. Also das SETRANGE klappt schon nicht.