Alternativposition auf Angebot

10. August 2009 00:32

Hallo zusammen,

bin gerade dabei für einen Kunden Alternatipositionen ins Angebotswesen zu programmieren, komme da aber leider im Moment noch nicht ganz weiter...

Bisher bin ich hingegangen und habe in Tabelle 37 - Sales Lines ein Boolsches Feld "Option Poisiton" eingefügt und am Ende der Funktion UpdateAmounts gesagt:

IF "Optional Position" = TRUE THEN
"Line Amount" := 0;

Das klappt auch soweit Wunderbar. Wenn ein Artikel als Alternativpoisiton makiert ist ist die Zeilensumme = 0. Wenn ich das Angebot nun aber Ausdrucke, also über den normalen Report, zieht sich NAV irgendwoher wieder die Summe. Wenn ich den Debuggingmodus richtig verfolgt habe kommt das glaub ich aus CodeUnit 80, der ist aber sooft hin und her gesprungen das ich da ehrlich gesagt nicht mehr richtig durchgeblickt habe wo die "Line Amount" nun berechnet wird.

Kann mir hier vielleicht jemand weiterhelfen und mir einen Tipp geben wie ich das Problem am besten Lösen kann?

Vielen Dank schonmal und
lieben Gruß
Christian

Re: Alternativposition auf Angebot

10. August 2009 09:16

Line Amount auf Null zu setzen hilft auch nicht viel. Nimm dafür lieber "Unit Price".

Re: Alternativposition auf Angebot

10. August 2009 09:17

Hi und danke für deine Antwort.

Das geht aber leider nicht da der Einzelpreis ja auf dem Angebot sichtbar sein soll. Ist ja ne Alternativposition zu einem anderen Artikel, da wollen die Kunden natürlich wissen wie teuer diese wäre :)

LG

Re: Alternativposition auf Angebot

10. August 2009 09:22

Wie wäre es mit Zeilenrabatt% = 100?

Re: Alternativposition auf Angebot

10. August 2009 09:24

Und wenn du den Line Amount einfach im Report auf Null setzt?

Re: Alternativposition auf Angebot

10. August 2009 10:24

McClane hat geschrieben:Und wenn du den Line Amount einfach im Report auf Null setzt?

Damit würde in der Angebotsstatistik die Alternativposition voll zählen - deswegen die Alternative mit Zeilenrabatt 100%.

Re: Alternativposition auf Angebot

10. August 2009 11:01

Natalie hat geschrieben:Damit würde in der Angebotsstatistik die Alternativposition voll zählen - deswegen die Alternative mit Zeilenrabatt 100%.

ok, klingt besser :)

Re: Alternativposition auf Angebot

10. August 2009 11:29

Ich stand letzte Woche vor der gleichen Aufgabe :-). Ich hatte das schon mal für Version 2.6 programmiert, der Code ließ sich aber nur bedingt weiterverwenden.

Die Funktion SalesSumLines2 in Codeunit 80 muss modifiziert werden. Die Variable OldSalesLine konnte allerdings nicht auf das neue Feld gefiltert werden, der ließ sich komischerweise über SETRANGE ohne Parameter nicht wieder lösen und dann erschienen die Alternativ-Zeilen im Druck gar nicht mehr. Ich habe in allen Zeilen, in denen summiert wurde, dann
Code:
IF NOT OldSalesLine."Option Position" ...
davor gesetzt. (ich habe das "Alternative Item Line" genannt, die Bezeichnung habe ich in einem SAP-Wörterbuch gefunden :wink: ).
Damit werden die Alternativpositionen dann sowohl in der F9-Belegstatisik und bei der Betrags- und MWST-Berechnung im Report ignoriert.

Zusätzlich wurden Zeilenrabatt und Line Amount im Report genullt( bzw. im daraus aufgerufenen Codeunit, das gehört aber nicht zum Standard).

Re: Alternativposition auf Angebot

11. August 2009 18:50

Hallo Kowa,

danke für deine Antwort. Habe jetzt wie von die Empfohlen das IF-Statement an die Stelle in der SalesSumLines2 gesetzt, wo addiert wird, leider aber ohne erfolg. Hab ich irgendwas vergessen? Code der Funktion habe ich angehängt.

Vielen Dank und lieben Gruß
Christian

