Datensatz-Bilder aus cobra einbetten

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;
		}
	}
}

Last updated