Andere Datenquelle-Objekte nutzen
Dieses Skript zeigt, wie zur Laufzeit Daten als Child-Datensätze bereitgestellt werden können, die nicht aus der cobra-Datenbank stammen, z.B. aus einem Webservice, einer externen Datei oder einem Dialog.
Anwendungsfall
Sie möchten in einer Vorlage Child-Bereiche mit Daten befüllen, die nicht in cobra gespeichert sind.
Beispiele: Meldungen aus einem externen System, Berechnungsergebnisse oder benutzerdefinierte Eingaben aus einem Dialog.
Konfiguration in PRINT+PLUS
- Exporter-Typ: Beliebig (Word, Excel, Text, Skript)
- Event:
AfterLoadData - Voraussetzung: In der Konfiguration muss ein Child mit dem entsprechenden Präfix (z.B.
Message) als "Andere Daten" konfiguriert sein. Die Felder des Child entsprichen den Properties des C#-Objekts.
Funktionsprinzip
- Eigene C#-Objekte erstellen und mit Daten füllen
- Jedes Objekt in eine
ObjectViewverpacken (Reflection-basierter Wrapper) - Per
AddChildContextdem aktuellen Context hinzufügen - PRINT+PLUS behandelt die Objekte wie normale Child-Datensätze aus der Datenbank
Vollständiges Skript
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using Ruthardt.PrintPlus.Export.Context;
using Ruthardt.PrintPlus.Model;
using Ruthardt.PrintPlus.Model.Interfaces;
public class AndereDatenquelle : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Eigene Datenobjekte erzeugen (können aus beliebiger Quelle stammen)
var meldung1 = new Meldung
{
SuperId = (int)currentContext.Data.CurrentKey,
Message = "Meldung 1: Vorgang erfolgreich abgeschlossen.",
Priority = "Hoch"
};
var meldung2 = new Meldung
{
SuperId = (int)currentContext.Data.CurrentKey,
Message = "Meldung 2: Bitte Rückmeldung beachten.",
Priority = "Normal"
};
// Objekte in ObjectView verpacken
// Der zweite Parameter gibt das Feld an, das als Beziehungsschlüssel (FK) dient
var ov1 = new ObjectView(meldung1, "SuperId");
var ov2 = new ObjectView(meldung2, "SuperId");
// Als Child-Datensätze dem Context hinzufügen
// "Message" muss dem konfigurierten Child-Präfix entsprechen
currentContext.AddChildContext("Message", ov1);
currentContext.AddChildContext("Message", ov2);
}
}
// Eigene Datenklasse – Properties werden als Felder/Platzhalter verfügbar
public class Meldung
{
public int SuperId { get; set; }
public string Message { get; set; }
public string Priority { get; set; }
}
}
Verwendung in der Vorlage
In der Vorlage können die Felder des Objekts wie normale Child-Platzhalter verwendet werden:{Message.Message}{Message.Priority}
Erklärung
ObjectView: Ein Reflection-basierter Wrapper, der ein beliebiges C#-Objekt so verpackt, dass PRINT+PLUS es wie einen normalen Datensatz behandeln kann. Alle öffentlichen Properties werden zu Feldern.- Zweiter Parameter (
"SuperId"): Gibt an, welches Property als Beziehungsschlüssel (Foreign Key) zum übergeordneten Datensatz dient. Muss dem in der Konfiguration hinterlegten Beziehungsfeld entsprechen. AddChildContext("Message", ...): Der Präfix muss exakt dem in der PRINT+PLUS Konfiguration angelegten Child-Präfix entsprechen.
Variante: Daten aus einem Webservice laden
using System.Collections.Generic;
using System.Net;
using Newtonsoft.Json;
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Daten von einer REST-API laden
var id = currentContext.Data.CurrentKey;
var json = new WebClient().DownloadString($"https://api.meinefirma.de/meldungen/{id}");
var meldungen = JsonConvert.DeserializeObject<List<Meldung>>(json);
foreach (var meldung in meldungen)
{
var ov = new ObjectView(meldung, "SuperId");
currentContext.AddChildContext("Message", ov);
}
}
Variante: Daten aus einer CSV-Datei
using System.IO;
using System.Linq;
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
var csvPfad = @"C:\Daten\meldungen.csv";
var zeilen = File.ReadAllLines(csvPfad).Skip(1); // Header überspringen
foreach (var zeile in zeilen)
{
var spalten = zeile.Split(';');
var meldung = new Meldung
{
SuperId = (int)currentContext.Data.CurrentKey,
Message = spalten[0],
Prioritaet = spalten[1]
};
currentContext.AddChildContext("Message", new ObjectView(meldung, "SuperId"));
}
}
Hinweise
Child muss konfiguriert sein: In der PRINT+PLUS Konfiguration muss ein Child mit dem gewählten Präfix angelegt sein (Typ "Andere Daten"). Die Felder müssen den Property-Namen der Klasse entsprechen.
Nur öffentliche Properties (public) werden als Felder/Platzhalter erkannt. Private Felder sind nicht sichtbar.
Keine Kommentare vorhanden
Keine Kommentare vorhanden