[Gelöst] RecordRef und Changecompany

2. November 2011 17:35

Ich versuche, eine beliebige Tabelle von einem Mandanten in einen zweiten Mandanten zu kopieren

Wenn im Mandant2der Datensatz noch nicht Existent ist, kommt beim einfügen die Fehlermeldung, dass der datensatz bereits existiert.
Wenn ich dann im Mandant2 den Datensatz nur im Primärschlüssel anlege, wird der auch ordentlich gelesen und die Funktion ohne Fehlermeldung abgearbeitet.

Mittels Debugger komme ich zum Schluß, dass RecRefTarget.INSERT() und RecRefTarget.MODIFY() nicht mitbekommen, dass im Mandant2 eingefügt oder geändert werden muss.

Kann es sein, dass RecRefSource "verborgen" auch den Ursprungsmandanten mitführt?
In der Zuweisung RecRefTarget := RecRefSource wird dann der korrekt geöffnete Datensatz aus Mandant2 wieder mit dem "verborgenen" Ursprungsmandanten überschrieben.

Was mache ich falsch?

Code:
CopyRecord2OtherCompany(RecwithRecordID: Record "Records to Copy";RecRefSource : RecordRef)

RecRefTarget.OPEN("Table No.",FALSE,'Mandant2');
IF NOT RecRefTarget.GET(Rec"Record ID") THEN BEGIN
  RecRefTarget := RecRefSource;
  RecRefTarget.INSERT();
END ELSE BEGIN
  RecRefTarget := RecRefSource;
  RecRefTarget.MODIFY();
END;
RecRefTarget.CLOSE();
Zuletzt geändert von uwe50 am 9. November 2011 12:00, insgesamt 1-mal geändert.

Re: RecordRef und Changecompany

2. November 2011 17:40

Probiere mal statt direkter Zuweisung ( ... := ...) ein TRANSFERFIELDS.

Re: RecordRef und Changecompany

2. November 2011 18:12

Ich glaube es gibt kein Transferfileds.

Man muss je Record jedes Feld einzeln je Feldtyp kopieren.

Re: RecordRef und Changecompany

2. November 2011 18:49

Fred Clever hat geschrieben:Ich glaube es gibt kein Transferfileds.

Nicht für RecordRefs - wo du recht hast, hast du recht - oops :oops:

Fred Clever hat geschrieben:Man muss je Record jedes Feld einzeln je Feldtyp kopieren.

Ja. Man kann den RecordRef auf FieldRef-Ebene aufbrechen und so alle Felder einzeln übertragen.
Man hat zwar so viele schöne Funktionen als Alternative, jedoch nicht, ohne auf Records zugreifen zu müssen; damit wäre die Funktion CopyRecord2OtherCompany nicht mehr universell.

Re: RecordRef und Changecompany

2. November 2011 18:57

Hallo, wenn du dir ein Wenig Arbeit sparen willst, schaust du dir die Codeunit "Setup Checklist Management" an.

Gruß, Fiddi

Re: RecordRef und Changecompany

3. November 2011 09:35

uwe50 hat geschrieben:Mittels Debugger komme ich zum Schluß, dass RecRefTarget.INSERT() und RecRefTarget.MODIFY() nicht mitbekommen, dass im Mandant2 eingefügt oder geändert werden muss.
...
Code:
  RecRefTarget := RecRefSource;

Hier lohnt es sich aus meiner Sicht, sich kurz klar zu machen, was eigentlich passiert. Du arbeitest hier mit Record-Referenzen. Es sind also keine Records. Referenzen sind natürlich ungemein praktisch, da sie gewissermaßen allgemeingültig, also für jede Tabell verwendbar, sind. Wenn du nun deiner Target-Referenz die Source-Referenz zuweist passiert was? Genau, die Target-Referenz verweist auf den gleichen Record wie die Source-Referenz. Damit war dann das RecRefTarget.OPEN und das folgende GET (fast) unnötig, da nach der Zuweisung sich die Referenz vollständig geändert hat.

