[gelöst] Fehlermeldung beim Kopieren per RecordRef

26. November 2014 14:53

Heyho,

ich möchte Datensätze aus bestimmten Tabellen von Mandant A (dem Vorlagemandant) nach Mandant B kopieren. Dazu gibt es eine Codeunit, die im 1. Schritt alle Datensätze im Mandant B löscht, um dann im 2. Schritt die Datensätze aus ausgewählten Einrichtungstabellen von A nach B übernimmt, zumindest sollte sie das tun. Die zugehörige Funktion sieht wie folgt aus:

Code:
RecRef1.OPEN(TableID,FALSE,'Vorlage Mandant');
IF RecRef1.FIND('-') THEN BEGIN
  RecRef2.OPEN(TableID,FALSE,'Test Mandant');
  REPEAT
    RecRef2.INIT();
    RecRef2 := RecRef1;
    RecRef2.INSERT(FALSE);
  UNTIL (RecRef1.NEXT = 0);
  RecRef2.CLOSE();
END;
RecRef1.CLOSE();


Soweit ich das im Debugger verfolgen kann, werden die Werte aus RecRef1 auch nach RecRef2 übertragen. Doch gleich nach dem INSERT, in der Zeile mit "UNTIL (RecRef1.NEXT = 0);" bekomme ich die Meldung, dass der eben in RecRef2 eingefügte Datensatz bereits existiert.

Wer kann mir einen Tipp geben, was ich hier falsch mache?
Zuletzt geändert von ThomasFerstl am 26. November 2014 16:05, insgesamt 1-mal geändert.

Re: Fehlermeldung beim mandantenübergr. Kopieren per RecordR

26. November 2014 15:17

Meine Vermutung:
Durch die Zuweisung RecRef2 := RecRef1 wird die gesamte Referenz umgelenkt, so dass RecRef2 dann plötzlich wieder auf den Vorlagen-Mandanten verweist.

Probiere mal, feldweise die Werte zu übertragen:
Code:
RecRef1.OPEN(TableID,FALSE,'Vorlage Mandant');
IF RecRef1.FIND('-') THEN BEGIN
  RecRef2.OPEN(TableID,FALSE,'Test Mandant');
  REPEAT
    RecRef2.INIT();
    FOR I := 1 TO RecRef1.FIELDCOUNT DO BEGIN
      // (evtl. noch auf FieldClass und Enabled prüfen)
      RecRef2.FIELDINDEX(I).VALUE := RecRef1.FIELDINDEX(I).VALUE;
    END;
    RecRef2.INSERT(FALSE);
  UNTIL (RecRef1.NEXT = 0);
  RecRef2.CLOSE();
END;
RecRef1.CLOSE();

Re: Fehlermeldung beim mandantenübergr. Kopieren per RecordR

26. November 2014 15:41

Bei der Arbeit mit RecRefs / FieldRefs auch noch immer mit CLEAR den Speicher freigeben.
Wir hatten auch immer noch auf Type<>'BLOB' geprüft und CLASS='Normal' und diese nicht übertragen.

Codeschnipsel für die Übertragung der Felder von RecRef1 an RecRef2:
Code:
WHILE FieldRefIndex < RecRef1.FIELDCOUNT DO BEGIN
  FieldRefIndex += 1;
  FieldRef1 := RecRef1.FIELDINDEX(FieldRefIndex);
  FieldRef2 := RecRef2.FIELDINDEX(FieldRefIndex);
  IF NOT (FORMAT(FieldRef1.TYPE) IN['Binary','BLOB']) AND (FORMAT(FieldRef1.CLASS) = 'Normal') THEN
              FieldRef2.VALUE := FieldRef1.VALUE;
END;
RecRef2.INSERT;

//bei großen Tabellen evtl. noch COMMIT; nach jedem Rec setzen, sonst läuft Cache irgendwann über
//COMMIT;
RecRef1.CLOSE;
RecRef2.CLOSE;
CLEAR(RecRef1);
CLEAR(RecRef2);
CLEAR(FieldRefIndex);
CLEAR(FieldRef1);
CLEAR(FieldRef2);


mfg,
winfy

Re: Fehlermeldung beim mandantenübergr. Kopieren per RecordR

26. November 2014 16:05

Timo Lässer hat geschrieben:Meine Vermutung:
Durch die Zuweisung RecRef2 := RecRef1 wird die gesamte Referenz umgelenkt, so dass RecRef2 dann plötzlich wieder auf den Vorlagen-Mandanten verweist.


Hallo Timo,

wenn man direkt mit der Nase darauf gestoßen wird, fragt man sich schon, wieso man nicht von selbst darauf gekommen ist ... :roll:

Danke für den Tipp, der war goldrichtig. Bei der Übertragung per FieldRef klappt es jetzt auch. Danke auch an winfy für den Filter auf TYPE.

mfg
Thomas