Lagerbestände von den Artikel zwischenspeichern

31. Dezember 2019 18:16

Hallo,
ich habe einen Planungscode, welcher ca. 8 Minuten dauert.
Dabei brauche ich von der Artikeltabelle einige FlowFields (Lagerbestand, Auftragsbestand usw.).
Aktuell habe ich im Code immer mit CalcFields das benötigte Feld errechnet. Nun kann es aber vorkommen, das sich z.B. der Lagerbestand während der Ausführung des
Codes ändert und dann rechnet das Programm eigentlich falsch.

Nun ist meine Idee die Item Table, beim Start in eine Temp-Table zu speichern und mit dieser dann zu arbeiten.
Würdet ihr das auch so machen bzw. geht es das überhaupt mit dem FlowFields.
Weil sonst müsste ich eine neue Tabelle erstellen und diese beim Start mit der Artikeltabelle befüllen. Wobei ich hier dann keine FlowFields verwenden würde.

Danke und lg
stony

PS: ein gesundes und gutes neues JAHR -:)

Re: Lagerbestände von den Artikel zwischenspeichern

1. Januar 2020 14:46

Auch ein gesundes und erolgreiches neues Jahr :) Eigentlich... klingt das nach einer Menge Locktable() Aufrufen für die ganzen Flowfield-Quelltabellen. Das stoppt natürlich Prozesse die dann Deine Daten verändern wollen. Wenn Du weisst das die Berechnung der Flowfields über alle Artikel schnell ist (klingt nicht so), kannst Du auch die Locktables alle setzen, die Flowfields berechnen, und die Ergebnisse in Deiner Tabelle speichern. Dann die Locks wieder lösen. Das geht nur indem der Code mit Commit() abgeschlossen wird oder der auszuführende Code endet - da Du Deine Tabelle ja speicherst, wäre das eine Möglichkeit. Im Anschluss dann den Planungscode über Deine Tabelle laufen lassen, ja. Die spannende Frage ist wieso der Code so lange läuft - kann man da was mit Schlüsseln oder Queries optimieren? NAV2017 braucht ja nicht unbedingt die Schlüssel, der SQL Server freut sich trotzdem über sinnvolle Indizes.

LG Jens

Re: Lagerbestände von den Artikel zwischenspeichern

2. Januar 2020 19:40

Habe das nun mal versucht.
Die neue Tabelle ist ident mit der Tabelle 27 nur das kein Code mehr vorhanden ist und das es kein FlowField-Feld mehr gibt.

Wenn ich das mit diesen Code ausführe benötigt das Löschen ca. 45 Sekunden und das Einfügen ca. 30 Sekunden.
Das ist nicht wirklich schnell!
Wie könnte ich das beschleunigen ??

Code:
Startzeit := TIME;
ProdPlArtikel.RESET;
ProdPlArtikel.DELETEALL(FALSE);

Startzeit1 := TIME;
Item.RESET;
//Item.SETRANGE("No.",'101010000004');
Item.SETAUTOCALCFIELDS(Inventory,"Qty. on Sales Order","Lagerbestand ZELOGISTIK","Lagerbestand MUSTER");
IF Item.FINDFIRST THEN BEGIN
  REPEAT   
    ProdPlArtikel.INIT;
    ProdPlArtikel.TRANSFERFIELDS(Item);   
    ProdPlArtikel.Inventory := Item.Inventory;
    ProdPlArtikel.INSERT;   
  UNTIL Item.NEXT = 0
END;

MESSAGE('Start %1 und %2 End %3',Startzeit,Startzeit1,TIME);

Re: Lagerbestände von den Artikel zwischenspeichern

2. Januar 2020 20:25

Ein paar Ideen zum Ausprobieren:
* Statt den kompletten Datensatz zu kopieren nur die benötigten Felder
* die eigene Tabelle als temporäre Tabelle definieren

Re: Lagerbestände von den Artikel zwischenspeichern

2. Januar 2020 21:14

Hallo,

Ich würde die eigene Tabelle wohl erst nach Experiment temporär machen. Wieviele Schlüssel gibts denn so? Für die eigene Tabelle brauchst Du eigentlich (?) nur den Primärschlüssel und die für die gewünschten Reihenfolgen. Und über wieviele Datensätze reden wir hier? Am Code fällt mir nur auf, das
Code:
if findfirst then repeat
verwendet wird. Wenn ich das noch richtig im Kopf habe ist das eine langsame Aktion. Stattdessen lieber
Code:
if findset then repeat
... gibt es Set-Beschränkungen in den moderneren NAVs?
Interessant wäre zu erfahren was der Profiler so sagt, wo die Zeit liegenbleibt... in den Calcfields?

LG Jens