CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Bilder in Berichten: Vorbildlich gelöst!

DeltaMaster bietet an diversen Stellen und mit verschiedenen Herangehensweisen die Möglichkeit, externe Bilder in Berichte einzubinden. Heute verschaffen wir uns einen genaueren Überblick, wo und wie das am besten funktioniert!

Bilder in Berichten in DeltaMaster

In unserer Business-Intelligence-Software DeltaMaster bieten wir dem Anwender einige Optionen an, Bilder in Berichte zu integrieren. Wir meinen hier nicht die Grafiken, die von DeltaMaster selbst erzeugt werden – wie zum Beispiel die nach Kennzahlwerten eingefärbten Landkarten der Geo-Analyse oder die Portfolioanalyse mit der Anzeige der Lage von Objekten.

Vielmehr geht es um Bilder, deren Generierung außerhalb der unmittelbaren DeltaMaster-Sphäre stattfand oder stattfindet.

Bilder in Berichten wie hier im SQL-Durchgriff (neue Variante) helfen bei der Zuordnung

Bilder in Berichten wie hier im SQL-Durchgriff (neue Variante) helfen bei der Zuordnung

Produktbilder frischen das Gedächtnis auf, wenn nur Name oder interne Produktnummern vorliegen. Ebenso helfen beispielsweise Porträtfotos bei Personen oder Gebäudeansichten in der Immobilienverwaltung.

So wie oben im SQL-Durchgriff kann das aussehen (Hinweis: Betätigen Sie bitte einmal Strg+R!).

Die Module und Analyseverfahren, die in DeltaMaster 6 die Einbindung von Grafiken erlauben und hier betrachtet werden, sind die folgenden:

  • Grafische Tabelle
  • URL-Ansicht
  • Marker der Geo-Analyse
  • SQL-Durchgriff

Zusätzlich können wir unterscheiden, wo sich denn die Bilder, die in die Berichte integriert werden sollen, befinden:

  • Dateisystem
  • Datenbank
  • Per Webzugriff erreichbar
  • Bilder werden erst bei Aufruf des Berichtes generiert

Schauen wir uns doch die Module der Reihe nach an. Wir behalten uns das in diesem Fall spannendste Modul “SQL-Durchgriff” für den Schluss vor, da wir dann gleich ein paar weitere, hier noch nicht behandelte Neuerungen der letzten Zeit im SQL-Durchgriff besprechen können!

Bilder in Berichten: Die Grafische Tabelle

Bilder in Elementeigenschaften: per Pfad

Hier muss man den Weg zu den Bildern bereits bei der Modellierung, also im ETL-Prozess verankern. Es gab bisher bereits die Möglichkeit, Bilder im Dateisystem zu speichern und Pfade zu den Bildern als Elementeigenschaften zu modellieren. Eine solche Anwendung mit Verwendung eines Pfades hatte ich bei meinem Blogartikel Torschusspanik zur WM 2018 gezeigt:

Die Bilder werden mit ihrem Pfad identifiziert!

Die Bilder werden mit ihrem Pfad identifiziert!

Ein Pfad kann dann lokal sein – entweder absolut wie “D:\Temp\Flaggen\de.png” oder relativ zur Analysesitzung, also etwa “Flaggen\de.png”, wenn sich die Sitzung in “D:\Temp” befindet. Berichtsempfänger bräuchten dann aber jeweils identische Strukturen auf ihren Laufwerken und auch eigene Kopien der Bilder.

Besser sind dann UNC-Pfade (UNC wie Uniform Naming Convention) der Form “\\servername\freigabename\pfad\bild.png” geeignet, die dann für alle Berichtsempfänger erreichbar sein müssen. Hier müssen Sie sich natürlich die bei Ihnen vorliegenden Namen und Pfade eingesetzt denken.

Bilder in Elementeigenschaften: als BLOB

Mit der Version 6.3.3.2 haben wir nun zusätzlich die Möglichkeit implementiert, direkt in der Datenbank abgespeicherte Bilder anzuzeigen. Diese legen wir als BLOB (Binary Large Object) in der Datenbank-Tabelle beispielsweise auf dem SQL Server ab:

Ein Bericht mit Bildern kann beispielsweise auf BLOB-Dateien zugreifen.

Aufbau einer Beispieltabelle auf dem SQL Server 2019

