[GELÖST]Differenz zu Bestpreis

15. Februar 2010 16:37

Hallo Profis!

Ich stehe vor einer Aufgabe, die ich einfach nicht zu lösen vermag. Vielleicht könnt ihr mir helfen.
Folg. Aufgabenstellung:
In der Tabelle "Purchase Price" habe ich drei Felder: "Grundpreis", "Mein Preis" und "Differenz zu Bestpreis %".
Gefiltert ist auf eine bestimmte Artikelnr.
"Mein Preis" wird auf Basis von "Grundpreis" und anderen Parametern in OnValidate() von "Grundpreis" berechnet.
Sortiert ist die Tabelle nach dem Feld "Mein Preis" aufsteigend.
Dh, der günstigste Preis eines bestimmten Artikels steht immer als erstes = Bestpreis.
"Differenz zu Bestpreis %" = (("Mein Preis" - Bestpreis) / "Mein Preis" * 100)

Wenn "Grundpreis" verändert wird, kann sich nun der Bestpreis ändern, dh ein anderer Datensatz rückt an die erste Stelle. Das könnte auch der aktuelle Datensatz sein.
Wie sorge ich dafür, dass im Feld "Differenz zu Bestpreis %" innerhalb einer Artikelnr. wirklich immer die richtigen Werte drin stehen?

Vielen Dank für eure Hilfe im Voraus!

LG Gerald
Zuletzt geändert von BadGer am 16. Februar 2010 18:19, insgesamt 1-mal geändert.

Re: Differenz zu Bestpreis

15. Februar 2010 17:21

Kannst du bei der Berechnung von Mein Preis nicht gleich schauen, ob es der neue Bestpreis wird und, falls ja, alle anderen Datensätze dieser Artikelnummer anpassen?

Re: Differenz zu Bestpreis

15. Februar 2010 17:48

Genau das will ich machen.
Aber wie?

LG Gerald

Re: Differenz zu Bestpreis

15. Februar 2010 17:57

Neuen Wert berechnen, mit den anderen vergleichen, falls neues Min: alle anderen anpassen, falls nicht: nur den einen einen anpassen. Versteh ich nun nicht, wo das Problem liegt (?)

Re: Differenz zu Bestpreis

15. Februar 2010 18:14

Das würde dann in etwa so aussehen:

Code:
Grundpreis - OnValidate()
--------------------------------------------------------------------------------
lrePurchasePrice.SETCURRENTKEY("Item No.","Mein Preis");
lrePurchasePrice.SETRANGE("Item No.","Item No.");
IF (lrePurchasePrice.FINDFIRST = TRUE) THEN BEGIN
  ldeBestpreis := lrePurchasePrice.""Mein Preis"";
END ELSE BEGIN
  ldeBestpreis := 0;
END;

// "Mein Preis" berechnen.
// .
// .
// .

"Differenz zu Bestpreis" := (("Mein Preis" - ldeBestpreis) / "Mein Preis" * 100);

IF ("Mein Preis" < ldeBestpreis) THEN BEGIN
  lrePurchasePrice.RESET;
  lrePurchasePrice.SETRANGE("Item No.","Item No.");
  IF (lrePurchasePrice.FINDSET = TRUE) THEN BEGIN
    REPEAT
      lrePurchasePrice2.GET(lrePurchasePrice."Item No.",
                            lrePurchasePrice."Vendor No.",
                            lrePurchasePrice."Starting Date",
                            lrePurchasePrice."Currency Code",
                            lrePurchasePrice."Variant Code",
                            lrePurchasePrice."Unit of Measure Code",
                            lrePurchasePrice."Minimum Quantity"
                           ); // Das ist der Primärschlüssel.
      lrePurchasePrice2.VALIDATE("Grundpreis");
      lrePurchasePrice2.MODIFY;
    UNTIL (lrePurchasePrice.NEXT = 0);
  END;
END;

Da muss ich aber bei einem Artikel, bei dem noch keine Differenzen berechnet wurden, den IF-Block am Ende auskommentieren, einmal das Ganze durchlaufen lassen und erst dann funktioniert der IF-Block. Wenn ich das nicht mache, stürzt NAV ab.
Außerdem kann ich den Feldinhalt von "Grundpreis" nicht verändern -> kommt eine Meldung, dass der Datensatz bereits von einem Anderen Benutzer verändert wurde.

Ich steh voll daneben... :-(
Zuletzt geändert von BadGer am 15. Februar 2010 18:39, insgesamt 1-mal geändert.

Re: Differenz zu Bestpreis

15. Februar 2010 18:36

Wieso berechnest du nicht zuerst Mein Preis, schaust dann, ob einer der anderen Datensätze für diesen Artikel einen besseren Preis bietet, und schreibst dann entweder in dem Datensatz, den du grad bearbeitest, dessen prozentuale Abweichung oder in die anderen (hier nicht alle Datensätze der Artikelnummer einlesen, sondern alle außer deinem).

Wo kommt nun eigentlich "Unit Cost Base 130" her? Oben hast du doch geschrieben, der Wert Bestpreis sei der günstigste "Mein Preis"?

Und wo wird das aufgerufen? Tabelle, Form?

Re: Differenz zu Bestpreis

15. Februar 2010 18:45

McClane hat geschrieben:Wieso berechnest du nicht zuerst Mein Preis, schaust dann, ob einer der anderen Datensätze für diesen Artikel einen besseren Preis bietet, und schreibst dann entweder in dem Datensatz, den du grad bearbeitest, dessen prozentuale Abweichung oder in die anderen (hier nicht alle Datensätze der Artikelnummer einlesen, sondern alle außer deinem).
Das geht nicht: Ich muss die komplette Preisberechnung durchführen lassen je Artikel -> VALIDATE.

McClane hat geschrieben:Wo kommt nun eigentlich "Unit Cost Base 130" her? Oben hast du doch geschrieben, der Wert Bestpreis sei der günstigste "Mein Preis"?
Copy - Paste. Sorry, hab ich schon korrigiert.

McClane hat geschrieben:Und wo wird das aufgerufen? Tabelle, Form?
In der Artikelkarte kann man über ein Menü das EK-Preise-Formular für den angezeigten Artikel aufrufen. Im OnPush()-Trigger werden alle Datensätze zu dem angezeigten Artikel durchgelaufen und das Feld "Grundpreis" validiert.
Außerdem durchläuft nachts eine Routine alle Datensätze, um den "Grundpreis" zu validieren.

LG Gerald

Re: Differenz zu Bestpreis

15. Februar 2010 19:57

Ja, das sind wohl etwas viele Berechnungen auf einen Haufen ... du solltest deinen Code besser strukturieren. Das Validate über die Datensätze könntest du vorab durchführen und zur Not comitten. Ist aber nicht grad schön.

Wieso musst du diesen Preis eigentlich andauernd validieren? :wink:

Vom Gefühl her fände ich es besser, in der Form der EK-Preise mit temporären Kopien der Datensätze zu arbeiten, alle Berechnungen dort durchzuführen und beim Schließen die Tabelle upzudaten, falls nötig.

Re: Differenz zu Bestpreis

16. Februar 2010 18:19

Hallo!

Die Aufgabenstellen wurde jetzt dahingehend geändert, dass nicht mehr die komplette Preisberechnung, sondern nur die Differenz-Berechnung durchgeführt werden muss.
Nun habe ich es so umgesetzt, wie du geschrieben hast.

Danke!

LG Gerald