[Gelöst] Mindestbestellwert in Verkaufsangeboten

12. August 2019 10:57

Servus,

ich wollte ein Mindestbestellwert in den Verkaufsangeboten hinzufügen, der beim Umwandeln in ein Verkaufsauftrag geprüft wird.
In der Debitortabelle habe ich das Feld "MinAmoutToOrder" angelegt, damit der Mindestbestellwert über die Debitorenkarte gepflegt werden kann.
Bisher habe ich folgenden Code in den "MakeOrder - OnAction()" Trigger auf der Page 41 - Sales Quote getestet:

Code:
MakeOrder - OnAction()
IF  ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
    CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec)
ELSE IF
    FORMAT(TotalSalesLine.CALCSUMS("Line Amount")) < FORMAT(MinOrderAmount.MinAmountToOrder) THEN
    ERROR('Zeilenbetrag unter %1.', MinOrderAmount.MinAmountToOrder);


Wenn ich das Angebot wandel (Mindestbestellwert nicht erreicht) wird ein Auftrag ohne Fehlermeldung erstellt, außerdem wird der Mindestbestellwert der Record-Variable nicht im Fehlertext (Zeilenbetrag unter %1) angezeigt es wird stattdessen eine "0" wiedergegeben.

Irgendwelche Ideen? Vielen Dank im Voraus!
Zuletzt geändert von 1257264937 am 15. August 2019 08:39, insgesamt 2-mal geändert.

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 12:14

Kowa hat geschrieben:Daher bitten wir dich, vor und nach deinem Quelltext diese Code-Tags einzufügen. Beispiel:
[code]Dein Quelltext[/code]

Habe den Beitrag überarbeitet.

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 12:35

FORMAT(WertA) < FORMAT(WertA) ist bei einem numerischen Vergleich falsch, hier immer ohne FORMAT.
Außerdem sollte diese Prüfung zuerst erfolgen.
MinOrderAmount.MinAmountToOrder soll wohl Customer.MinAmountToOrder bedeuten? Dann fehlt für den Debitordatensatz das GET.

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 14:11

Kowa hat geschrieben:Dann fehlt für den Debitordatensatz das GET.

Wie müsste das in meinem Fall aussehen? Habe jetzt folgendes stehen:

Code:
MakeOrder - OnAction()
GET(MinOrderAmount.MinAmountToOrder);
IF  TotalSalesLine."Line Amount" <  MinOrderAmount.MinAmountToOrder THEN
    ERROR('Zeilenbetrag unter %1.', MinOrderAmount.MinAmountToOrder)
ELSE IF 
    ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
    CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);

Es kommt folgende Fehlermeldung, wenn ich das Angebot in einen Auftrag wandel möchte.

Bild

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 14:21

Hallo,

da hat sich Kowa leider geirrt, da du mit REC arbeitest, musst du keinen GET durchführen.

Was allerdings fehlt, wahrscheinlich meinte er das, ist wie du an MinOrderAmount.MinAmountToOrder ran kommst.

Entweder hast du den Mindesbestellwert beim Debitor hinterlegt, dann musst du den Debitoren- Datensatz lesen. Kommen die Daten von wo anders, muss du u.U. diverse Datensätze lesen, bevor du an den Mindestbestell wert ran kommst.

Stell doch mal die Beziehungen zwischen den Tabellen dar.

Gruß Fiddi

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 14:31

Hallo,

vielen Dank für die schnelle Antwort.

fiddi hat geschrieben:Stell doch mal die Beziehungen zwischen den Tabellen dar.


Folgende Beziehungen werden verwendet.

Bild

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 14:37

Hallo,

zum Verständnis hätte jetzt beigetragen, wenn du den Record "MinOrderAmount" von Anfang an "Customer" genannt hättest :wink:

Von welchem Debitor möchtest du denn jetzt den Mindestbestellwert wissen? "Verkauf-an" oder "Rechnung-an" ? für die Berechnung gilt normalerweise der "Rechnung-an"- Debitor.

Gruß Fiddi

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 14:51

Hallo,

