Gelöst DCM im EK-Bereich läuft in Fehler

Arne Drews

Mitglied
Moin,

Ich habe eine DLL, in der ich bereits unterschiedliche Klassen zur Belegprüfung im VK-Bereich eingebaut habe.
Nun habe ich die erste im EK Bereich und alles so gemacht, wie auch in den Klassen zum VK-Bereich.

Eingehängt im AppDesigner wie alle anderen auch. Dcm-Einstieg ist die EKBelegProxyBeforeSave.

Die Dcm sieht so aus
C#:
namespace VOSS.BelegPruefung
{
    public class EKProxy_WareneingangDatumPruefung : IDcmCallback
    {
        Mandant _Mandant;
        Beleg _Beleg;

        bool _IstInitial;

        int _ErrorIndex = 0;


        public bool Entry(IDcmContext context)
        {
            InitializeObjects(context);

            if (_Mandant == null || _Beleg == null)
                return true;

            // Nur bei Initialspeicherung des Belegs?
            if (!_IstInitial)
                return true;

            // Nur Belegarten mit Nummerkreis "ELL"
            if (_Beleg.Belegart.Nummernkreis.ToUpper() != "ELL")
                return true;


            return CheckBelegDatum() && CheckPositionenDatum();
        }

        private bool CheckPositionenDatum()
        {
            bool is_valid = true;

            foreach (BelegPosition pos in _Beleg.Positionen)
            {
                if (DateTime.Compare(pos.Liefertermin.Date, DateTime.Now.Date) > 0)
                {
                    is_valid = false;
                    _Beleg.Errors.AppendError(_ErrorIndex++, $"Artikelnummer {pos.Artikelnummer};{pos.AuspraegungsHandle} auf Position {pos.Positionsnummer} hat Liefertermin in der Zukunft ({pos.Liefertermin.ToString("dd.MM.yyyy")})!");
                }
            }

            return is_valid;
        }

        private bool CheckBelegDatum()
        {
            bool is_valid = DateTime.Compare(_Beleg.Belegdatum.Date, DateTime.Now.Date) <= 0;

            if (!is_valid)
                _Beleg.Errors.AppendError(_ErrorIndex++, $"Belegdatum liegt in der Zukunft ({_Beleg.Belegdatum})!");

            if (DateTime.Compare(_Beleg.Liefertermin.Date, DateTime.Now.Date) > 0)
                _Beleg.Errors.AppendError(_ErrorIndex++, $"Liefertermin liegt in der Zukunft ({_Beleg.Liefertermin})!");

            return is_valid;
        }


        /*
            BelegUndMandantAusContext(IDcmContext) : weist den globalen Objekten _Beleg und _Mandant die Objekte aus dem context zu.
         */
        private void InitializeObjects(IDcmContext context)
        {
            // Context prüfen
            switch (context.ListId)
            {
                case DcmDefinitionManager.DcmListId.EKBelegProxyBeforeSave:
                    _Mandant = (context as DcmContextBelegProxyBeforeSave).Mandant;
                    _Beleg = (context as DcmContextBelegBeforeSave).Beleg;
                    break;

                default:
                    return;
            }

            _IstInitial = _Beleg != null
                ? IstInitialAnlage()
                : false;
        }


        /*
            IstInitialAnlage() : liefert true oder false, basierend auf dem Speicherstatus des Belegs.
         */
        private bool IstInitialAnlage(bool strict = false)
        {
            return _Beleg.Speicherstatus == BelegSpeicherstatus.NeuerBeleg
                && (strict ? _Beleg.Speichermode == BelegSpeicherstatus.NeuerBeleg : true);
        }
    }
}

Es kommt beim Speichern eines Belegs mit dem Belegart-Nummerkreis aber nur der Fehler: "Bei der Verarbeitung ist ein interner Fehler aufgetreten. Bitte wenden Sie sich an den Support.", mehr Infos gibt es leider nicht.
Dass es an der Dcm liegt steht außer Frage, denn wenn ich die aus den Aufruf AppDesigner entferne, läuft alles wieder ohne Fehler.

Ob es an meiner Logik liegt, habe ich ausgeschlossen, in dem ich alles minimalistisch reduziert habe:
C#:
namespace VOSS.BelegPruefung
{
    public class EKProxy_WareneingangDatumPruefung : IDcmCallback
    {
        Mandant _Mandant;
        Beleg _Beleg;


        public bool Entry(IDcmContext context)
        {
            InitializeObjects(context);
            return true;
        }


        /*
            BelegUndMandantAusContext(IDcmContext) : weist den globalen Objekten _Beleg und _Mandant die Objekte aus dem context zu.
         */
        private void InitializeObjects(IDcmContext context)
        {
            // Context prüfen
            switch (context.ListId)
            {
                case DcmDefinitionManager.DcmListId.EKBelegProxyBeforeSave:
                    _Mandant = (context as DcmContextBelegProxyBeforeSave).Mandant;
                    _Beleg = (context as DcmContextBelegBeforeSave).Beleg;
                    break;

                default:
                    return;
            }

        }
    }
}
Der Fehler bleibt leider.

Alle VK-Belegprüfungen laufen mit exakt demselben Rumpf. Muss ich im EK-Bereich irgendwas besonderes beachten oder nutze ich den Context nicht ordentlich?

Danke für Infos und Tipps!
 
Ach verdammt... Ich glaube ich sehe es gerade selber. :rolleyes:
Ich caste den falschen Context für _Beleg: DcmContextBelegBeforeSave anstatt DcmContextBelegProxyBeforeSave.

Teste ich nachher mal und gebe Feedback.
 
Ein paar Dinge musste ich zwar noch anpassen, aber der Fehler der geworfen wurde war tatsächlich der falsche DcmContext.
Problem gelöst, Nerven geschont... was will man mehr ;)
 
Zurück
Oben