Gelöst DcmContext gesucht

Arne Drews

Mitglied
Moin.

Sorry für den wenig aussagekräftigen Titel, aber mir ist nichts besseres in der Kürze eingefallen :)

Folgende Anforderung:
Beim Speichern eines Belegs soll auf Basis eines Merkmals die Versandart angepasst werden.
Dazu habe ich eine DCM geschrieben und an das Ereignis VKBelegProxyAfterSave gehängt.
Die DLL ist sowohl auf den Terminal- als auch auf den App-Servern ausgerollt und die Dienste sind neu gestartet worden.

Ich konnte das ganze erfolgreich testen, jedoch nur wenn ich einen Beleg über das Sage-Formular anlege.
Wenn Belege im Hintergrund erstellt werden, greift die Anpassung scheinbar nicht.

Habe ich ein falsches DCM-Event verwendet?
Mir wäre noch VKBelegSave eingefallen, aber dazu finde ich keinen DcmContext*

Hat jemand einen Tipp, wo mein Fehler liegt?
 
Hallo Arne,
die "Proxy-DCMs" werden nur aus den Datenservices der Belegerfassungsformulare heraus getriggert. Wenn Belege auch auf andere Art erstellt werden, musst Du m.W. tatsächlich die VKBelegSave (bzw würde ich zur VKBelegBeforeSave raten) verwenden. Siehe dazu auch DCM-Handbuch S.11 und S.82.
 
Hmmm... Bei VKBelegBeforeSave passiert im Test nichts. Ich muss doch hier nicht die Save()-Methode vom Beleg explizit aufrufen oder?
Zu VKBelegSave finde ich wie gesagt keine passende DcmContext-Klasse.

Oder muss ich sowohl VKBelegBeforeSave und bspw. VKBelegProxyBeforeSave verwenden, damit es sowohl bei Anlage über das Formular, als auch bei vom System erstellten Belegen funktioniert?
 
Ich habe die DCM jetzt sowohl bei VKBelegBeforeSave als auch bei VKBelegProxyBeforeSave eingehängt und mir das Mandanten- und Beleg-Objekt entsprechend aus dem spezifischen Kontext gezogen:
C#:
switch (context.ListId)
{
    case DcmDefinitionManager.DcmListId.VKBelegBeforeSave:
        _Mandant = (context as DcmContextBelegBeforeSave).Mandant;
        _Beleg = (context as DcmContextBelegBeforeSave).Beleg;
        break;
    case DcmDefinitionManager.DcmListId.VKBelegProxyBeforeSave:
        _Mandant = (context as DcmContextBelegProxyBeforeSave).Mandant;
        _Beleg = (context as DcmContextBelegProxyBeforeSave).Beleg;
        break;
    default:
        return true;
}

Damit funktioniert es sowohl bei der Anlage über das Sage 100 Formular, als auch über die Prozess gesteuerten Beleganlagen.

Danke für die Hinweise und Tipps!
 
Hi Arne,
zum Ablauf wie die DCM's aufgerufen werden:
Die normalen DCM's werden immer dort aufgerufen, wo mit dem Objekt gearbeitet wird. Beim Access Client, in der alten Erfassung, werden die DCM's auf dem Client aufgerufen. Wenn ein Dienst direkt mit den Objekten arbeitet, dann werden die DCM's dort aufgerufen.
Die Proxy DCM's werden immer auf dem Applikationsserver aufgerufen.

Im Falle vom AppDesigner Belegerfassung wird das Belegobjekt auf dem Applikationsserver verwendet. Also werden beide DCM's dort aufgerufen und meist zuerst die Proxy DCM's und wenn diese nicht abgebrochen werden dann die vom DCM's vom Objekt.(soweit mir bekannt ist gibt es eine Ausnahme beim Load, wenn die Rechnung im Rewe ist.)
Wenn du dafür neue DCM's registierst muss immer der AppServer Dienst neu gestartet werden.

In deinem Fall sollte die neue Belegerfassung beide DCM's auf dem Applikationsserver werfen: VKBelegProxyBeforeSave und danach VKBelegBeforeSave.
Vielleicht kann meine Erklärung in Zukunft dabei helfen, doppelte Aufrufe zu vermeiden.
 
Hi Jan,

Danke für Deine Infos!

In deinem Fall sollte die neue Belegerfassung beide DCM's auf dem Applikationsserver werfen: VKBelegProxyBeforeSave und danach VKBelegBeforeSave.
Vielleicht kann meine Erklärung in Zukunft dabei helfen, doppelte Aufrufe zu vermeiden.
Klingt sinnvoll. Es geht aber leider nicht nur um die Belegerfassung über den AppDesigner, sondern auch um Belege, die über die Sage-DLLs angelegt werden. Wir haben bspw. Schnittstellen, die Belege unter Verwendung der Sage-DLLs im Hintergrund erstellen, da spielt der AppDesigner für mein Verständnis keine Rolle.

Daher benötige ich glaube ich beide Aufrufe.
Es sei denn, ich täusche mich :)
 
Die VKBelegBeforeSave wird immer geworfen, die VKBelegProxyBeforeSave zusätzlich wenn es um die neue Belegerfassung geht. Es würde also VKBelegBeforeSave ausreichen um sicherzustellen das die Berechnung immer stattfindet.
 
Zurück
Oben