[CC] Verständnisfrage: MODIFY, REPEAT/NEXT und Reihenfolge

16. Januar 2019 13:24

Hallo zusammen und zunächst einmal schon im Vorfeld Danke für die Hilfe.

Ich soll bei der Lagerlogistik die Prioritäten der Picks anpassen und versuche zu diesem Zweck erstmal, das vorhandene System zu verstehen. Dabei bin ich auf einen Codeabschnitt gestoßen, der mir seltsam erscheint. Unterstellend, dass die von mir an dem Code arbeitenden Kollegen nicht Nonsense schreiben und von Neugier (und Sorge hinsichtlich Fehlern, die aus meiner Unkenntnis heraus entstehen) geplagt versuche ich den Code zu verstehen.

Da könnt Ihr mir bestimmt helfen.

Es geht um folgendes Codestück:
Code:
// Filter setzen habe ich mal rausgenommen
IF TempFromBinContent.FINDFIRST THEN BEGIN
  REPEAT
    lRanking := TempFromBinContent."Bin Ranking";
    TempFromBinContent."Bin Ranking" := 1;
    TempFromBinContent.MODIFY;
    TempFromBinContent."Bin Ranking" := lRanking;
    // Funktionaler Code gekürzt, der sich aber nicht auf Bin Ranking bezieht
  UNTIL TempFromBinContent.NEXT = 0;
END;


Nach meinem Verständnis wird in TempFromBinContent."Bin Ranking" eine 1 in der Datenbank gespeichert, aber in der lokalen Instanz des Records der ursprüngliche Wert erhalten. Ich bin etwas verwirrt, warum das so gemacht wird. Soweit ich das überschauen konnte, wird das Feld auch nachfolgend nicht genutzt und auch nicht mehr per MODIFY in die Datenbank geschrieben. Dazu kommt: Das "Temp" im Namen ist schon ein Tell und es handelt sich tatsächlich um eine lokale, temporäre Variable. Was macht in so einem Fall ein MODIFY überhaupt?

Ich tendiere zu der Vermutung, dass das ganze irgendwas mit der Reihenfolge zu tun haben könnte und den Versuch darstellt, das NEXT zu beeinflussen. Macht aber auch wenig Sinn, imho. Vielleicht spielt es keine Rolle, ich würde es nur gerne verstehen, bevor ich anfange, daran herumzumanipulieren. :-)

Re: [CC] Verständnisfrage: MODIFY, REPEAT/NEXT und Reihenfol

16. Januar 2019 13:39

Hallo,

ich denke mal da wäre der Filter vor der Schleife interessant gewesen. Ich vermute mal, da wurde auf "Bin Ranking" gefiltert.
Und jetzt wird versucht, durch das erneute Zuweisen zu verhindern, dass die Sortierung gestört wird oder Datensätze übersprungen werden. Das war in den alten Versionen ein Problem. Meist wurde dann nur jeder dritte Datensatz geändert.

Code:
TempFromBinContent.SETFILTER("Bin Ranking",......);
TempFromBinContent.SETFILTER(......);
TempFromBinContent.MODIFYALL("Bin Ranking",1);


sollte etwas besser funktionieren (funktioniert aber erst seit NAV 5 vernünftig)

ABER bitte vorher testen in einer Testdatenbank.

Gruß Fiddi

Re: [CC] Verständnisfrage: MODIFY, REPEAT/NEXT und Reihenfol

16. Januar 2019 17:24

Danke fiddi!

Die relevanten Filter/Sortieranweisungen davor:

Code:
TempFromBinContent.SETFILTER("Bin Ranking", '<>%1', 0);
TempFromBinContent.SETRANGE("Bin Code");
TempFromBinContent.ASCENDING(FALSE);


MMn sollte keiner davon hier eine Rolle spielen.

Kann mir denn jemand erklären, was MODIFY auf einer temporären Variable überhaupt macht? Ich dachte, da eine temp. Variable eh nur im Speicher und nicht in der DB existiert, dass das ohne Funktion ist.

Re: [CC] Verständnisfrage: MODIFY, REPEAT/NEXT und Reihenfol

16. Januar 2019 17:38

Hallo,

es ist genau das was ich sage darin:
Code:
TempFromBinContent.SETFILTER("Bin Ranking", '<>%1', 0);


durch den Filter und das ändern des gefilterten Wertes ändert sich der Recordzeiger. Das wiederum bringt NEXT durcheinander.

Gruß Fiddi

Re: [CC] Verständnisfrage: MODIFY, REPEAT/NEXT und Reihenfol

17. Januar 2019 10:31

Wer lesen kann, ist klar im Vorteil. Habe irgendwie nur auf SETCURRENTKEYs geguckt, natürlich ist das SETRANGE hier relevant. Danke!

Was mich halt wundert:
Bin Ranking wird ja auf "<> 0" gefiltert. Mit dem Setzen auf "1" ist es weiter im Filter. Mit dem Ursprungswert auch, der ist ja gerade wegen des vorherigen Filters "<> 0". Das Feld ist auch nicht Teil des Primary Keys und ein CurrentKey wird ja nicht gesetzt. Demnach wäre mein Verständnis der Situation, dass es der Reihenfolge hinsichtlich des NEXT furchtbar egal sein sollte, ob da nun 1 oder der ursprüngliche Wert drin steht.

Nun ja, ich muss den Bereich, soweit ich das verstehe, gar nicht verändern. Never change a running system und so.

Danke Dir nochmal für die Erkenntnisse.