[Gelöst] - Event wird nicht durchlaufen

26. Mai 2018 17:21

In CU 365 gibt es neu 2 Publisher-Events, OnBeforeContactAddrAlt und OnBeforeFormatAddress.

OnBeforeFormatAddress kann ich problemlos in eine andere CU einbinden und wird auch sauber durchlaufen, bzw. der Code in meiner eigenen CU wird ausgeführt. Hingegen wird OnBeforeContactAddrAlt einfach ignoriert.

Weiss jemand vielleicht, warum, oder wie man so etwas auf die Spur kommt?
Zuletzt geändert von rotsch am 28. Mai 2018 09:49, insgesamt 1-mal geändert.

Re: Event wird nicht durchlaufen

28. Mai 2018 07:11

Du könntest schauen ob der Event überhaupt in der Codeunit aufgerufen wird. Das passiert im Code wie bei einem Funktionsaufruf.
Vielleicht taucht auch bei den CU-Beschreibungen schon irgendwas auf.

Re: Event wird nicht durchlaufen

28. Mai 2018 07:56

So wie ich das verstehe, wird der Event innerhalb von CU 365 nicht ausgeführt, sonst müsste ich ja mit dem Debugger sehen, dass meine eigene Funktion durchlaufen wird, oder?

Ich habe zusätzlich noch einen eigenen Funktionsaufruf eingebaut, und der klappt

Code:
// Das ist der Standardaufruf in den Event von CU 365
OnBeforeContactAddrAlt(AddrArray,Cont,AltAddressCode,ActiveDate,Handled);

// Eigene Funtkion, die eigentlich über den Event ausgeführt werden sollte
cuEventsFormatAddress.OnBeforeContactAddrAlt(AddrArray,Cont,AltAddressCode,ActiveDate,Handled);

Re: Event wird nicht durchlaufen

28. Mai 2018 08:27

rotsch hat geschrieben:So wie ich das verstehe, wird der Event innerhalb von CU 365 nicht ausgeführt, sonst müsste ich ja mit dem Debugger sehen, dass meine eigene Funktion durchlaufen wird, oder?

Im Grunde ja. Was ich meinte ist, in der CU 365 müsste der Event irgendwo, neben der Definition, nochmal im Code auftauchen. An dieser Stelle wird er Event dann eigentlich geworfen.
Wenn nicht, scheint Microsoft in tatsächlich vergessen zu haben.

Re: Event wird nicht durchlaufen

28. Mai 2018 08:29

Ja, den gibt es, darum wundert mich das auch, aber er funktioniert eben nicht.

Code:
LOCAL [IntegrationEvent] OnBeforeContactAddrAlt(VAR AddrArray : ARRAY [8] OF Text[50];VAR Cont : Record Contact;AltAddressCode : Code[10];ActiveDate : Date;VAR Handled : Boolean)

Re: Event wird nicht durchlaufen

28. Mai 2018 08:32

rotsch hat geschrieben:So wie ich das verstehe, wird der Event innerhalb von CU 365 nicht ausgeführt

Events werden nicht ignoriert, jedenfalls nicht solange deine Subscriber sauber angelegt sind und funktionieren (siehe Debugger --> Ereignisabonnements).
Wenn dein Subscriber dennoch nicht ausgeführt wird, dann kann es nur daran liegen, dass die Publisherfunktion selbst nicht ausgeführt wird.

OnBeforeContactAddrAlt wird in Funktion ContactAddrAlt bzw. ContactAddr aufgerufen.
ContactAddr wird nur von Reports 5050..5056, 5063..5064 und 5085 aufgerufen.
OnBeforeContactAddrAlt außerdem vom Report 5065 und Codeunit 5054 AddFieldsToMergeSource aufgerufen.

Ich weiß ja nicht, wofür du OnBeforeContactAddrAlt abonnierst - aber die aufrufende Funktion ContactAddrAlt könnte schlichtweg dein "falsches Ziel" sein.

Re: Event wird nicht durchlaufen

28. Mai 2018 08:35