Die Bilder sind mit Typ “varbinary(max)” in den Feldern der Spalte Bild untergebracht, auch diese Spalte wird später als Elementeigenschaft des Feldes “Modell” verwendet. In der Spalte Pfad sieht man die alternative Möglichkeit, die Bilder per Pfad anzusprechen.

Wie bekommt man die Bilder überhaupt erst einmal in die Datenbank? Nach dem Anlegen der Tabelle kann etwa der erste Datensatz mit “INSERT INTO Modell values (‘A1′, (SELECT * FROM OPENROWSET(BULK N’d:\temp\bild1.png’, SINGLE_BLOB) as T1),62425,’d:\temp\bild1.png’)” geschrieben werden. Für Oracle habe ich einen analogen Ansatz in einem Blogbeitrag entdeckt.

Anzeige in der Grafischen Tabelle

Bei der Grafischen Tabelle schauen wir im Reiter “Elementeigenschaften” nach und aktivieren die Ansicht “als Spalte, als Bild”. Somit zeigen wir das Bild im Bericht direkt nach der Modellspalte an:

Bilder in Berichten des Typs Grafische Tabelle skalieren mit der Zeilenhöhe mit

Bilder in der Grafischen Tabelle skalieren mit der Zeilenhöhe mit

Hier in diesem Multiples-Bericht sehen wir, dass sich die Bildgröße an die vergrößerte Zeilenhöhe anpasst. Dies gilt solange, bis die Zeilenhöhe die Bild-Originalgröße erreicht, danach verharrt die Anzeige des Bildes auf dieser Größe. Im letzten Bild haben wir die Option “als Beschriftung, als Bild” gewählt – nun ersetzt das Bild die Elementnamenspalte.

Bei diesem Multiples-Bericht sehen wir übrigens weitere Erweiterungen aus dem vorletzten Release 6.3.3.2: In den Berichtseigenschaften beispielsweise des ersten Berichtes (dies ist eine URL-Ansicht!) haben wir die Checkboxen aktiviert, dass im Präsentationsmodus die leere Filterliste ausgeblendet wird, ebenso wie der Berichtstitel. Auch die Statusleiste mit einem Pfad zum Bild wird unterdrückt, da dieser Ordnernamen meines Blogbeitrags verrät. Es verbleibt nun mehr Platz für das anzuzeigende Bild.

Im letzten Bericht mit der Zeilenhöhe 63 Pixel ist noch eine weitere Möglichkeit eingebaut, auf ein Bild zu verweisen: Dies geschieht über eine externe Verknüpfung zu einem Bild. Das heißt, dass sich zum Beispiel ein Browserfenster mit einem Bild öffnen kann. Eigentlich ist aber diese Anzeige bereits außerhalb von DeltaMaster und darüber hinaus gibt es keine Rücksprungmöglichkeit.

Bilder in Berichten: Die URL-Ansicht

Im letzten Multiples-Bericht hatten wir bereits im ersten Fenster links oben die URL-Ansicht verwendet. Die URL-Ansicht hatte ich ausführlich im Blogbeitrag Lieferung frei Haus behandelt. Man kann auf URLs, also zum Beispiel auf Webseiten verweisen, als auch auf einzelne Dateien, die sich ebenfalls im Web befinden oder lokal gespeichert sind.

Was kann nun die URL-Ansicht liefern, das nicht bereits mit der Grafischen Tabelle umgesetzt werden kann?

Nun, einerseits können externe Inhalte (extern im Sinne von “außerhalb der aktuellen Sitzung”), also auch Bilder in die Berichte eingebunden werden. Diese Bilder sind in der Größe per Mausrad frei skalierbar.

Ein weiterer Vorteil besteht darin, dass wir Filterwerte dynamisch in die URL-Adresse einbauen können. Nehmen wir z. B. an, dass wir alle Modelle als Bilder unter einem Namen abspeichern, der dem Modellnamen + “.png” entspricht, also z. B. die Dateien “A1.png” und “B2.png” existieren.

Nun kann man als URL-Adresse zum Beispiel “file:///d:\temp\<view0>.png” wählen, wobei <view0> als Platzhalter auf das ausgewählte Element in der Modelldimension verweist.

Die Adresse ist somit dynamisch und passt sich an das Element an:

URL-Adressen können dynamisch angelegt sein

Die Grafik passt sich an das im Filter ausgewählte Element an!

Unter Einhaltung bestimmter Namenskonventionen können wir somit dynamisch auf Bilder verweisen, ohne dass eine explizite Modellierung – etwa mit Elementeigenschaften – notwendig ist.

