Seite 1 von 1

Zwei mal REPEAT

Verfasst: 20. November 2019 13:48
von CronusAG
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

Verfasst: 20. November 2019 14:22
von fiddi
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

Verfasst: 20. November 2019 14:32
von CronusAG
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

Verfasst: 20. November 2019 14:39
von fiddi
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

Verfasst: 20. November 2019 15:40
von CronusAG
Code:
     ItemLedgerEntry.SETFILTER("Remaining Quantity",'<>0');

Das Filter sehr viele Datensätze^^. Danke

Re: Zwei mal REPEAT

Verfasst: 20. November 2019 16:09
von fiddi
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

Verfasst: 21. November 2019 08:52
von jm
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

Verfasst: 6. Dezember 2019 16:13
von sweikelt