"Designer-Fehler in List & Label 29: XML-Felder und Variablen werden nicht korrekt registriert"

Guten Morgen,

Ich habe ein .net Windows Forms‑Projekt in C# erstellt, in dem ich die List & Label‑Komponente (über das NuGet‑Paket ListLabel29) verwende, um anhand einer XML-Datei Variablen und Tabellenfelder an einen Report (.lst) zu übergeben und diesen anschließend im Designer zu öffnen. Dabei werden die Felder aus zwei Bereichen der XML getrennt – im Bereich „Kopf“ werden Variablen definiert, und im Bereich „Rechnungspositionenen“ werden Tabellenfelder festgelegt.

XML

<ABASData abasversion="2020" source="Screen">
	<Kopf>
		<Field name="AG.KUNDEN_NR" attribute="STRING">100</Field>
		<Field name="AG.ANREDE" attribute="STRING">DummyText</Field>
		<Field name="AG.TITEL" attribute="STRING">DummyTitle</Field>
		<Field name="AG.NAME" attribute="STRING">DummyName</Field>
		<Field name="AG.VORNAME" attribute="STRING">DummyVorname</Field>
		<Field name="AN.KUNDEN_NR" attribute="STRING">3</Field>
		<Field name="AG.PLZ" attribute="STRING">12345</Field>
		<Field name="AG.ORT" attribute="STRING">DummyOrt</Field>
		<Field name="AG.STRASSE" attribute="STRING">DummyStrasse</Field>
		<Field name="AG.HAUSNR" attribute="STRING">10</Field>
		<Field name="AG.ORTSTEIL" attribute="STRING">DummyOrtsteil</Field>
		<Field name="AG.TEL" attribute="STRING">0123456789</Field>
		<Field name="AN.TEL" attribute="STRING">123</Field>
		<Field name="AG.FAX" attribute="STRING">0987654321</Field>
		<Field name="AN.FAX" attribute="STRING">789</Field>
		<Field name="AG.EMAIL" attribute="STRING">dummy@example.com</Field>
		<Field name="AN.EMAIL" attribute="STRING">dummy2@example.com</Field>
		<Field name="AN.ANREDE" attribute="STRING">DummyAnrede</Field>
		<Field name="AN.TITEL" attribute="STRING">DummyTitel</Field>
		<Field name="AN.VORNAME" attribute="STRING">Benjamin</Field>
		<Field name="AN.NAME" attribute="STRING">Baumstamm</Field>
		<Field name="AN.STRASSE" attribute="STRING">Hauptstraße</Field>
		<Field name="AN.HAUSNR" attribute="STRING">2</Field>
		<Field name="AN.ORTSTEIL" attribute="STRING">DummyOrtsteil</Field>
		<Field name="AN.PLZ" attribute="STRING">76776</Field>
		<Field name="AN.ORT" attribute="STRING">DummyOrt</Field>
		<Field name="M.NAME" attribute="STRING">DummyMName</Field>
		<Field name="M.NAME1" attribute="STRING">DummyMName1</Field>
		<Field name="M.NAME2" attribute="STRING">DummyMName2</Field>
		<Field name="M.VORNAME" attribute="STRING">DummyMVorname</Field>
		<Field name="M.MANDANTNAME" attribute="STRING">DummyMandant</Field>
		<Field name="M.KURZNAME" attribute="STRING">DummyKurz</Field>
		<Field name="M.LAND" attribute="STRING">DummyLand</Field>
		<Field name="M.ORT" attribute="STRING">DummyOrt</Field>
		<Field name="M.ORTSTEIL" attribute="STRING">DummyOrtsteil</Field>
		<Field name="M.STRASSE" attribute="STRING">DummyStrasse</Field>
		<Field name="M.PLZ" attribute="STRING">12345</Field>
		<Field name="M.FAX" attribute="STRING">DummyFax</Field>
		<Field name="M.TEL" attribute="STRING">DummyTel</Field>
		<Field name="M.MOBIL" attribute="STRING">DummyMobil</Field>
		<Field name="M.EMAIL" attribute="STRING">dummy3@example.com</Field>
		<Field name="M.VORSTAND" attribute="STRING">DummyVorstand</Field>
		<Field name="M.GESCHAEFTSFUEHRER" attribute="STRING">DummyGF</Field>
		<Field name="M.STEUER_ID" attribute="STRING">DummySteuerID</Field>
		<Field name="M.REGISTERGERICHT" attribute="STRING">DummyRG</Field>
		<Field name="M.REGISTERNR" attribute="STRING">DummyRegisternr</Field>
		<Field name="M.STEUER_NR" attribute="STRING">DummySteuerNr</Field>
		<Field name="Report.AUSWAHL" attribute="STRING">DummyAuswahl</Field>
		<Field name="Report.PRINT_DEVICE" attribute="STRING">DummyPrintDevice</Field>
	</Kopf>
	<Rechnungspositionenen>
		<Position>
			<Field name="ROWID" attribute="TEXT">7</Field>
			<Field name="ID.AUFTRAG_TYPE" attribute="NUMERIC">5.00</Field>
			<Field name="A.AUFTRAG_NR" attribute="TEXT">203073</Field>
			<Field name="A.POSTEN_NR" attribute="NUMERIC">5.00</Field>
			<Field name="AG.KUNDE_ID" attribute="NUMERIC">5.00</Field>
			<Field name="AN.KUNDEN_ID" attribute="NUMERIC">5.00</Field>
			<Field name="AG.BANK_ID" attribute="NUMERIC">5.00</Field>
			<Field name="A.AUFTRAG_DATUM" attribute="DATE">15.07.2024</Field>
			<Field name="ID.LEISTUNG" attribute="NUMERIC">5.00</Field>
			<Field name="ID.EINHEIT" attribute="NUMERIC">5.00</Field>
			<Field name="A.UMFANG1" attribute="NUMERIC">0</Field>
			<Field name="A.UMFANG2" attribute="NUMERIC">0</Field>
			<Field name="ID.BEARBEITER_ID" attribute="NUMERIC">5.00</Field>
			<Field name="ID.EINSATZ_ANLASS" attribute="TEXT">DummyValue</Field>
			<Field name="AG.FLAG_VERMITTELT" attribute="TEXT">DummyValue</Field>
			<Field name="AN.FLAG_VERMITTELT" attribute="TEXT">DummyValue</Field>
			<Field name="A.EINSATZ_NR" attribute="TEXT">203073</Field>
			<Field name="A.FLAG_ERLEDIGT" attribute="TEXT">DummyValue</Field>
			<Field name="A.PREIS_EINHEIT" attribute="TEXT">5.00</Field>
			<Field name="A.TEXT_AUFTRAG" attribute="TEXT">DummyText</Field>
			<Field name="TEXT_VT" attribute="TEXT">DummyText</Field>
			<Field name="PLAN_ID" attribute="TEXT">5.00</Field>
			<Field name="T.PLAN2_ID" attribute="TEXT">5.00</Field>
			<Field name="A.MASCHINEN_NR" attribute="TEXT">5.00</Field>
			<Field name="A.EINSATZ_ANLASS" attribute="TEXT">7</Field>
			<Field name="A.EINHEIT" attribute="TEXT">Stück</Field>
			<Field name="A.VSKZ_NR" attribute="TEXT">100036</Field>
			<Field name="A.VSKZ_TEXT_KURZ" attribute="TEXT">DummyText</Field>
			<Field name="A.LEISTUNG" attribute="TEXT">DummyValue</Field>
			<Field name="BEARBEITER" attribute="TEXT">DummyValue</Field>
			<Field name="BEARBEITER_TEL" attribute="TEXT">DummyValue</Field>
			<Field name="AG.KUNDEN_NR" attribute="TEXT">7</Field>
			<Field name="A.DATUM_BEGIN" attribute="DATE">15.07.2024</Field>
			<Field name="A.DATUM_ENDE" attribute="DATE">15.07.2024</Field>
			<Field name="AG.ANREDE" attribute="TEXT">DummyValue</Field>
			<Field name="AG.TITEL" attribute="TEXT">DummyValue</Field>
			<Field name="AG.NAME" attribute="TEXT">DummyValue</Field>
			<Field name="AG.VORNAME" attribute="TEXT">DummyValue</Field>
			<Field name="AG.NAME1" attribute="TEXT">DummyValue</Field>
			<Field name="AG.NAME2" attribute="TEXT">DummyValue</Field>
			<Field name="AG.OBJECT_ID" attribute="TEXT">5.00</Field>
			<Field name="AG.ADRESS_ID" attribute="TEXT">5.00</Field>
			<Field name="AG.BETRIEBS_NR" attribute="TEXT">DummyValue</Field>
			<Field name="AN.KUNDEN_NR" attribute="TEXT">3</Field>
			<Field name="AN.ANREDE" attribute="TEXT">DummyValue</Field>
			<Field name="AN.TITEL" attribute="TEXT">DummyValue</Field>
			<Field name="AN.NAME" attribute="TEXT">DummyValue</Field>
			<Field name="AN.VORNAME" attribute="TEXT">DummyValue</Field>
			<Field name="AN.NAME1" attribute="TEXT">DummyValue</Field>
			<Field name="AN.NAME2" attribute="TEXT">DummyValue</Field>
			<Field name="AN.OBJECT_ID" attribute="TEXT">5.00</Field>
			<Field name="AN.ADRESS_ID" attribute="TEXT">5.00</Field>
			<Field name="AG.STAATKENNZEICHEN" attribute="TEXT">DummyValue</Field>
			<Field name="AG.STRASSE" attribute="TEXT">DummyStrasse</Field>
			<Field name="AG.HAUSNR" attribute="TEXT">DummyValue</Field>
			<Field name="AG.PLZ" attribute="TEXT">DummyPLZ</Field>
			<Field name="AG.ORTSTEIL" attribute="TEXT">DummyValue</Field>
			<Field name="AG.ORT" attribute="TEXT">DummyOrt</Field>
			<Field name="AN.STAATKENNZEICHEN" attribute="TEXT">DummyValue</Field>
			<Field name="AN.PLZ" attribute="TEXT">DummyPLZ</Field>
			<Field name="AN.ORT" attribute="TEXT">DummyOrt</Field>
			<Field name="AN.STRASSE" attribute="TEXT">DummyStrasse</Field>
			<Field name="AN.HAUSNR" attribute="TEXT">DummyValue</Field>
			<Field name="AN.ORTSTEIL" attribute="TEXT">DummyValue</Field>
			<Field name="A.AUFTRAG_TYPE" attribute="TEXT">DummyType</Field>
			<Field name="AG.TEL" attribute="TEXT">DummyTel</Field>
			<Field name="AN.TEL" attribute="TEXT">DummyTel</Field>
			<Field name="AG.FAX" attribute="TEXT">DummyFax</Field>
			<Field name="AN.FAX" attribute="TEXT">DummyFax</Field>
			<Field name="AG.EMAIL" attribute="TEXT">dummy@web.de</Field>
			<Field name="AN.EMAIL" attribute="TEXT">dummy2@web.de</Field>
			<Field name="AG.BANK" attribute="TEXT">DummyBank</Field>
			<Field name="AG.IBAN" attribute="TEXT">DummyIBAN</Field>
			<Field name="AG.BIC" attribute="TEXT">DummyBIC</Field>
			<Field name="A.ZEIT_BEGIN" attribute="TEXT">0:00</Field>
			<Field name="A.ZEIT_ENDE" attribute="TEXT">0:01</Field>
		</Position>
	</Rechnungspositionenen>
