Zwei mal REPEAT

20. November 2019 13:48

Hallo Community,

Weiß jemand, wie man den Code so umschreiben kann, dass nicht 2 REPEAT verwendet werden. Die Logik dahinter soll natürlich bleiben. :lol:
Code:
   WarehouseEntry.SETFILTER(Quantity,'>0');
   IF WarehouseEntry.FINDSET THEN BEGIN
    REPEAT
    SourceNo := WarehouseEntry."Source No.";
    BinCode := WarehouseEntry."Bin Code";
    ItemLedgerEntry.SETFILTER("Root Document No.",'<>%1','');
      IF ItemLedgerEntry.FINDSET THEN BEGIN
        REPEAT
          IF SourceNo = ItemLedgerEntry."Root Document No." THEN BEGIN
              ItemJournalLine.RESET;
              ItemJournalLine.SETRANGE("Item No.",ItemLedgerEntry."Item No.");
              ItemJournalLine.SETRANGE("Document No.",ItemLedgerEntry."Document No.");
              IF ItemJournalLine.FINDFIRST THEN BEGIN
                ItemJournalLine."Bin Code" := BinCode;
                ItemJournalLine.MODIFY;
              END;
          END;
        UNTIL ItemLedgerEntry.NEXT = 0;
      END;
    UNTIL WarehouseEntry.NEXT = 0;
   END;
   MESSAGE('Fertig');


Danke im Voraus.

Re: Zwei mal REPEAT

20. November 2019 14:22

Hallo,

wo ist das Problem?

Außer das ich prüfen würde, welche der Repeat- Schleifen mehr Einträge ausschließt (den zu bearbeitenden Datensatz reduziert),
die IF-Abfrage in der innersten Repeat-Schleife mit einen passenden SETRANGE den davor stehenden SETFILTER zu ersetzen,
und mir die lokalen Variablen (SourceNo, BinCode) zu sparen, würde ich an den REPEAT- Schleifen selbst nichts ändern.

Gruß Fiddi

Re: Zwei mal REPEAT

20. November 2019 14:32

Code:
 WarehouseEntry.SETFILTER(Quantity,'>0');
 IF WarehouseEntry.FINDSET THEN BEGIN
  REPEAT
  ItemLedgerEntry.SETRANGE("Root Document No.",WarehouseEntry."Source No.");
    IF ItemLedgerEntry.FINDSET THEN BEGIN
      REPEAT
            ItemJournalLine.RESET;
            ItemJournalLine.SETRANGE("Item No.",ItemLedgerEntry."Item No.");
            ItemJournalLine.SETRANGE("Document No.",ItemLedgerEntry."Document No.");
            IF ItemJournalLine.FINDFIRST THEN BEGIN
              ItemJournalLine."Bin Code" :=WarehouseEntry."Bin Code";
              ItemJournalLine.MODIFY;
            END;
      UNTIL ItemLedgerEntry.NEXT = 0;
    END;
  UNTIL WarehouseEntry.NEXT = 0;
 END;
 MESSAGE('Fertig');


Es dauert noch zu lange. Die Tabelle ItemJournalLine ist kleiner als die Tabelle WarehouseEntry.

Re: Zwei mal REPEAT

20. November 2019 14:39

Hallo,

wie wäre es denn, wenn du einfach mit der "ItemJournalLine" im Repeat anfängst, und dann musst du dir überlegen brauchst du alle? Ich denke nicht.

Gruß Fiddi

Re: Zwei mal REPEAT

20. November 2019 15:40

Code:
     ItemLedgerEntry.SETFILTER("Remaining Quantity",'<>0');

Das Filter sehr viele Datensätze^^. Danke

Re: Zwei mal REPEAT

20. November 2019 16:09

Das meinte ich nicht:

Du hast doch eine gefüllte "Item Journal Line". Dann schaust du nach allen ItemLedgerEntries die zur Journal Line passen. und dann nach den ersten oder letzenWarehouse Entry, der dazu passt.

Gruß Fiddi

Re: Zwei mal REPEAT

21. November 2019 08:52

Hallo,

es wäre hilfreich, wenn du (ChronusAG) beschreiben würdest, was mit den beiden Schleifen erreicht werden soll.
Dann könnte man dir auch den Weg zum passenden Code aufzeigen.

Ich vermute (wie fiddi), dass es sinnvoller wäre, die Logik zu drehen.
Derzeit: Alle Warehouse Entries mit Menge -> passende ItemLegerEntries -> ItemJournalLine
Besser: Derzeit: ItemJournalLine -> passenden ItemLegerEntry -> passenden Warehouse Entry

Re: Zwei mal REPEAT

6. Dezember 2019 16:13

vll. auch mal mit ner Query versuchen

https://docs.microsoft.com/en-us/dynamics-nav/query-objects-and-performance