Gelöst CM in Sage 100 Formularen

Arne Drews

Mitglied
Hi,

Wir haben früher in der OL 6.2 über das AC per CMs eine eigene Belegprüfung gehabt.
Seit den neuen Formularen (8.0) geht das mit CMs ja nicht mehr, meines Wissen nach. Hier sind wohl DCMs erforderlich.

Wie kann ich mich per AppDesigner nun in die Prozesse rein hängen?
Bspw. in die Belegerfassung für den Einstiegspunkt BEFORE SAVE.

Danke
 
Hi Arne,

ganz platt gesagt, du bist im AppDesigner und unter "Erweiterungen--> Ereignisse" kannst du die DCM's registrieren.
Dann ist es die DCM VKBelegProxyBeforeSave

Alternativ kannst du auch über Makros arbeiten ;-)
 
Ok, heißt das, ich kann dort eine eigene DLL (Assembly) und den darin enthaltenen Klassennamen angeben, welche dann automatisch ausgeführt wird? Das wär natürlich super einfach. Ich vermute mal BelID u.a. wird dann in den Arguments abrufbar sein. Komme ich leider erst morgen zu, aber das teste ich dann sofort mal, hört sich gut an.

Danke
 
Ja Herr Langmaack und Kollegen schreiben da super Dokumentationen.
Speziell das Wiki ist echt gut geworden und immer mit Beispielen
 
Bei mir hat das leider keine Auswirkung.

Ich habe eine DLL angelegt, die testweise nur eine kleine Info in eine Text-Datei schreibt.
Unter Erweiterungen -> Ereignisse habe ich dann eins hinzugefügt:
event-sage100.jpg


An der Stelle bietet er mir in der Auswahlbox zum Namen der Klasse nicht mal die entsprechenden Klassen zur Auswahl, was er in anderen, bereits bestehenden Lösungen aber macht ( getestet ).
Heißt für mich in erster Linie, dass mit der Assembly etwas nicht stimmt? Muss ich auf etwas spezielles achten?

Ich habe folgende Assemblies zusätzlich eingebunden:
Code:
using Sagede.OfficeLine.Engine;
using Sagede.OfficeLine.Shared;
using Sagede.OfficeLine.Shared.Customizing;
using Sagede.OfficeLine.Wawi.BelegEngine;
using Sagede.OfficeLine.Wawi.BelegProxyEngine;

Verschieden Ereignisse habe ich auch getestet und auch die OL mehrfach neu gestartet.
Das Assembly habe ich im Shared-Verzeichnis abgelegt und über den Auswahl-Dialog in Name der Assembly eingetragen. Das Assembly existiert am selben Ort sowohl auf dem ApplicationServer, als auch den TerminalServern.

Was übersehe ich?

Danke
 
Bzgl. der Auswahl des Klassennamen hatte ich vergessen, das IDcmCallback Interface zur Klasse zu implementieren.
Er findet also jetzt die Assembly und auch die entsprechende Klasse. Dennoch wird nichts aus der Entry() ausgeführt.
 
Man muss den sage Applikation Server Dienst neu starten, damit das Ereignis registriert wird.
 
Bei mir sieht das DCM Template und eine einfache DCM so aus:

Code:
using Sagede.OfficeLine.Shared.Customizing; // für IDcmCallback Interface
using System;
using Sagede.OfficeLine.Wawi.ValidationEngine;

namespace CRMSol.OL.Beispiel.DCM
{
    public class DCMListener : IDcmCallback
    {
        public bool Entry(IDcmContext context)
        {
            try
            {
                switch (context.ListId)
                {
                    case DcmDefinitionManager.DcmListId.VKBelegProxyBelegValidateSave:
                        var vkBeforeSave = context as DcmContextBelegProxyValidateSave;
                        // TODO: Logik einbauen und wenigstens etwas prüfen...
                        // Fehlermeldung zurückgeben, dadurch kein Speichern möglich.
                        vkBeforeSave.Beleg.Errors.AppendError(0, $@"Bitte verwendet Zettel und Stift!");
                        break;
                }
                return true;
            }
            catch (Exception)
            {
                // TODO: Fehler behandeln / loggen
                return false;
            }
        }
    }
}

Eintrag im AppDesigner

2019-05-29 09_31_47-Window.png
 
Danke, habe vergessen, den Dienst neu zu starten.

Wie unterscheide ich bei den Ereignissen eigentlich, ob ein Beleg über eine Logik oder manuell gespeichert wird?
Sind alle Ereignisse ohne Proxy in der Benennung evtl. die manuell ausgelösten? Alternativ kann ich natürlich versuchen, den aktuellen Benutzer auszulesen und die Service-Benutzer ausschließen, aber das wäre mir zu ungenau, da jederzeit ein anderer Service-Benutzer angelegt werden kann, wofür ich dann die DCM wieder anpassen müsste.

Danke


EDIT: Habs grad mal getestet
In dem Bezug macht VKBelegBeforeSave keinen Unterschied zu VKBelegProxyBeforeSave.
Ich muss also bspw. über DcmContextBelegBeforeSave.Beleg.Bearbeiter den Benutzer prüfen.
Oder gibt es eine andere Möglichkeit, wie bspw. ein Ereignis, das nur von einem Benutzer manuell ausgelöst werden kann?
 
Zuletzt bearbeitet:
Zurück
Oben