MarkusWeiland hat geschrieben:Was ich meinte ist, in der CU 365 müsste der Event irgendwo, neben der Definition, nochmal im Code auftauchen.

Ich kann dir nicht folgen: sowohl OnBeforeContactAddrAlt als auch OnBeforeFormatAddress werden innerhalb der Codeunit 365 aufgerufen.

Re: Event wird nicht durchlaufen

28. Mai 2018 08:54

Natalie hat geschrieben:
MarkusWeiland hat geschrieben:Was ich meinte ist, in der CU 365 müsste der Event irgendwo, neben der Definition, nochmal im Code auftauchen.

Ich kann dir nicht folgen: sowohl OnBeforeContactAddrAlt als auch OnBeforeFormatAddress werden innerhalb der Codeunit 365 aufgerufen.


War auch nur ein genereller Hinweis an rotsch, weil er nach Möglichkeiten gesucht hat dies zu debuggen.
Wenn ein Event definiert ist, muss dieser auch, an der Stelle an der er geworfen werden soll, aufgerufen werden.
Ist ein einer CU nur ein Event definiert, wird aber nicht aufgerufen, wird er niemals geworfen.

Re: Event wird nicht durchlaufen

28. Mai 2018 08:58

MarkusWeiland hat geschrieben:Wenn ein Event definiert ist, muss dieser auch, an der Stelle an der er geworfen werden soll, aufgerufen werden.
Ist ein einer CU nur ein Event definiert, wird aber nicht aufgerufen, wird er niemals geworfen.

Das stimmt leider nicht :-)
Beispiel Tabelle 36, OnCheckSalesPostRestrictions
Aufruf z.B. in CU 80 Sales-Post, CheckPostRestrictions

Du kannst eigentlich nur ableiten: wenn der Publisher lokal (!) definiert ist, dann muss er auch lokal aufgerufen werden.

Re: Event wird nicht durchlaufen

28. Mai 2018 09:38

Natalie hat geschrieben:Events werden nicht ignoriert, jedenfalls nicht solange deine Subscriber sauber angelegt sind und funktionieren (siehe Debugger --> Ereignisabonnements) ...


Das heisst, wenn dort Spalte 'Active' = FALSE ist, kann der Event nicht ausgeführt werden, bzw. wird er nirgendwo verwendet?

Re: Event wird nicht durchlaufen

28. Mai 2018 09:44

rotsch hat geschrieben:Das heisst, wenn dort Spalte 'Active' = FALSE ist, kann der Event nicht ausgeführt werden, bzw. wird er nirgendwo verwendet?

Dann ist der Subscriber quasi "tot", genau. Steht in der Spalte Error Information etwas drin?

Re: Event wird nicht durchlaufen

28. Mai 2018 09:49

Natalie hat geschrieben:Dann ist der Subscriber quasi "tot", genau. Steht in der Spalte Error Information etwas drin?


Das hatte ich gerade eben bemerkt (dank deinem Hinweis auf das Ereignisabonnement, das kannte ich bisher noch nicht :-D )

Ja, da wurde eine Parameter-Fehler gemeldet. Ich hatte aus Gewohnheit die Parameter in meiner eigenen Routine mit einem vorangestellten _ versehen, das veträgt es anscheinend im Fall eines Events nicht, die Namen müssen 1:1 übereinstimmen.

Jetzt läuft alles wie es sollte, besten Dank!

Re: Event wird nicht durchlaufen

28. Mai 2018 10:05

rotsch hat geschrieben:[…] die Namen müssen 1:1 übereinstimmen.

Eine häufige Fehlerquelle auch dann, wenn mehrere Module zusammengemergt werden sollen, sich in einem Objekt die Namen dadurch u.U. wiederholen und dann abgeändert werden, ohne dass die Subscriber entsprechend angepasst werden. Das hatten wir gerade letzte Woche wieder im Support, zum Glück haben wir eine Prüffunktion, die zur Laufzeit ermittelt, ob alle unsere Events aktiv sind.

Re: Event wird nicht durchlaufen