Auch darfst du nicht vergessen, dass eine Referenz im Vergleich zur "normalen" Record-Variablen nicht direkt die Daten "beinhaltet". Deswegen muss man dann ja auch anfangen mit Field-Referenzen zu arbeiten. Du kannst dir jetzt überlegen, ob du Fiddis Rat folgst und es wie in der "Setup Checklist Management" machst (dort sind die zu kopierenden Tabellen aber als Record-Variable angelegt) oder ob du folgenden Code statt des obigen verwendest:
Code:
  FOR i := 1 TO RecRefSource.FIELDCOUNT DO BEGIN
    FieldRefTarget := RecRefTarget.FIELDINDEX(i);
    FieldRefSource := RecRefSource.FIELDINDEX(i);
    FieldRefTarget.VALIDATE(FieldRefSource.VALUE);
    //FieldRefTarget.VALUE := FieldRefSource.VALUE; //Alternativ, aber VALIDATE ist m.E. besser
  END;

Welche Lösung besser bzw. einfacher ist, hängt aus meiner Sicht vor allem von der Anzahl der zu kopierenden Tabellen ab.

Re: RecordRef und Changecompany

9. November 2011 11:57

Tim hat geschrieben:
uwe50 hat geschrieben:Mittels Debugger komme ich zum Schluß, dass RecRefTarget.INSERT() und RecRefTarget.MODIFY() nicht mitbekommen, dass im Mandant2 eingefügt oder geändert werden muss.
...
Code:
  RecRefTarget := RecRefSource;

Hier lohnt es sich aus meiner Sicht, sich kurz klar zu machen, was eigentlich passiert. Du arbeitest hier mit Record-Referenzen. Es sind also keine Records. Referenzen sind natürlich ungemein praktisch, da sie gewissermaßen allgemeingültig, also für jede Tabell verwendbar, sind. Wenn du nun deiner Target-Referenz die Source-Referenz zuweist passiert was? Genau, die Target-Referenz verweist auf den gleichen Record wie die Source-Referenz. Damit war dann das RecRefTarget.OPEN und das folgende GET (fast) unnötig, da nach der Zuweisung sich die Referenz vollständig geändert hat.

Auch darfst du nicht vergessen, dass eine Referenz im Vergleich zur "normalen" Record-Variablen nicht direkt die Daten "beinhaltet". Deswegen muss man dann ja auch anfangen mit Field-Referenzen zu arbeiten. Du kannst dir jetzt überlegen, ob du Fiddis Rat folgst und es wie in der "Setup Checklist Management" machst (dort sind die zu kopierenden Tabellen aber als Record-Variable angelegt) oder ob du folgenden Code statt des obigen verwendest:
Code:
  FOR i := 1 TO RecRefSource.FIELDCOUNT DO BEGIN
    FieldRefTarget := RecRefTarget.FIELDINDEX(i);
    FieldRefSource := RecRefSource.FIELDINDEX(i);
    FieldRefTarget.VALIDATE(FieldRefSource.VALUE);
    //FieldRefTarget.VALUE := FieldRefSource.VALUE; //Alternativ, aber VALIDATE ist m.E. besser
  END;

Welche Lösung besser bzw. einfacher ist, hängt aus meiner Sicht vor allem von der Anzahl der zu kopierenden Tabellen ab.


Mit der Zusatzschleife der Feldzuweisungen funktioniert es tatsächlich problemlos. Vielen Dank.

Allgemein will ich noch darauf hinweisen, dass die Zuweisung
FieldRefTarget.VALIDATE(FieldRefSource.VALUE);
den Code im aktuellen Mandanten ausführt. Validiere ich z.B. auf eine Artikelnummer, wird die Existenz der Artikelstammdaten vom Source (aktueller Mandant) und nicht vom Target (Zielmandant) geprüft. Das war mir vor kurzem auch wieder mal auf die Füsse gefallen.

Re: RecordRef und Changecompany

9. November 2011 15:54

uwe50 hat geschrieben:Allgemein will ich noch darauf hinweisen, dass die Zuweisung
FieldRefTarget.VALIDATE(FieldRefSource.VALUE);
den Code im aktuellen Mandanten ausführt. Validiere ich z.B. auf eine Artikelnummer, wird die Existenz der Artikelstammdaten vom Source (aktueller Mandant) und nicht vom Target (Zielmandant) geprüft. Das war mir vor kurzem auch wieder mal auf die Füsse gefallen.

Das ist richtig und gut, dass du nochmal darauf hinweist. Mir war es beim Schreiben auch aufgefallen und ich wollte noch darauf hinweisen, dass man beim Validate ein Pull vom "Source" zum "Target" machen muss, aber habs dann doch vergessen. Good (and important) call!