rec <> x.rec Änderung wird nicht erkannt

5. April 2017 11:28

Hallo Forum,

Mir ist folgendes aufgefallen:
Für RecordRef's sind "rec" und "x.rec" gleich, d.h. sie können nicht unterschieden werden. Sobald im OnModify-Trigger allerdings danach unterschieden wird, um weitere Funktionen anzustoßen, sind hier die Grenzen gesetzt.
Demnach werden Änderungen dann nicht in weitere Tabellen übernommen:
Beispiel:
-> manuelle Änderung des Feldes "Name" eines Debitors in der Debitorenkarte ändert auch den Namen im Kontakt - soweit OK
die Funktion "UpdateContFromCust.OnModify(Rec);" im OnModify - Trigger der T18 wird angestoßen, weil rec und x.rec sich unterscheiden (logisch, weil Name hat sich ja geändert)

-> ändert man den Namen eines Debitors über den Paketdatenimport/export wird der Kontaktname aber nicht geändert (rec und x.rec sind gleich - OnModify in T18 wird zwar durchlaufen allerdings ohne Anstoßen der o.g. Funktion zur Änderung des Kontaktes

Für mich heißt das, ich muss das RapidStart - Tool tatsächlich nur als "Start"-Tool verwenden bzw. genau aufpassen welche Felder ich durch den Import ändere und welche Bezieheungen diese zu anderen Tabellen haben.
Gegebenfalls müsste ich in meinem konkreten Beispiel in einem zweiten Import den Namen am Kontakt separat ändern.

Wie seht Ihr das?
Was nutzt Ihr als Ersatz für die "Suchen und Ersetzen" Funktion?

Vorab schonmal Danke für Meinungen....
Zuletzt geändert von svr am 7. April 2017 11:10, insgesamt 2-mal geändert.

Re: Modify Trigger bei Datenimport (Suchen & Ersetzen)

7. April 2017 11:06

Dieses Problem existiert wohl schon immer bei Recordreferenzen.

Datensatzänderungen über Recordreferenzen scheint ein heikles Thema zu sein, denn die Änderungen am Datensatz werden im Modify-Trigger der Tabelle nicht über den "IF Rec <> xRec"-Vergleich erkannt. Auch den von MS empfohlenen Import über die Konfigurationspakete kann man da vergessen. Eigentlich ein Unding und sehr gefährlich!

Ein mittelmäßiger Workaround wäre es, in den Validate-Trigger von allen relevanten Feldern eine globale Variable auf TRUE zu setzen und diese dann im "IF Rec <> xRec"-Vergleich zusätzlich abzufragen.
Also z.B.:

OnModify Trigger:
Code:
IF (Name <> xRec.Name) OR
   ("Search Name" <> xRec."Search Name") OR
   //[...]
   (Contact <> xRec.Contact)
   OR UpdateContact //<--- Workaround
THEN BEGIN
   //[...]


Name, OnValidate-Trigger
Code:
Name - OnValidate()
  UpdateContact := TRUE; //<--- Workaround


Relevante Felder, sind die Felder, welche im OnModify-Trigger per "Name <> xRec.Name" geprüft werden.

Wie seht ihr das Problem?