Code:
TotalAdjCostLCY := 0;
TempVATAmountLineRemainder.DELETEALL;
OldSalesLine.CalcVATAmountLines(QtyType,SalesHeader,OldSalesLine,TempVATAmountLine);
WITH SalesHeader DO BEGIN
  GLSetup.GET;
  SalesSetup.GET;
  GetCurrency;
  OldSalesLine.SETRANGE("Document Type","Document Type");
  OldSalesLine.SETRANGE("Document No.","No.");
  RoundingLineInserted := FALSE;
  IF OldSalesLine.FINDSET THEN
    REPEAT
      IF NOT RoundingLineInserted THEN
        SalesLine := OldSalesLine;
      CASE QtyType OF
        QtyType::General:
          SalesLineQty := SalesLine.Quantity;
        QtyType::Invoicing:
          SalesLineQty := SalesLine."Qty. to Invoice";
        QtyType::Shipping:
          BEGIN
            IF "Document Type" IN ["Document Type"::"Return Order","Document Type"::"Credit Memo"] THEN
              SalesLineQty := SalesLine."Return Qty. to Receive"
            ELSE
              SalesLineQty := SalesLine."Qty. to Ship";
          END;
      END;
      DivideAmount(QtyType,SalesLineQty);
      SalesLine.Quantity := SalesLineQty;
      IF SalesLineQty <> 0 THEN BEGIN
        IF (SalesLine.Amount <> 0) AND NOT RoundingLineInserted THEN
          IF TotalSalesLine.Amount = 0 THEN
            TotalSalesLine."VAT %" := SalesLine."VAT %"
          ELSE
            IF TotalSalesLine."VAT %" <> SalesLine."VAT %" THEN
              TotalSalesLine."VAT %" := 0;
        RoundAmount(SalesLineQty);

        IF (QtyType IN [QtyType::General,QtyType::Invoicing]) AND
           NOT InsertSalesLine AND CalcAdCostLCY
        THEN BEGIN
          AdjCostLCY := CostCalcMgt.CalcSalesLineCostLCY(SalesLine,QtyType);
          // Ab hier editiert : CM
          IF NOT OldSalesLine."Optional Position" THEN
          // Bis hier editiert : CM
            TotalAdjCostLCY := TotalAdjCostLCY + GetSalesLineAdjCostLCY(SalesLine,QtyType,AdjCostLCY);
        END;

        SalesLine := TempSalesLine;
      END;
      IF InsertSalesLine THEN BEGIN
        NewSalesLine := SalesLine;
        NewSalesLine.INSERT;
      END;
      IF RoundingLineInserted THEN
        LastLineRetrieved := TRUE
      ELSE BEGIN
        LastLineRetrieved := OldSalesLine.NEXT = 0;
        IF LastLineRetrieved AND SalesSetup."Invoice Rounding" THEN
          InvoiceRounding(TRUE);
      END;
    UNTIL LastLineRetrieved;
END;

Re: Alternativposition auf Angebot

11. August 2009 21:29