fiddi hat geschrieben:Von welchem Debitor möchtest du denn jetzt den Mindestbestellwert wissen? "Verkauf-an" oder "Rechnung-an" ?

von dem "Verkauf-an" Debitor.

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 15:07

O.K.

dann würde dein Code ungefähr so aussehen:
Code:
MakeOrder - OnAction()
if Customer.GET("Sell-to Customer NO.") then begin
  TotalSalesLine.SETRANGE("Document Type","Document Type");
  TotalsalesLine.SETRANGE("Document No.","No.");
  TotalsalesLine.CALCSUMS("Line Amount");
  IF  TotalSalesLine."Line Amount" <  Customer.MinAmountToOrder THEN
    ERROR('Zeilenbetrag unter %1.', Customer.MinAmountToOrder)
  ELSE IF
    ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
    CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);
END;


Und du bist dir sicher, das du kein Angebot in einen Auftrag wandeln können willst, wenn der Mindestbestellwert nicht erreicht ist?

Gruß Fiddi

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 15:11

fiddi hat geschrieben:da hat sich Kowa leider geirrt, da du mit REC arbeitest, musst du keinen GET durchführen.

Mit dem REC vom Verkaufskopf. Ohne GET mit der entsprechenden Nummer wird der Customerrecord nicht vorhanden sein.

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 15:26

Mit dem REC vom Verkaufskopf. Ohne GET mit der entsprechenden Nummer wird der Customerrecord nicht vorhanden sein.


Da er in der Page 41 Sales Quote ist, sollte REC normalerweise auf einen gültigen SalesHeader zeigen (Es sei denn das Angebot ist leer, aber dann nützt der GET auch nichts).

Gruß Fiddi

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 15:38

Hallo,

fiddi hat geschrieben:dann würde dein Code ungefähr so aussehen:
Code:
MakeOrder - OnAction()
if Customer.GET("Sell-to Customer NO.") then begin
  TotalSalesLine.SETRANGE("Document Type","Document Type");
  TotalsalesLine.SETRANGE("Document No.","No.");
  TotalsalesLine.CALCSUMS("Line Amount");
  IF  TotalSalesLine."Line Amount" <  Customer.MinAmountToOrder THEN
    ERROR('Zeilenbetrag unter %1.', Customer.MinAmountToOrder)
  ELSE IF
    ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
    CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);
END;

Vielen Dank hat funktioniert!

fiddi hat geschrieben:Und du bist dir sicher, das du kein Angebot in einen Auftrag wandeln können willst, wenn der Mindestbestellwert nicht erreicht ist?


Doch es soll in einen Auftrag umgewandelt werden, aber es soll automatisch eine Bearbeitungsgebühr ausgerechnet werden und diese dann in den Angebotszeilen (bzw. Im Verkaufsauftrag) hinzugefügt werden
(z.B. Mindestbestellwert 100€ - Artikel 75€ - Bearbeitungsgebühr 25€). Außerdem soll es beim Umwandeln dann eine Info geben, wie Hoch die Bearbeitungsgebühr war. Irgendwelche Ideen wie ich den Code dementsprechend ändern muss?

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 15:50

fiddi hat geschrieben:Da er in der Page 41 Sales Quote ist, sollte REC normalerweise auf einen gültigen SalesHeader zeigen

Ja, was aber nicht ausreicht, wenn man ein Feld aus der Debitorentabelle auswerten muss. In deinem Beispielcode ist doch auch das Customer.GET(…) vorhanden, ohne das es nicht geht.

Re: Mindestbestellwert in Verkaufsangeboten

12. August 2019 15:56

Ja, was aber nicht ausreicht, wenn man ein Feld aus der Debitorentabelle auswerten muss. In deinem Beispielcode ist doch auch das Customer.GET(…) vorhanden, ohne das es nicht geht.


Das hast du auch die ganze Zeit gemeint. Leider kam das nicht so klar rüber, das du den Customer meinst und nicht den SalesHeader. :wink:

Gruß Fiddi

Re: Mindestbestellwert in Verkaufsangeboten

14. August 2019 13:53

Hallo,

ich habe den Code wie folgt erweitert.

