Dieses Beispielskript zeigt wie man Bilder, die in cobra im Datensatz (zum Beispiel durch das Mobile CRM) gespeichert sind, in einer Ausgabe verwendet.
Konfiguration
Das Skript wird als AfterLoadData ausgeführt
Der Platzhalter in der Vorlage ist {TicketAbarbeitung.Unterschrift#BildAbsolut}
Ideen
Es wird das Bild aus dem Bilddatensatz temporär auf die Festplatte gespeichert
Es wird ein Custom-Value mit dem Pfad zur Datei in der Ausgabe bereitgestellt
In der Vorlage kann mit dem Custom-Value in Verbindung mit dem #BildAbsolut-Kommando das Bild eingefügt werden
Falls der Devexpress-Word-Exporter genutzt wird, muss Bilder in Vorlagebeachtet werden.
// Version 5
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Ruthardt.CobraBase.Functions.Converter;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.CobraFramework.Ado;
using Ruthardt.Common.Util;
using Ruthardt.PrintPlus.Export.Context;
using Ruthardt.PrintPlus.Model;
using Ruthardt.PrintPlus.Model.Interfaces;
using Ruthardt.PrintPlus.Model.Enumerations;
using Cobra.Common.Database.BusinessObjects.Schema;
public class UnterschriftenEinbetten : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Zugriff auf den aktuellen Datensatz
var currentDatensatz = currentContext.Data;
var tableId = GetLegacyTableId(currentDatensatz);
printContext.Logger.Debug("tableId: " + tableId);
// Bestimme ob Datensatz ein Bild hat
var selectImageCommand = "SELECT IMAGEDATA FROM IMAGES WHERE SUPERID = @superid AND TABLEID = @tableid";
var imageResult = printContext.AdoAccess.GetTable(
selectImageCommand,
new SqlParameter("@superid", currentDatensatz.CurrentKey),
new SqlParameter("@tableid", tableId)
);
if (imageResult.Rows.Count != 1) {
currentContext.CustomValues["Unterschrift"] = "";
return;
}
// Bild auslesen, in temporären Pfad speicher und für Ausgabe vermerken
var bitmapRow = imageResult.Rows.Cast<DataRow>().First();
var bitmap = bitmapRow[0] as byte[];
var temporaryFilePath = Path.GetTempFileName();
File.WriteAllBytes(temporaryFilePath, bitmap);
printContext.Logger.Debug("Unterschrift wird eingefügt: " + temporaryFilePath);
currentContext.CustomValues["Unterschrift"] = temporaryFilePath;
}
// Ermittlung der Tabellen-ID
private static int GetLegacyTableId(IObjectView objectView) {
var tableLogicalName = objectView.ObjectViewInfo.LogicalName;
APTableTypeOld enumValue;
if (!APTableTypeOld.TryParse(tableLogicalName, out enumValue))
{
throw new Exception(
string.Format(
"Die Tabelle {0} ({1}) konnte nicht bestimmt werden",
objectView.ObjectViewInfo.UserLevelName,
objectView.ObjectViewInfo.LogicalName));
}
return (int)enumValue;
}
}
}
Unterdatensätze
Auch zu Unter- und Überdatensätzen können Bilder geladen werden und als Custom-Value hinterlegt werden.
// Version 5
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Ruthardt.CobraBase.Functions.Converter;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.CobraFramework.Ado;
using Ruthardt.Common.Util;
using Ruthardt.PrintPlus.Export.Context;
using Ruthardt.PrintPlus.Model;
using Ruthardt.PrintPlus.Model.Interfaces;
using Ruthardt.PrintPlus.Model.Enumerations;
using Cobra.Common.Database.BusinessObjects.Schema;
public class UnterschriftenEinbetten : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Zugriff auf den aktuellen Datensatz
var currentDatensatz = currentContext.Data;
var entries = currentContext.ChildContextByPrefix["TicketAbarbeitung"];
if (entries == null || entries.IsEmpty())
{
return;
}
var tableId = GetLegacyTableId(entries.First().Data);
printContext.Logger.Debug("tableId: " + tableId);
// Alle Unterdatensätze ermitteln
foreach (var abarbeitung in entries)
{
printContext.Logger.Debug("abarbeitungId: " + abarbeitung.Data.CurrentKey);
// Bestimme ob Datensatz ein Bild hat
var selectImageCommand = "SELECT IMAGEDATA FROM IMAGES WHERE SUPERID = @superid AND TABLEID = @tableid";
var imageResult = printContext.AdoAccess.GetTable(
selectImageCommand,
new SqlParameter("@superid", abarbeitung.Data.CurrentKey),
new SqlParameter("@tableid", tableId)
);
if (imageResult.Rows.Count != 1) {
abarbeitung.CustomValues["Unterschrift"] = "";
continue;
}
// Bild auslesen, in temporären Pfad speicher und für Ausgabe vermerken
var bitmapRow = imageResult.Rows.Cast<DataRow>().First();
var bitmap = bitmapRow[0] as byte[];
var temporaryFilePath = Path.GetTempFileName();
File.WriteAllBytes(temporaryFilePath, bitmap);
printContext.Logger.Debug("Unterschrift wird eingefügt: " + temporaryFilePath);
abarbeitung.CustomValues["Unterschrift"] = temporaryFilePath;
}
}
// Ermittlung der Tabellen-ID
private static int GetLegacyTableId(IObjectView objectView) {
var tableLogicalName = objectView.ObjectViewInfo.LogicalName;
APTableTypeOld enumValue;
if (!APTableTypeOld.TryParse(tableLogicalName, out enumValue))
{
throw new Exception(
string.Format(
"Die Tabelle {0} ({1}) konnte nicht bestimmt werden",
objectView.ObjectViewInfo.UserLevelName,
objectView.ObjectViewInfo.LogicalName));
}
return (int)enumValue;
}
}
}