Direkt zum Hauptinhalt

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

  1. Eigene C#-Objekte erstellen und mit Daten füllen
  2. Jedes Objekt in eine ObjectView verpacken (Reflection-basierter Wrapper)
  3. Per AddChildContext dem aktuellen Context hinzufügen
  4. 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.