Bilder als Marker

Bilder können als Marker eingesetzt werden!

Bilder können als Marker eingesetzt werden!

Die Möglichkeit, Marker bei der Geo-Analyse durch Bilder zu ersetzen, habe ich im Blogbeitrag Ortskundig mit der Geo-Analyse im Abschnitt “Bilder als Marker in der Geo-Analyse” ausführlich behandelt und verweise hiermit auf die dortigen Ausführungen.

Bilder im SQL-Durchgriff

Detailansicht

Beim SQL-Durchgriff schaut man direkt auf die relationalen Daten. Mit dem Release 6.3.1 haben wir offiziell die Detailansicht eingeführt. Hier erhalten ausgewählte Elemente der aktiven Zeile eine exponierte Darstellung in einem gesonderten Bereich rechts. Diese Art der Darstellung wurde vor allem für Dateneingabe- und Planungsanwendungen konzipiert, aber auch für die Wiedergabe von Bildern ist der gesonderte Bereich der Detailansicht hervorragend geeignet.

Wir verwenden hier wieder unsere einfache Tabelle auf dem SQL Server. Im Gegensatz zu unserem Einstiegsbild ganz oben, haben wir hier zwei Spalten, die auf Bilder verweisen, für die Detailansicht aktiviert. Pfad verweist auf eine Grafik im Dateisystem, Bild hingegen auf ein BLOB-Objekt, das wie oben gezeigt, direkt in unserer Tabelle auf dem SQL-Server lebt.

Die Pfad-Grafik habe ich allerdings hier einmal auf 25% der ursprünglichen Größe verkleinert und dann sehr knapp beschnitten. In den Eigenschaften des Berichts muss man noch die Checkbox “Bild anzeigen, wenn Feld URL oder Binärdaten eines Bildes enthält” aktivieren.

DeltaMaster zeigt dann die beiden Bilder in der Detailansicht untereinander an:

Bilder werden in Originalgröße angezeigt, es sei denn, sie sind zu groß.

Bilder im SQL-Durchgriff

Bilder zeigen wir in der Detailansicht momentan immer in der Originalgröße, es sei denn, sie sind größer als die hier sichtbare Breite. Die obere Grafik, die um den Stuhl herum noch einen größeren weißen Freiraum aufweist, wird deshalb an die gegebene Breite angepasst.

Zuweisung zu den Ansichten

Über die Einstellungen kann man jedem Feld den Ort zuweisen, wo es erscheinen soll: nur links in der Liste, nur rechts in der Detailansicht oder doch lieber in beiden Ansichten? Natürlich müssen die Felder auch aktiviert und sichtbar sein:

Felder werden den Ansichten zugeordnet.

Zuweisung zu den Ansichten

Ich habe hier in der Darstellung noch einige vorhandene Spalten unterschlagen, da sie hier für die Zuweisung nicht relevant sind. In der Tabelle erkennt man, dass sowohl das Bild im BLOB-Format, als auch die Grafik, die über einen Pfad angesprochen wird, in der Detailansicht erscheinen sollen. Der Absatz ist nur in der Liste sichtbar, aber das Modell in beiden Ansichten.

Die Spaltenbreite hat eine Wirkung auf die Bildgröße in der Darstellung, aber zurzeit nur in der Liste und nicht in der Detailansicht. Das heißt, lasse ich beispielsweise die BLOB-Bilder in der Liste mit Spaltenbreite 50 anzeigen, so sähe das folgendermaßen aus:

Bilder in Berichten des SQL-Durchgriffs können sich entweder in der Listen oder in der Detailansicht befinden.

Bilder zeigen wir auch in der Liste an!

Hier könnte man zum Beispiel auch die Vorschaubilder bereits in kleiner Größe als BLOB in der Datenbank abspeichern und in der Liste als Orientierungshilfe nutzen. Die “hochauflösende” Grafik bleibt in der Detailansicht und wird nur für die jeweils ausgesuchte Zeile angezeigt.

Man sollte sich immer bewusst sein, dass die BLOB-Bilder zum Datenbankverkehr beitragen!

Beim Export eines solchen SQL-Durchgriffs-Berichts inklusive Detailansicht (“Listen- und Detailansicht”) wird immer nur die Liste exportiert.  Das angezeigte Bild in der Detailansicht gehört ja nur zu einer einzigen Zeile.

