[gelöst] CHANGECOMPANY und Events

18. September 2018 10:28

Hallo,

bei einem Beitrag auf mibuso ( https://forum.mibuso.com/discussion/comment/315752 ) wird darauf hingewiesen, dass Events nach einem CHANGECOMPANY noch im ursprünglich gewählten Mandanten ausgeführt werden.
Da der mibuso-Beitrag schon über ein Jahr alt ist, weiß zufällig jemand von euch, ob das mit einem der seither erschienen Updates geändert wurde?
Zuletzt geändert von JRenz am 24. September 2018 09:48, insgesamt 1-mal geändert.

Re: CHANGECOMPANY und Events

24. September 2018 09:24

Hallo Jörg,

mir ist deine Frage nicht ganz verständlich. CHANGECOMPANY bezieht sich immer auf ein bestimmtes Record Objekt.

https://docs.microsoft.com/en-us/dynamics-nav/changecompany-function--record-

Nehmen wir an, dass mein Record Objet sich auf die Tabelle Item bezieht.

Item.CHANGECOMPANY('Mandantenname') bezieht sich auf genau das Objekt mit dem Namen "Item".

Wenn ich jetzt ein OnBeforeModify Event habe und ich führe die Aktion Item.MODIFY aus, dann wird die Item Variabel an das Event übergeben. Im Event haben wir dafür die Variable Rec. Diese Variable ist im gleichen Mandanten wie die Item Variable. Wenn jetzt in diesem Event andere Record Variablen angelegt wurden dann befindet sich diese Variablen im Ursprungsmandanten. Hier wurde auch kein CHANGECOMPANY durchgeführt. um das zu ändern kann z. B. der folgende Programmcode im Event verwendet werden:

Code:
IF Rec.CURRENTCOMPANY <> COMPANYNAME THEN
  Customer.CHANGECOMPANY(Rec.CURRENTCOMPANY);


Gruß

Michael

Re: CHANGECOMPANY und Events

24. September 2018 09:47

Hallo Michael,

das Problem bzw. die Frage hat sich inzwischen erledigt.
Ich hatte dazu die Anforderung, dass beim Löschen eines Artikels alle gleichnamigen Artikel (= selbe Artikelnummer) in allen anderen Mandanten ebenfalls gelöscht werden sollen.

Re: CHANGECOMPANY und Events

24. September 2018 10:03

Hallo,

wenn dem so sein sollte, das der Event-Publisher keinen CHANGECOMPANY für den Event macht, dann heißt das heißt also, dass ein Event- Subscriber grundsätzlich für jeden Record prüfen muss ob er sich im gleichen Mandanten befindet, wie der eigene, und zwar immer folgender Code:
Code:
If COMPANYNAME <> Rec.CURRENTCOMPANY THEN BEGIN
   RecVar1.CHANGECCOMPANY(Rec.CURRENTCOMPANY);
   RecVar2.CHANGECCOMPANY(Rec.CURRENTCOMPANY);
   RecVar3.CHANGECCOMPANY(Rec.CURRENTCOMPANY);
   RecVar4.CHANGECCOMPANY(Rec.CURRENTCOMPANY);
 ..
END;

Wobei nicht immer sicher ist, ob er das wirklich tun muss, da er nicht weiß was der Anwender beabsichtigt hat, was der Event tun soll.
Sollen z.B. mit dem Event Daten aus einem Untermandanten in einem Hauptmandanten konsolidiert werden, kann es sinnvoll sein, dem Event kein CHANGECOMPANY mit zugeben, ansonsten ist das eigentlich immer nötig.
Mir fällt im Moment allerdings kein weiterer Anwendungsfall ein, bei dem es sinnvoll sein könnte, den Event nicht in dem Mandanten auszuführen, in dem sich der zugehörige Record gerade befindet.
Außerdem ist mir noch kein Event- Subscriber untergekommen, der das wirklich berücksichtigt. Die gehen alle davon aus, dass die Daten sich im aktuellen Mandanten befinden.

EDIT: Man lernt doch immer wider etwas dazu: :wink: :oops:
Das Verhalten ist aber auch so, wenn man direkt über lokale Variablen im OnInsertTrigger auf weitere Tabellen zugreift. Diese Tabellen werden auch im ursprünglichen Mandanten geändert.
Ich glaube daran denkt auch nicht jeder. :shock:

Gruß Fiddi