</ABASData>

Hier mein bestehender Code:

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Xml;
using combit.Reporting;
using combit.Reporting.DataProviders;

namespace Test_ListLabel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            listLabel.XlatVarNames = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Pfad zur XML-Datei – bitte anpassen!
            string xmlFilePath = "daten.xml";

            // Erzeuge den XmlDataProvider und übergebe den XML-Pfad
            XmlDataProvider xmlProvider = new XmlDataProvider();
            xmlProvider.Uri = xmlFilePath;

            // Weise den Provider als DataSource zu
            listLabel.DataSource = xmlProvider;

            // Automatisches Projekt festlegen (Pfad zur .lst-Datei und Projekttyp)
            listLabel.AutoProjectFile = "list.lst";
            listLabel.AutoProjectType = LlProject.List;

            // Rufe Methode auf, um das XML zu parsen und Felder/Variablen anzulegen
            AddFieldsAndVariablesFromXml(xmlFilePath);

            // Starte den Designer
            listLabel.Design();
        }

        /// <summary>
        /// Liest das XML-Dokument und fügt basierend auf der Definition im XML
        /// die Kopfzeilenvariablen (field="H") und Tabellenfelder (field="T") zu List & Label hinzu.
        /// </summary>
        /// <param name="xmlPath">Pfad zum XML-Dokument</param>
        private void AddFieldsAndVariablesFromXml(string xmlPath)
        {
            XmlDocument doc = new XmlDocument();
            try
            {
                doc.Load(xmlPath);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Fehler beim Laden des XML-Dokuments:\n" + ex.Message,
                    "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            // ----- Kopfzeile: Variablen hinzufügen (field="H") -----
            XmlNodeList headerNodes = doc.SelectNodes("/ABASData/Kopf/Field[@field='H']");
            if (headerNodes != null)
            {
                foreach (XmlNode node in headerNodes)
                {
                    string name = node.Attributes["name"]?.Value;
                    string attributeString = node.Attributes["attribute"]?.Value;
                    string value = node.InnerText.Trim();

                    Debug.WriteLine($"Name: {name}, Attribute: {attributeString}, Value: {value}");

                    LlFieldType llType = GetLlFieldType(attributeString);
                    if (!string.IsNullOrEmpty(name))
                    {
                        listLabel.Core.LlDefineVariableExt(name, value, llType);
                    }
                    else
                    {
                        Debug.WriteLine($"Name ist null oder leer: {name}");
                    }
                }
            }

            // ----- Tabellenfelder hinzufügen (field="T") -----
            XmlNodeList tableNodes = doc.SelectNodes("/ABASData/Rechnungspositionenen/Position/Field[@field='T']");
            if (tableNodes != null)
            {
                foreach (XmlNode node in tableNodes)
                {
                    string name = node.Attributes["name"]?.Value;
                    string attributeString = node.Attributes["attribute"]?.Value;
                    // Der Knoteninhalt (InnerText) liefert den Wert, der zur Laufzeit über die DataSource bezogen wird.
                    string value = node.InnerText.Trim();

                    Debug.WriteLine($"Name: {name}, Attribute: {attributeString}, Value: {value}");

                    LlFieldType llType = GetLlFieldType(attributeString);
                    if (!string.IsNullOrEmpty(name))
                    {
                        // WICHTIG: Den Options-Parameter (0) hier auch angeben!
                        listLabel.Core.LlDefineFieldExt(name, value, llType);
                    }
                    else
                    {
                        Debug.WriteLine($"Name ist null oder leer: {name}");
                    }
                }
            }
        }

        /// <summary>
        /// Wandelt den String (z.B. "TEXT", "NUMERIC", "Date") in den entsprechenden LlFieldType um.
        /// </summary>
        private LlFieldType GetLlFieldType(string attributeValue)
        {
            if (string.IsNullOrEmpty(attributeValue))
                return LlFieldType.Text;

            switch (attributeValue.ToUpper())
            {
                case "NUMERIC":
                    return LlFieldType.Numeric;
                case "DATE":
                    return LlFieldType.Date_DMY;
                case "TEXT":
                default:
                    return LlFieldType.Text;
            }
        }
    }
}