Soll das Bild der Detailansicht mit in den Export, kann die Ansicht “Listenansicht vollständig” gewählt werden.

Auch bei einem SQL-Durchgriff lassen sich ähnlich wie in der Grafischen Tabelle Verknüpfungen anlegen, die dann auf externe Bilder verweisen können.

Exkurs für fortgeschrittene Anwender

Gespeicherte Prozeduren im SQL-Durchgriff

Im Beitrag Durchgehend geöffnet hatte ich bereits den SQL-Durchgriff verwendet, um unter anderem über gespeicherte Prozeduren statistische Auswertungen mit R durchzuführen. Kann man mit solchen Ansätzen auch Bilder generieren, die wir im SQL-Durchgriff anzeigen können und die somit zum Zeitpunkt des Aufrufs noch gar nicht existieren?

Fassen wir einmal kurz zusammen, wie der Ansatz mit den gespeicherten Prozeduren in DeltaMaster funktioniert:

  • Der SQL-Durchgriff (neue Variante) in DeltaMaster erlaubt, gespeicherte Prozeduren aufzurufen.
  • An die Prozedur übergeben wir automatisch die Parameter, die aus den eingestellten, vom jeweiligen Defaultelement abweichenden Filtern und aus der eingestellten Zeilenzahl bestehen.
  • In der Prozedur benutzen wir völlig frei die übergebenen Parameter, um über SQL-Abfragen eine Tabelle zu erzeugen, die der SQL-Durchgriff anzeigen kann.

Haben wir R Services (seit 2016) oder Python (seit 2017, zusammen Machine Learning Services genannt) auf dem SQL Server installiert, sind weitergehende statistische Analysen möglich und wir können dann sogar Bilder in Berichten erzeugen!

R Services

Wir können dann nämlich innerhalb der Prozedur auch eine Tabelle in Form einer SQL-Abfrage an eine R-Prozedur übergeben. Diese R-Prozedur, die wir selbst schreiben müssen, führt beispielsweise statistische Analysen durch und erzeugt eine Ausgabe in Form eines sogenannten Data-Frames. Stellen Sie sich hierbei eine Tabelle vor, deren Spalten unterschiedliche Typen besitzen dürfen. Diese wird wieder in ein Result-Set verwandelt und an DeltaMaster weitergereicht.

Also einfach ausgedrückt: Eine Tabelle mit Daten (genauer: eine Anweisung zur Erstellung der Tabelle)  geht in die innere R-Prozedur ein und diese gibt eine Tabelle mit Ergebnissen wieder zurück. Die äußere Prozedur übernimmt den Austausch mit DeltaMaster.

Unter anderem darf in dieser ausgegebenen Tabelle auch ein binäres Format stehen: Kann man also ein Data-Frame erzeugen, das neben Zahlenwerten – beispielsweise Prognosen oder Funktionswerte oder angepasste Parameter – auch eine oder mehrere Spalten mit Bildern enthält?

So einfach ist es aber leider nicht, da ein derartiger Versuch mit der Fehlermeldung “There can be only one column in the result set when using the ‘varbinary’ data type.” endet. Bei Suchen mit diesem String im Web habe ich bisher nur unbeantwortete Fragen von Leidensgenossen gefunden. Meine Forschung ist hier noch im Fluss.

Das heißt wohl (bis ich das Gegenteil beweisen kann!), dass wir über diesen Weg mit einem Prozeduraufruf nur eine Tabelle mit einem Bild erzeugen können. Wir können aber keine gemischten Tabellen und auch nicht eine Tabelle mit mehreren Bildern, d. h. eins pro Zeile, generieren.

Möchte man mehrere Bilder in Berichten haben oder Bilder mit Resultatstabellen gemeinsam anzeigen, so geht das aber auf jeden Fall mit getrennten SQL-Durchgriffen in Multiples. Diese weisen dann aber eine gewisse Redundanz auf, da wir die Abfragen für die benötigten Daten mehrfach ausführen.

Bemerkung: Es gibt noch die Möglichkeit in R, mehrere Bilder in einem (Meta-)Bild unterzubringen.

Ein Beispiel

Ich habe mir hier einmal die von uns stetig aktualisierten Corona-Daten hergenommen und die bisher dokumentierten Fälle bis zum Stichtag 27.10.2020 nach Bundesländern und Altersgruppen analysiert. Die absoluten Zahlen verteilen sich wie in dieser Kreuztabelle angegeben:

