CrossIndustryInvoice (SAP)

Bisut

Sehr aktives Mitglied
Unser Kunde schickt E-Rechnungen an Empfänger die SAP einsetzen, die SAP bemängelt die xml

Und zwar in CrossIndustryInvoice (Eine Zeile die SAP nicht zuordnen kann); daher müssen diese E-Rechnungen allesamt manuell bereinigt werden. Das Thema ist glaube schon hier mal dokumentiert worden...

Im Sage 100 Standard scheint es so zu sein, ich habe das so nachvollziehen können bis zur Version 9.0.10.7...

Jemand Erfahrungen?

Screenshot 2026-05-26 055842.png
 
Das steht nicht wirklich in der Zeile sondern dahinter. Das SAP Kommentare (und das ist ja formal nur ein Kommentar) in XML nicht toleriert, ist schon sehr übertrieben. Ist aber wahrscheinlich der Tatsache geschuldet, dass der Parser nach den eigentlichen Ende der XML nichts mehr erwartet.

Die einzige vernünftige Lösung ist eine kleine AppDesigner Anpassung von Ihrem Partner, der in den Prozess der XML Erzeugung eingreift und den Kommentar am Ende löscht. Der eigentlich Code ist albern wenig, das ganze DrumRum als AppDesigner Lösung (DCMListener) macht leider ein bisschen Arbeit.
 
Hier ein micro Tool als Webseite mit Droptarget, das den Kommentar wegwirft und die Datei wieder im Download speichert. (Claude AI, Gesamtaufwand 3 Minuten)


Screenshot 2026-05-26 123340.png
Das ist keine vernünftige Lösung, hat aber Spaß gemacht. :)
 

Anhänge

Wir haben den Fall auch direkt noch an Sage platziert und dazu nun eine Mitteilung erhalten, das man den Fall klären möchte (Entwicklung) OL9.0 79434) vielleicht hat Sage dazu bereits andere Fälle vorliegen und sieht nun doch Handlungsbedarf, auch wenn diese Änderungen dann eben dauern. Das Tool werde ich mir gerne näher anschauen. Besten Dank.
 
Nur frage ich mich, diese xml ist doch in der PDF eingebettet, kann das Toll daher die PDF mit xml korrigieren. Sonst müsste der Anwender keine PDF mit Einbettung der xml an seinen Endkunden versenden, sondern nur die xml. Wie sieht das in der Praxis aus?
 
Ach man, ich hatte ein bisschen gehofft, das wäre eine XRechnung. Mit einem ZUGFERD PDF geht das nicht ohne absurdes Gefrickel. Da bleibt nur der Weg über den Appdesigner.
 
Und weil ich mehr Übung brauche im AppDesigner in Verbindung mit DLL Programmierungen habe ich das mal umgesetzt. In der Zip ist sind die fertigen Metadaten und auch das C# Projekt. Ich hoffe das erleichert auch mal jemanden den Einstieg. Die DLL strippt einfach alle Kommentare aus der XML Datei. Also ist damit die Ausgabe unter ZUGFERD und XRechnung "sauber". Kompiliert wurde das für die 9.0.10.x

Der eigentlich Code ist doch recht überschaubar, zeigt aber was möglich ist.
Im AppDesigner ist nur unter Dateien und Ereignisse was eingetragen und zeigt wie man den Einsprung findet.

C#:
using Sagede.Core.Logging;
using Sagede.Core.Tools;
using Sagede.OfficeLine.Shared.Customizing;
using Sagede.OfficeLine.Wawi.PrintEngine;
using System;
using System.Xml;

namespace XMLCommentStripper
{
    /// <summary>
    /// Inferface für die Implementation der DCM-Callback-Functions
    /// </summary>
    /// <seealso cref="Sagede.OfficeLine.Shared.Customizing.IDcmCallback" />
    public class DCMListener : IDcmCallback
    {
        /// <summary>
        /// Haupteinstiegspunkt
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public bool Entry(IDcmContext context)
        {
            try
            {
                switch (context.ListId)
                {
                    case DcmDefinitionManager.DcmListId.PrintPrepareBelegZUGFeRDEmbeddedXml:
                        TraceLog.Logger.LogVerbose("XMLCommentStripper:START");
                        var myContext = (DcmContextBelegdruckZUGFeRD)context;
                        var doc = myContext.ZUGFeRDEmbeddedXml;
                        XmlNodeList comments = doc.SelectNodes("//comment()");

                        foreach (XmlNode comment in comments)
                        {
                            comment.ParentNode.RemoveChild(comment);
                        }

                        //if (comments.Count > 0)
                        //{
                        //    XmlNode last = comments[comments.Count - 1];
                        //    last.ParentNode.RemoveChild(last);
                        //}

                        break;
                }
                return true;
            }
            catch (Exception ex)
            {
                TraceLog.LogException(ex);
                return false;
            }
        }
    }
}
 

Anhänge

Zuletzt bearbeitet:
Zurück
Oben