[gelöst] Portierung von Code von 5.0 nach 3.6 - FINDSET

2. Juli 2008 11:50

Ich habe folgendes Porblem. Ich will Funktionalität aus 5.0 nach 3.6 übernehmen. Ich habe seltsame nebeneffekte.

Ich glaube es liegt an FINDSET. Kann man diesen Befehl in 3.6 nachbauen?

Code aus 5.0

Code:
Code
InsertEntries()
  DtldCustLedgEntry.SETCURRENTKEY("Transaction No.","Customer No.","Entry Type");
  DtldCustLedgEntry.SETRANGE("Transaction No.",DtldCustLedgEntry2."Transaction No.");
  DtldCustLedgEntry.SETRANGE("Customer No.",DtldCustLedgEntry2."Customer No.");
  DELETEALL;
  IF DtldCustLedgEntry.FINDSET THEN
    REPEAT
      IF (DtldCustLedgEntry."Entry Type" <> DtldCustLedgEntry."Entry Type"::"Urspr. Posten") AND
         NOT DtldCustLedgEntry.Unapplied
      THEN BEGIN
        Rec := DtldCustLedgEntry;
        INSERT;
      END;
    UNTIL DtldCustLedgEntry.NEXT = 0;


Code aus 3.6
Code:

Code
InsertEntries()
  DtldCustLedgEntry.SETCURRENTKEY("Transaction No.","Customer No.","Entry Type");
  DtldCustLedgEntry.SETRANGE("Transaction No.",DtldCustLedgEntry2."Transaction No.");
  DtldCustLedgEntry.SETRANGE("Customer No.",DtldCustLedgEntry2."Customer No.");
  DELETEALL;
  IF DtldCustLedgEntry.FIND('-') THEN
    REPEAT
      IF (DtldCustLedgEntry."Entry Type" <> DtldCustLedgEntry."Entry Type"::"Urspr. Posten") AND
         NOT DtldCustLedgEntry.Unapplied
      THEN BEGIN
        Rec := DtldCustLedgEntry;
        INSERT;
      END;
    UNTIL DtldCustLedgEntry.NEXT = 0;


Ich habe beides mit Code Coverage laufen lassen.
In 3.6 wird folgender Code nicht durchlaufen:

Code:
    REPEAT
      IF (DtldCustLedgEntry."Entry Type" <> DtldCustLedgEntry."Entry Type"::"Urspr. Posten") AND
         NOT DtldCustLedgEntry.Unapplied
      THEN BEGIN
        Rec := DtldCustLedgEntry;
        INSERT;
      END;



Wie bekomme ich die Funktionalität von 5.0 nach 3.6?


Schon mal Danke für Tipps.

Ciao
Zuletzt geändert von mhent am 2. Juli 2008 14:17, insgesamt 1-mal geändert.

2. Juli 2008 12:05

Für 3.60 solltest du dies so ersetzen können:

FINDSET -> FIND('-');
Du sagst aber, dein zweites Beispiel mit FIND('-') funktioniert nicht?

2. Juli 2008 12:09

Ja. In 3.60 findet er wohl nach dem DELETEALL; keine Datensätze. Was für mich auch eigentlich logisch ist.

Ich verstehe nicht was FINDSET genau macht. Weil es nach Informationen meines CODE COVERAGEs nach dem DELETEALL trotzdem noch Datensätze in DtldCustLedgEntry findet.

2. Juli 2008 12:23

FINDSET macht im Grunde genau das gleiche wie FIND('-'), nur für SQL-Umgebungen performanter.

Wenn DELETEALL nicht zur Löschung aller Datensätze führt, dann nur deswegegen, weil das DELETEALL mit einem Filter ausgeführt wird - oder weil die Zeile mit DELETEALL gar nicht ausgeführt wird.

2. Juli 2008 13:25

Das DELETEALL wird im Gegensatz zu FINDSET (oder FIND('-')) im vorliegenden Code ohne Bezug auf DtldCustLedgEntry ausgeführt, also für Rec.

Es ist also erstmal zu klären, ob wirklich die Posten gelöscht werden, oder ob Rec etwas anderes ist (evtl eine temporäre Kopie von DtldCustLedgEntry).

2. Juli 2008 13:46

Vielleicht wäre es hilfreich, wenn jemand von euch jenes DELETEALL-Codestück hier mal reinsetzt ...

2. Juli 2008 14:17

Ich habe jetzt mal den Code komplett umgeschrieben und mit einem Workaround die Funktionalität nachgebildet. Ich glaube, dass das Problem vielleicht doch irgendwo anders lag.

Trotzdem Danke