Code:
MakeOrder - OnAction()
IF  Customer.GET("Sell-to Customer No.") THEN BEGIN
    SalesLine.SETRANGE("Document Type","Document Type");
    SalesLine.SETRANGE("Document No.","No.");
    SalesLine.CALCSUMS("Line Amount");
    IF  SalesLine."Line Amount" < Customer.MinAmountToOrder THEN
         IF  SalesLine.FINDLAST THEN
             NextLineNo := SalesLine."Line No." + 10000
             ELSE
                NextLineNo := 10000;
                SalesLine.INIT;
                SalesLine."Line No." := NextLineNo;
                SalesLine.Type := SalesLine.Type::Resource;
                SalesLine.VALIDATE("No.",'1100');
                SalesLine.Quantity := 1;
                SalesLine.CALCSUMS("Line Amount");
                TotalFee := (Customer.MinAmountToOrder - SalesLine."Line Amount");
                SalesLine."Unit Price" := TotalFee;
                SalesLine.INSERT;
                MESSAGE('Der Mindestbestellwert von %1€ wurde nicht erreicht! \ Der Restbetrag in Höhe von %2€ wurde als Bearbeitungsgebühr hinzugefügt.', Customer.MinAmountToOrder, TotalFee)
          END;IF 
      ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
      CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);

Mein Ziel war es, wenn der Mindestbestellwert nicht erreicht wird, soll eine neue Zeile mit der Differenz erstellt werden (TotalFee).
Der Code funktioniert soweit, wenn der Mindestbestellwert nicht erreicht wird. Sobald der Mindestbestellwert erreicht wird kommt folgende Fehlermeldung:

Bild

Irgendwelche Ideen wie ich den Code anpassen muss?

Re: Mindestbestellwert in Verkaufsangeboten

14. August 2019 14:16

Code:
MakeOrder - OnAction()
IF  Customer.GET("Sell-to Customer No.") THEN BEGIN
    SalesLine.SETRANGE("Document Type","Document Type");
    SalesLine.SETRANGE("Document No.","No.");
    SalesLine.CALCSUMS("Line Amount");
    IF  SalesLine."Line Amount" < Customer.MinAmountToOrder THEN
         IF  SalesLine.FINDLAST THEN
             NextLineNo := SalesLine."Line No." + 10000
             ELSE
                NextLineNo := 10000;
                SalesLine.INIT;
                // Theoretisch sollte es ohne die beiden Zuweisungen funktionieren. sicher ist sicher
                SalesLine."Document Type" := "Document Type";
                SalesLine."Document No.":="No.";
                SalesLine."Line No." := NextLineNo;
                SalesLine.INSERT; // Erst einfügen, weil das Validate der No. unter Umständen einen bestehenden Datensatz benötigt.
                SalesLine.Type := SalesLine.Type::Resource;
                SalesLine.VALIDATE("No.",'1100');
                SalesLine.Quantity := 1;
                SalesLine.CALCSUMS("Line Amount");
                TotalFee := (Customer.MinAmountToOrder - SalesLine."Line Amount");
                SalesLine."Unit Price" := TotalFee;
                SalesLine.MODIFY;
                MESSAGE('Der Mindestbestellwert von %1€ wurde nicht erreicht! \ Der Restbetrag in Höhe von %2€ wurde als Bearbeitungsgebühr hinzugefügt.', Customer.MinAmountToOrder, TotalFee)
          END;IF
      ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
      CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);

Re: Mindestbestellwert in Verkaufsangeboten

14. August 2019 15:18