Den Code habe ich nicht zur Hand, weil ich momentan Urlaub habe :-) . Sinngemäß sah das bei mir aber so aus :
Zeilen mit /////// sind neu.
Code:
TotalAdjCostLCY := 0;
TempVATAmountLineRemainder.DELETEALL;
OldSalesLine.CalcVATAmountLines(QtyType,SalesHeader,OldSalesLine,TempVATAmountLine);
WITH SalesHeader DO BEGIN
  GLSetup.GET;
  SalesSetup.GET;
  GetCurrency;
  OldSalesLine.SETRANGE("Document Type","Document Type");
  OldSalesLine.SETRANGE("Document No.","No.");
  RoundingLineInserted := FALSE;
  IF OldSalesLine.FINDSET THEN
    REPEAT
      IF NOT RoundingLineInserted THEN
        SalesLine := OldSalesLine;
      CASE QtyType OF
        QtyType::General:
        SalesLineQty := SalesLine.Quantity;
        QtyType::Invoicing:
          SalesLineQty := SalesLine."Qty. to Invoice";
        QtyType::Shipping:
          BEGIN
            IF "Document Type" IN ["Document Type"::"Return Order","Document Type"::"Credit Memo"] THEN
              SalesLineQty := SalesLine."Return Qty. to Receive"
            ELSE
              SalesLineQty := SalesLine."Qty. to Ship";
            END;
      END;
     
      DivideAmount(QtyType,SalesLineQty);
      SalesLine.Quantity := SalesLineQty;
      IF NOT OldSalesLine."Alternative Item Line" THEN BEGIN /////////
      IF SalesLineQty <> 0 THEN BEGIN
        IF (SalesLine.Amount <> 0) AND NOT RoundingLineInserted THEN
          IF TotalSalesLine.Amount = 0 THEN
            TotalSalesLine."VAT %" := SalesLine."VAT %"
          ELSE
            IF TotalSalesLine."VAT %" <> SalesLine."VAT %" THEN
              TotalSalesLine."VAT %" := 0;
        RoundAmount(SalesLineQty);

        IF (QtyType IN [QtyType::General,QtyType::Invoicing]) AND
           NOT InsertSalesLine AND CalcAdCostLCY
        THEN BEGIN
          AdjCostLCY := CostCalcMgt.CalcSalesLineCostLCY(SalesLine,QtyType);
          TotalAdjCostLCY := TotalAdjCostLCY + GetSalesLineAdjCostLCY(SalesLine,QtyType,AdjCostLCY);
        END;

        SalesLine := TempSalesLine;
      END; ////////////
      END;
      IF InsertSalesLine THEN BEGIN
        NewSalesLine := SalesLine;
        NewSalesLine.INSERT;
      END;
      IF RoundingLineInserted THEN
        LastLineRetrieved := TRUE
      ELSE BEGIN
        LastLineRetrieved := OldSalesLine.NEXT = 0;
        IF LastLineRetrieved AND SalesSetup."Invoice Rounding" THEN
          InvoiceRounding(TRUE);
      END;
    UNTIL LastLineRetrieved;
END;


Außerdem hatte in Codeunit 81 noch eine Prüfung drin, damit solche Zeilen nicht geliefert/fakturiert werden können, und bei der Übernahme von Angebot in Auftrag wurden die Alternativpositionen ignoriert.

Re: Alternativposition auf Angebot

12. August 2009 13:35

Hallo Kowa,

ich mag die CodeUnit 80 nicht :)

Jetzt habe ich es entsprechend deines Vorschlages geändert und jetzt steht die Position noch drin, aber immer nur noch Anzahl=1. Merkwürdig. Kann mir da jetzt garkeinen Reim mehr drauf bilden. Hast du da noch eine Idee?

LG
Christian

Re: Alternativposition auf Angebot

12. August 2009 17:43

Bubbleman hat geschrieben:Jetzt habe ich es entsprechend deines Vorschlages geändert und jetzt steht die Position noch drin, aber immer nur noch Anzahl=1. Merkwürdig. Kann mir da jetzt garkeinen Reim mehr drauf bilden. Hast du da noch eine Idee?

Ich habe den Code bei der Zuweisung der SalesLineQty modifiziert. Die Berichte, die wir in unserer Branchenlösung haben, sind stark modifiziert und durchlaufen zur Laufzeit noch ein Codeunit.
Mit dem obigen Code wird aus den Alternativzeilen der Betrag, der MWST-Anteil und die Menge aus der F9-Belegstatistik herausgerechnet.
Dazu muss außerdem noch CalcVATAmountLines in der Tabelle 37 Verkaufszeile angepasst werden :
Code:
  SETFILTER(Type,'>0');
  SETFILTER(Quantity,'<>0');
  /////
  SETRANGE("Alternative Item Line",FALSE);
  /////
  SalesSetup.GET;

Der Filter muss unten in der Funktion analog zu den beiden anderen wieder entfernt werden!

Wenn beim Standardbericht im DataItem RoundLoop
Code:
IF SalesLine."Alternative Item Line" THEN BEGIN
   SalesLine."Line Amount" := 0;
   SalesLine."Line Discount Amount" := 0;
   "Sales Line"."Line Amount" := 0;
   "Sales Line"."Line Discount Amount" := 0;
END;

eingefügt wird, wird bei Report 204 die Summe der Beträge der Alternativzeilen und deren MWST-Anteil aus dem Endbetrag herausgerechnet und in der Alternativzeile wird der Betrag nicht mehr anzeigt, korrekte Menge und Preis aber weiterhin.