2. November 2011 17:35
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();
2. November 2011 17:40
2. November 2011 18:12
2. November 2011 18:49
Fred Clever hat geschrieben:Ich glaube es gibt kein Transferfileds.
Fred Clever hat geschrieben:Man muss je Record jedes Feld einzeln je Feldtyp kopieren.
2. November 2011 18:57
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;
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;
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.
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.