Obwohl sämtliche Felder einwandfrei aus der XML ausgelesen und die zugehörigen Attribute korrekt ermittelt werden, führt das Öffnen des Designers zu zahlreichen Fehlermeldungen, die darauf hinweisen, dass die Felder bzw. Variablen nicht definiert wurden.

Gibt es noch eine andere Methode die “Fields” und “Variablen” an den Report zu übergben?

Ich bin leider gezwungen den Weg über XML zu gehen, da ich keine direkte Verbindung zu DB aufbauen kann.

Hallo Ferderico

an sich sollte dein Ansatz grundsätzlich funktionieren. Wenn alle Felder korrekt aus der XML ausgelesen werden und auch die Attribute passen, klingt das ja erstmal nach einer sauberen Basis. Bei den Feldern empfiehlt es sich aber, diese im AutoDefineNewLine-Event zu übergeben. Es könnte ja der Fall sein, dass es mehrere Rechnungspositionen gibt.

Am besten wäre es, wenn du uns ein minimales, lauffähiges Beispielprojekt (inkl. LST-Datei und XML) mit Sourcecode zur Verfügung stellen könntest. Dann schauen wir uns das gezielt an. Bitte eröffne dafür einen Case in unserem Support-Portal.

Damit können wir das Verhalten genauer analysieren und dir schneller weiterhelfen.