Die absoluten Fallzahlen bis zum 27.10.2020 nach Alter und Bundesland sind in dieser Grafischen Tabelle angegeben.

Die absoluten Fallzahlen bis zum 27.10.2020 nach Alter und Bundesland

Es gibt nun in R ein Paket zur Korrespondenzanalyse, die Zeilen und Spalten solcher Kreuztabellen grafisch aufbereitet! Mit den Paketen Cairo, png, ggplot2 und dem Paket ca für die Korrespondenzanalyse habe ich einen SQL-Durchgriff mit Prozeduraufruf erstellt. Das Ergebnis in Form eines Bildes ist hier im rechten Teil des Multiples-Bericht zu sehen:

Das grafische Ergebnis der Korrespondenzanalyse wird im SQL-Durchgriff angezeigt.

Das grafische Ergebnis der Korrespondenzanalyse wird im SQL-Durchgriff angezeigt.

In diesem Multiples-Bericht zeigt die Grafische Tabelle die Anteile der Altersklassen an den Fällen in den jeweiligen Bundesländern.

Der linke Bericht ist führend (auswählbar in den Einstellungen des Multiples-Berichts!): Stellen wir hier das Datum um, folgt der SQL-Durchgriff und übergibt das Datum an die Prozedur. Hier werden dann die nötigen Daten per SQL-Abfrage erstellt und an die interne R-Prozedur weitergereicht. Diese bereitet die Daten passend auf, führt die Korrespondenzanalyse durch und erzeugt ein Result-Set mit einem einzigen Element vom Typ “varbinary(max)”. Das ältere Format “image” funktioniert auch, soll aber aufgegeben werden. Die äußere Prozedur erhält dieses Bild zurück und übergibt es schließlich an DeltaMaster.

Wenn man hier das Datum im linken Bericht umstellt, dauert es nur einen kurzen Moment, bis auch das Ergebnis des SQL-Durchgriffs erscheint. Der Multiples-Bericht lässt sich hier auch komplett exportieren, da das angezeigte Bild im Bericht des SQL-Durchgriffs der Liste zugeordnet wurde. In das Bild haben wir noch einen Zeitstempel integriert, damit wir leichter sehen, dass hier etwas aktualisiert wurde.

Noch kurz ein paar Bemerkungen zur Interpretation: Die Korrespondenzanalyse zeigt, dass in Thüringen und Sachsen im Vergleich zum Bundesdurchschnitt die Älteren bei den Fällen überproportional vertreten sind, in Berlin und Bremen sind es die Jüngeren. Berlin und Bremen liegen auch sehr dicht zusammen. Dies deutet darauf hin, dass sich die Altersprofile ähneln – wie auch die Grafische Tabelle zeigt. Für weitere Analysen bräuchte man auch die allgemeine Altersverteilung in den Bundesländern.

Nachtrag (17.11.2020)

Inzwischen habe ich eine Möglichkeit in R gefunden, mehrere Spalten und Zeilen zu übergeben, auch wenn Bilder involviert sind. Ich werde das Thema für mich noch weiter vertiefen. Ein Beispielergebnis einer Prozedur könnte folgendermaßen aussehen:

Daten und Bilder gemeinsam in einer Prozedur erzeugen

Hier werden in der Prozedur 10 Datensätze generiert und jeweils zwei Bilder erzeugt. Bild 1 mit den Datenpunkten aus zwei Klassen erscheint verkleinert in der Liste und im Original in der Detailansicht. Bild 2 zeigt einen angepassten Entscheidungsbaum, diesmal nur in der Detailansicht.

Quellen der R-Pakete
  1. Nenadic, O., Greenacre, M. (2007) Correspondence Analysis in R, with two- and
    three-dimensional graphics: The ca package. Journal of Statistical Software
    20(3):1-13.
  2. Simon Urbanek and Jeffrey Horner (2015). Cairo: R graphics device using cairo graphics
    library for creating high-quality bitmap (PNG, JPEG, TIFF), vector (PDF, SVG,
    PostScript) and display (X11 and Win32) output. R package version 1.5-9.
    https://CRAN.R-project.org/package=Cairo
  3. Simon Urbanek (2013). png: Read and write PNG images. R package version 0.1-7.
    https://CRAN.R-project.org/package=png
  4. H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York,
    2016.
  5. Terry Therneau and Beth Atkinson (2018). rpart: Recursive Partitioning and Regression Trees. R package version 4.1-13. https://CRAN.R-project.org/package=rpart