28. Mai 2018 10:33

Kowa hat geschrieben: zum Glück haben wir eine Prüffunktion, die zur Laufzeit ermittelt, ob alle unsere Events aktiv sind.

würde mich interessieren, wie eine solche Prüfroutine aufgebaut ist -> hast du vll . einen Codesnippet?

Re: Event wird nicht durchlaufen

28. Mai 2018 11:18

sweikelt hat geschrieben: -> hast du vll . einen Codesnippet?


Tabellen: Event Subscription und CodeUnit Metadata
Code:
EventSubscription.SETRANGE("Subscriber Codeunit ID",StartLizenzbereichDesEigenenModuls,EndeLizenzbereichDesEigenenModuls);
EventSubscription.SETRANGE(Active,FALSE);
IF EventSubscription.FINDFIRST THEN BEGIN
  IF CodeUnitMetadata.GET(EventSubscription."Subscriber Codeunit ID") THEN;
   -> Felder der obigen Tabellen als Parameter/Platzhalter für die Warnung ausgeben (CodeUnitMetadata.Name,EventSubscription."Subscriber Function",EventSubscription."Error Information")
END;

Re: Event wird nicht durchlaufen

28. Mai 2018 12:11

rotsch hat geschrieben:Das hatte ich gerade eben bemerkt (dank deinem Hinweis auf das Ereignisabonnement, das kannte ich bisher noch nicht :-D )

Ja, da wurde eine Parameter-Fehler gemeldet. Ich hatte aus Gewohnheit die Parameter in meiner eigenen Routine mit einem vorangestellten _ versehen, das veträgt es anscheinend im Fall eines Events nicht, die Namen müssen 1:1 übereinstimmen.

Jetzt läuft alles wie es sollte, besten Dank!


Hab letztens irgendwo gelesen das nur die Namen wichtig sind und darüber gemapped wird.
Die Reihenfolge der Parameter kannst du selbst bestimmen.
Auch musst du wohl nicht alle Parameter in deiner Funktion angegeben wenn du nur einen Parameter brauchst.

Re: [Gelöst] - Event wird nicht durchlaufen

28. Mai 2018 12:22

danke für das Codebeispiel Kowa :wink:

Re: Event wird nicht durchlaufen

28. Mai 2018 12:24

Natalie hat geschrieben:
MarkusWeiland hat geschrieben:Wenn ein Event definiert ist, muss dieser auch, an der Stelle an der er geworfen werden soll, aufgerufen werden.
Ist ein einer CU nur ein Event definiert, wird aber nicht aufgerufen, wird er niemals geworfen.

Das stimmt leider nicht :-)
Beispiel Tabelle 36, OnCheckSalesPostRestrictions
Aufruf z.B. in CU 80 Sales-Post, CheckPostRestrictions

Du kannst eigentlich nur ableiten: wenn der Publisher lokal (!) definiert ist, dann muss er auch lokal aufgerufen werden.


Was stimmt denn daran nicht?
Wenn ich einen Publisher definiere und will, dass ein Subscriber auf diesen reagiert, muss ich den Publisher doch zwangsweise aufrufen.
Ob ich das jetzt lokal oder global mache ist da doch nebensächlich?

Re: Event wird nicht durchlaufen

28. Mai 2018 12:32

Ted hat geschrieben:Hab letztens irgendwo gelesen das nur die Namen wichtig sind und darüber gemapped wird.
Die Reihenfolge der Parameter kannst du selbst bestimmen.
Auch musst du wohl nicht alle Parameter in deiner Funktion angegeben wenn du nur einen Parameter brauchst.

Das steht - wenn auch nicht so klar - hier unter "Note": https://docs.microsoft.com/en-us/dynami ... -to-events

Re: Event wird nicht durchlaufen

28. Mai 2018 12:33

MarkusWeiland hat geschrieben:Was stimmt denn daran nicht?

Sorry, hatte dich so verstanden: "Wenn ein Publisher nicht in demselben Objekt, wo er definiert wird, aufgerufen wird, wird er niemals aufgerufen."