Viele Grüße
Martin

Hi Frederico,
du vermischt hier DataBinding mit eigener Anmeldung der Felder und Variablen, das führt zu Problemen in der Datenstruktur.

Ich würde folgendes vorschlagen:

Nimm deine XML Datei, erstelle ein z.B. ein DataSet und füge zwei Tabellen hinzu
Kopf und Positonen
Befüllte die dt´´s mit den Feldern und Inhalten
erstelle zwischen den zwei Tabellen eine Relation im DS und übergebe LL den DS als Datasource, definiere den Datamember und AutomasterMode →

            ll.DataSource = ds;
            ll.DataMember = "Kopf";
            ll.AutoMasterMode = LlAutoMasterMode.AsVariables;

dann hast du Automatisch die Kopfdaten als Variablen und die Pos als Felder usw.

Kannst ja deine Routine welche du zum parsen des XML hast anpassen für ein DataTable usw.

Hübscher wäre es natürlich zwei Klassen Kopf und Positionen oder so und diese dann mit dem ObjectDataProvider zu übergeben.
Kopf hat dann ne List of Pos usw.

Hier noch ein KB zum Parsingverhalten des XmlDataProvider

vielleicht hilft es ja.

Danke für die schnelle Antwort.
Aber iwie bekomme ich dass leider nicht so hin, wie es soll …

Die .lst Datei bekomme ich so geliefert und darf diese auch nicht Anpassen.
Komischerweise finde ich auch unter Felder auch keine Fields obwohl eine Tabelle verwendet wird und im source code der .lst diese gesetzt sind:
image

XML:
daten.xml (39.5 KB)

.lst Datei
Auftrag.lst (105.3 KB)

Eigentlich will ich nur die Felder & Variablen + deren LLType Anmelden die auch unter
[UsedIdentifiers]
Variables=AN.ANREDE;AN.FAX;AN.HAUSNR;AN.KUNDEN_NR;AN.NAME;AN.ORT;AN.ORTSTEIL;AN.PLZ;AN.STRASSE;AN.VORNAME
Fields=A.DATUM_BEGIN;A.DATUM_ENDE;A.TEXT_AUFTRAG;A.ZEIT_BEGIN;AG.HAUSNR;AG.NAME;AG.ORT;AG.ORTSTEIL;AG.PLZ;AG.STRASSE;AG.TEL;AG.VORNAME

gelistet sind.