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.