m_schneider hat geschrieben:
Code:
MakeOrder - OnAction()
IF  Customer.GET("Sell-to Customer No.") THEN BEGIN
    SalesLine.SETRANGE("Document Type","Document Type");
    SalesLine.SETRANGE("Document No.","No.");
    SalesLine.CALCSUMS("Line Amount");
    IF  SalesLine."Line Amount" < Customer.MinAmountToOrder THEN
         IF  SalesLine.FINDLAST THEN
             NextLineNo := SalesLine."Line No." + 10000
             ELSE
                NextLineNo := 10000;
                SalesLine.INIT;
                // Theoretisch sollte es ohne die beiden Zuweisungen funktionieren. sicher ist sicher
                SalesLine."Document Type" := "Document Type";
                SalesLine."Document No.":="No.";
                SalesLine."Line No." := NextLineNo;
                SalesLine.INSERT; // Erst einfügen, weil das Validate der No. unter Umständen einen bestehenden Datensatz benötigt.
                SalesLine.Type := SalesLine.Type::Resource;
                SalesLine.VALIDATE("No.",'1100');
                SalesLine.Quantity := 1;
                SalesLine.CALCSUMS("Line Amount");
                TotalFee := (Customer.MinAmountToOrder - SalesLine."Line Amount");
                SalesLine."Unit Price" := TotalFee;
                SalesLine.MODIFY;
                MESSAGE('Der Mindestbestellwert von %1€ wurde nicht erreicht! \ Der Restbetrag in Höhe von %2€ wurde als Bearbeitungsgebühr hinzugefügt.', Customer.MinAmountToOrder, TotalFee)
          END;IF
      ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
      CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);


Vielen Dank für die schnelle Antwort! Die Fehlermeldung ist jetzt weg, aber jetzt habe ich folgende Probleme:

  • Wenn der Mindestbestellwert erreicht wird, wird die Message-Funktion trotzdem wiedergegeben.
  • Wenn der Mindestbestellwert erreicht wird, wird in der Rechnung an erster Stelle eine neue Zeile hinzugefügt mit den vordefinierten Parametern und einen negativen Betrag.
  • Wenn der Mindestbestellwert erreicht wird, wird ein negativer Betrag in der Zeile hinzugefügt (z.B. Artikel 1200€, Restbetrag -200€, Summe in der Rechnung 1000€).

Mein Wunsch ist es, wenn der Mindestbestellwert erreicht wird, dass die Rechnung ganz normal ohne Meldung und Eingriffe erstellt wird.

Irgendwelche Ideen wie ich den Code anpassen muss?

Re: Mindestbestellwert in Verkaufsangeboten

14. August 2019 16:37

Du hast ein Begin End vergessen.

Code:
MakeOrder - OnAction()
IF  Customer.GET("Sell-to Customer No.") THEN BEGIN
    SalesLine.SETRANGE("Document Type","Document Type");
    SalesLine.SETRANGE("Document No.","No.");
    SalesLine.CALCSUMS("Line Amount");
    IF  SalesLine."Line Amount" < Customer.MinAmountToOrder THEN BEGIN // Begin hat gefehlt
         IF  SalesLine.FINDLAST THEN
             NextLineNo := SalesLine."Line No." + 10000
           ELSE
                NextLineNo := 10000;

              SalesLine.INIT;
              // Theoretisch sollte es ohne die beiden Zuweisungen funktionieren. sicher ist sicher
              SalesLine."Document Type" := "Document Type";
              SalesLine."Document No.":="No.";
              SalesLine."Line No." := NextLineNo;
              SalesLine.INSERT; // Erst einfügen, weil das Validate der No. unter Umständen einen bestehenden Datensatz benötigt.
              SalesLine.Type := SalesLine.Type::Resource;
              SalesLine.VALIDATE("No.",'1100');
              SalesLine.Quantity := 1;
              SalesLine.CALCSUMS("Line Amount");
              TotalFee := (Customer.MinAmountToOrder - SalesLine."Line Amount");
              SalesLine."Unit Price" := TotalFee;
              SalesLine.MODIFY;
              MESSAGE('Der Mindestbestellwert von %1€ wurde nicht erreicht! \ Der Restbetrag in Höhe von %2€ wurde als Bearbeitungsgebühr hinzugefügt.', Customer.MinAmountToOrder, TotalFee)
          END;
       END;
          IF ApprovalsMgmt.PrePostApprovalCheckSales(Rec) THEN
            CODEUNIT.RUN(CODEUNIT::"Sales-Quote to Order (Yes/No)",Rec);

Re: Mindestbestellwert in Verkaufsangeboten

15. August 2019 08:38

Hallo,

m_schneider hat geschrieben:Du hast ein Begin End vergessen.

Vielen Dank hat funktioniert!