BASE: Bildanzeige (PostgreSQL CONCAT)

Hallo,

unter LibreOffice (Original) 6.1.5.2 habe ich ein Formular, welches in einem Grafischen Steuerelement ein Bild anzeigen soll, dessen Dateiname (und zum Test auch Pfad) in der der Formular-Abfrage zugrunde liegenden Tabelle gespeichert ist. Die Tabelle hat die Felder ID, PfadName, BildName und zwei Datensätze:
ID   PfadName               BildName
1    /mnt/Daten/Bild1.jpg Bild1.jpg
2 /mnt/Daten/Bild2.jpg   Bild2.jpg

Das Problem:
Grafik-Element Datenfeld == PfadName     --> Bildanzeige funktioniert,
Grafik-Element Datenfeld == FileNamePfad --> keine Bildanzeige.

Die Abfrage zum Formular:
SELECT "ID", "PfadName", "BildName", CONCAT('/mnt/Daten/',"BildName") AS "FileNamePfad" from "SandBox".Test (AS wird vom LO-SQL-Editor gelöscht, der CONCAT-Strng wird verändert von
        Eingabe: CONCAT('/mnt/Daten/', "BildName")
erneute Anzeige: CONCAT('/mnt/Daten/', [BildName]).

Das Ergebnis des CONCAT-String wird in einem Test-Textfeld richtig angezeigt: Inhalte des Testfeldes und txtPfadname sind identisch. Trotzdem erfolgt mit CONCAT keine Bildanzeige.

Wie kann ich das Problem weiter eingrenzen bzw. abstellen? Hintergrund: Alle Bilder zu diesem Formular liegen definitiv in einem Verzeichnis; daher macht es keinen Sinn, für jeden Datensatz das Verzeichnis mit in die Tabelle zu packen.

Danke, Michael

Hallo Michael,

wenn Du die Dateien alle im gleichen Verzeichnis wie Deine Datenbank
hast, dann brauchst Du nur die Dateinamen. Ansonsten werden Pfade
relativ gespeichert.

Du möchtest hingegen einen absoluten Link erzeugen. Der müsste dann mit
file:///mnt/Daten/ erfolgen.

Gruß

Robert

Vielen Dank Robert,

wenn Du die Dateien alle im gleichen Verzeichnis wie Deine Datenbank hast, dann brauchst Du nur die Dateinamen. Ansonsten werden Pfade relativ gespeichert. Du möchtest hingegen einen absoluten Link erzeugen. Der müsste dann mit file:///mnt/Daten/ erfolgen.

Die Bilddateien sind definitiv nicht im Verzeichnis der Datenbank.

Ich habe die CONCAT-Anweisung für den absoluten Pfad geändert: Ebenfalls keine Bildanzeige.

Erste Merkwürdigkeit: Warum funktioniert die Bildanzeige bei Bezug auf
PfadName==/mnt/Daten/Bild1.jpg

Dann habe ich einen dritten Datensatz erzeugt mit
PfadName==file:///mnt/Daten/Bild1.jpg.
Auch hier funktioniert die Bildanzeige.

Danke, Michael

Hallo Michael,

was zeigt Deine Abfrage denn an, wenn Du sie in Extras > SQL ablaufen
lässt? Irgendwie bekommt das ja das Kontrollfeld nicht geregelt, das
Ganze in einen Pfad umzuwandeln. Könnte mit Groß- und Kleinschreibung
zusammenhängen. Ich würde auch einmal || statt CONCAT verwenden ...

Gruß

Robert

Danke Robert,

was zeigt Deine Abfrage denn an, wenn Du sie in Extras > SQL ablaufen lässt?

Unauffällig:
SELECT "ID", "PfadName", "BildName", CONCAT('/mnt/Daten/',"BildName") AS "FileNamePfad" from "SandBox".Test
1,/mnt/Daten/12560.jpg,Bild1.jpg,file:///mnt/Daten/Bild1.jpg
2,/mnt/Daten/12560.jpg,Bild2.jpg,file:///mnt/Daten/Bild2.jpg
3,file:///mnt/Daten/Bild1.jpg,Bild1.jpg,file:///mnt/Daten/Bild1.jpg

Irgendwie bekommt das ja das Kontrollfeld nicht geregelt, das Ganze in einen Pfad umzuwandeln. Könnte mit Groß- und Kleinschreibung zusammenhängen.

Auch hier: Warum funktioniert die Anzeige mit Bezug auf [Pfadname], egal ob hier file:// vorangestellt ist oder nicht?

Ich würde auch einmal || statt CONCAT verwenden ...

Gemacht: Strings für nicht-leere Bildname identisch zu CONCAT.

Gruß Michael

Hallo Michael,

Auch hier: Warum funktioniert die Anzeige mit Bezug auf [Pfadname], egal
ob hier file:// vorangestellt ist oder nicht?

Ich nehme an, dass das Ding einfach file:// ergänzt, weil es mit dem
ersten Frontslash merkt, dass Du einen absoluten Pfad angibst.

Ich würde auch einmal || statt CONCAT verwenden ...

Gemacht: Strings für nicht-leere Bildname identisch zu CONCAT.

Das heißt, dass Du immer noch nicht weiter bist. Bild wird nicht
geladen, wenn der Pfad über CONCAT zusammengestellt wird.

Vielleicht hilft ja noch, die Abfrage als Ansicht zu speichern oder auch
im Formular unter
Daten > SQL-Befehl analysieren > 'Nein'
einzustellen.

Gruß

Robert

Hallo Michael,

hats du mal Roberts Ratschlag ausprobiert, es mit einer Ansicht zu versuchen? Ich verstehe das so, dass du ein CREATE VIEW AS SELECT... mit deinem SQL (natürlich dann ohne die doppelten Anführungszeichen) in PostgreSQL definierst und in LibO diese View xxx anstatt deines SQL-Statements verwendest. Für LibO sieht xxx dann wie eine Tabelle aus, LibO weiß nichts mehr von CONCAT. Das könnte dann klappen, weil nichts mehr durch LibO am Statement verändert oder interpretiert werden muss.

Gruß

Gerhard

Hallo Robert,

danke für die Vorschläge.

Das heißt, dass Du immer noch nicht weiter bist. Bild wird nicht geladen, wenn der Pfad über CONCAT zusammengestellt wird.

Ja, genau, nicht über CONACT und nicht mit ||.

Vielleicht hilft ja noch, die Abfrage als Ansicht zu speichern

Ich habe den SQL-String als Abfrage gespeichert und dem kopierten Formular diese Abfrage als Datenquelle zugewiesen. War das gemeint? Keine Besserung, keine Bildanzeige.

oder auch im Formular unter Daten > SQL-Befehl analysieren > 'Nein' einzustellen.

Auch damit keine Bildanzeige; einziger Unterschied: Die Bilder die an dem Feld hängen, das Pfad und Bilddatei enthält, werden dann Schwarz/Weiß angezeigt, sonst farbig.

Um das Thema Groß-/Kleinschreibung auszuschließen, habe ich ein neues Feld bilddatei angelegt, den File 12560.jpg nach /home/michael kopiert und den CONCAT- / ||-Befehl angepasst: Keine Bildanzeige.

Was kann ich sonst noch probieren?

  * Ist es möglich, das grafische Steuerelement an an LO-Element zu
    hängen und in diesem die CONCAT- oder ||-Kombination.
  * Macht es Sinn, den CONCAT-Befehl auf PostgreSQL-Ebene auszuführen
    und dieses Feld zu nutzen?
  * Was noch?

"Wessen Fehler" suchen wir eigentlich: PostgreSQL, Connector, LibreOffice?

Ratlos, Michael

Hallo Gerhard, vielen Dank.

hast du mal Roberts Ratschlag ausprobiert, es mit einer Ansicht zu versuchen? Ich verstehe das so, dass du ein CREATE VIEW AS SELECT... mit deinem SQL (natürlich dann ohne die doppelten Anführungszeichen) in PostgreSQL definierst und in LibO diese View xxx anstatt deines SQL-Statements verwendest. ...

Missverständnis, deshalb der Vorschlag aus meiner Mail 14:32 Uhr, die versehentlich an Roberts Postfach und nicht in die Liste ging:

CONCAT-Befehl auf PostgreSQL-Ebene

Umsetzung erfolgt etwas später ...

Gruß, Michael

Hallo,

Danke an Robert für diese Antwort:

Vielleicht hilft ja noch, die Abfrage als Ansicht zu speichern

Ich habe den SQL-String als Abfrage gespeichert und dem kopierten Formular diese Abfrage als Datenquelle zugewiesen. War das gemeint?

Nein, eine Ansicht erhältst Du, wenn Du eine Abfrage mit der rechten Maustaste in dem Kontextmenü "Als Ansicht" erstellst. Dann erscheint die Ansicht bei den Tabellen, wird also in PostgreSQL ausgeführt und wie eine Tabelle übermittelt.

Das habe ich versucht, ich finde keinen Menueintrag "Als Ansicht". Unter "Abfragen" habe ich eine funktionierende) "Abfrage 1".Rechtsklick darauf zeig folgende Optionen: "Kopieren", "Einfügen", "Löschen", "Umbenennen", "Bearbeiten...", "In SQL-Ansicht bearbeiten", "Öffnen", "Formular-Assistent", "Bericht", "Berichts-Assistent", "Datenbank" mit "Eigenschaften..." und "Verbindungsart". Lasse ich "Abfragen" und "Abfrage1" aktiviert und klicke im Hauptmenu "Bearbeiten" gibt es vier zusätzliche Varianten, alle ausgegraut (nicht zugreifbar): "Rückgängig", "Inhalte einfügen", "Alles auswählen", "Als Ansicht erstellen". Der letzte Punkt bleibt auch ausgegraut, wenn ich eine neue "Abfrage2" aktivieren, die nur "ID" enthält (Idee war, etwaigen Kollisionen mit CONCAT auszuschließen).

Ersatzweise habe ich  - wie von Gerhard beschrieben - auf PostgreSQL einen View angelegt mit
CREATE VIEW "yyy" AS SELECT "ID", CONCAT ('mnt/Daten', "BildName") AS ...

Der View lässt sich in dBeaver ausführen, alle Ergebnisse mit oder ohne "file://" öffnen jeweils kopiert in Firefox.

In LibreOffice das Formular auf den View (unter Tabellen) verknüpft: Keine Bildanzeige, die Bilder, die an dem Feld hängen, das Pfad und Bilddatei enthält, werden (wie vormals nach Daten > SQL-Befehl analysieren > 'Nein') Schwarz/Weiß angezeigt, im Original sind sie farbig.

"Wessen Fehler" suchen wir eigentlich: PostgreSQL, Connector, LibreOffice?

Im Moment wohl einen Fehler beim Erkennen des SQL-Codes. Der wird ja scheinbar korrekt ausgeführt, irgendwo aber von LO falsch gedeutet.

Was nun?
Gruß Michael

Hallo Michael,

Das habe ich versucht, ich finde keinen Menueintrag "Als Ansicht". Unter
"Abfragen" habe ich eine funktionierende) "Abfrage 1".Rechtsklick darauf
zeig folgende Optionen: "Kopieren", "Einfügen", "Löschen", "Umbenennen",
"Bearbeiten...", "In SQL-Ansicht bearbeiten", "Öffnen",

Hier erscheint bei mir dann "Als Ansicht erstellen". Zumindest bei einer
direkten MySQL-Verbindung und bei den internen Datenbanken.

Ansonsten müsste es auch möglich sein, den SQL-Code zu kopieren und in
dem Bereich "Tabellen" auf "Ansicht erstellen" zu gehen sowie den Code
dort einzufügen.

"Formular-Assistent", "Bericht", "Berichts-Assistent", "Datenbank" mit
"Eigenschaften..." und "Verbindungsart". Lasse ich "Abfragen" und
"Abfrage1" aktiviert und klicke im Hauptmenu "Bearbeiten" gibt es vier
zusätzliche Varianten, alle ausgegraut (nicht zugreifbar): "Rückgängig",
"Inhalte einfügen", "Alles auswählen", "Als Ansicht erstellen".

Wenn das ausgegraut ist, dann lässt sich über Deinen Treiber keine
Ansicht erstellen. Mit welchem Kontakt zur PostgreSQL-Datenbank
arbeitest Du?

Gruß

Robert

Hallo Michael,

ich habe jetzt den folgenden Versuch mit MariaDB gemacht:
1. Verbindung MariaDB zuerst mit dem direkten Treiber. Der ist leider
zur Zeit bei mir nicht in der Lage, Tabellen über die GUI mit Inhalt zu
befüllen.
2. Verbindung MariaDB mit dem JDBC-Treiber von MariaDB. Arbeit damit
soweit ohne Probleme.

Jetzt habe ich eine Tabelle erstellt, in der ich ein Feld für das
Speichern des Pfades zu einem Bild vorgesehen habe. Dann in dem Formular
dazu ein Eingabefeld für die Grafik. Damit habe ich den Pfad in
relativer Schreibweise (../../../Bilder/) ermittelt und konnte das
ausgesuchte Bild auch sehen.

Jetzt eine Abfrage, in der ich über eine CONCAT-Anweisung die
Bildbezeichnung aus einem Feld mit der Pfadkomponente kombinieren
konnte. Dann habe dieses Feld der Abfrage mit einem grafischen
Kontrollfeld verbunden. Das Bild wurde angezeigt.

Bei der schreibgeschützten Version mit dem direkten Treiber erfolgte
übrigens die Anzeige in Graustufen. Vermutlich ist dies der Hinweis
darauf, dass der Inhalt schreibgeschützt und eine Eingabe nicht möglich ist.

Ich kann das Verhalten, das Du bei Dir mit PostgreSQL hast, hier nicht
nachvollziehen.

Gruß

Robert

Hallo Robert,

vielen Dank.

Ansonsten müsste es auch möglich sein, den SQL-Code zu kopieren und in dem Bereich "Tabellen" auf "Ansicht erstellen" zu gehen sowie den Code dort einzufügen.

Alles ausgegraut, auch wenn ich das Schema SandBox oder eine Tabelle darin aktiviere.

Mit welchem Kontakt zur PostgreSQL-Datenbank arbeitest Du?

Ich glaube, die Connectoren werden mein Trauma.
Mit LibreOffice wird der native genutzt: postgresql://localhost:5432/DatenbankName
dBeaver hat sich selbst den JDBC-Treiber von https://jdbc.postgresql.org installiert und arbeitet damit.
In der Paketverwaltung gibt es einen libpostgresql-jdbc-java 9.4.1212-1 im Konflikt mit libpgjava und libpg-java, die aber beide gar nicht vorhanden nicht (Suche mit SYNAPTIC).

Gruß Michael

Hallo Robert,
herzlichen Dank für die Mühe.

Ich kann das Verhalten, das Du bei Dir mit PostgreSQL hast, hier nicht nachvollziehen.

Ja hier werkelte die Bildanzeige mit der alten mySQL und LO4-Kombination und nativem Konnektor mit Bildanzeige.
Ebenso Bildanzeige mit LO6 und MariaDB mit JDBC-Konnektor.
Dann wegen dem nativen Konnektor der Schwenk auf PostgreSQL, was mir inzwischen schon besser gefällt als MariaDB.
PostgreSQL trotzdem mit JDBC-Konnektor versuchen (siehe andere Mail hier)? Wenn ja, wie?

Vielen Dank, Michael

Hallo Michael,

dBeaver hat sich selbst den JDBC-Treiber von https://jdbc.postgresql.org
installiert und arbeitet damit.

Dann kannst Du mit dem Treiber auch über LibreOffice arbeiten.
Extras > Optionen > LibreOffice > Erweitert > Class Path > ...*.jar
(ich weiß nicht, wie der Treiber genau bei Dir heißt).
Die Treiberklasse ist org.postgresql.Driver
Die Verbindung ist so etwas wie postgresql://localhost:5432/libretest

Fehler am Treiber, der mit LO mitgeliefert wird, sollten dann aber auf
jeden Fall als Bug gemeldet werden. Aber zuerst muss das einmal mit JDBC
laufen.

Gruß

Robert

Hallo Robert,

vielen Dank für Deine Anleitung, ohne die hätte ich's nicht geschafft; die Konnektoren sind ja "etwas" fummelig.

dBeaver hat sich selbst den JDBC-Treiber vonhttps://jdbc.postgresql.org
installiert und arbeitet damit.
Dann kannst Du mit dem Treiber auch über LibreOffice arbeiten.

Auch das ist nicht gelungen, ich habe den Treiber 42.2.5 von https://jdbc.postgresql.org noch einmal heruntergeladen, an anderer Stelle lokal gespeichert und die .jar-Datei unter Extras > Optionen > LibreOffice > Erweitert > Class Path > eingetragen.

Das funktioniert jetzt und auch die Bildanzeige erfolgt wie erwartet!

Vielen Dank, Michael

Hallo Michael,

ich habe den Treiber 42.2.5 von
https://jdbc.postgresql.org noch einmal heruntergeladen, an anderer
Stelle lokal gespeichert und die .jar-Datei unter Extras > Optionen >
LibreOffice > Erweitert > Class Path > eingetragen.

Das funktioniert jetzt und auch die Bildanzeige erfolgt wie erwartet!

Dann wäre jetzt die Zeit gekommen, eine Bugbeschreibung zusammen zu
stellen. Denn offensichtlich tut es ja der Treiber nicht korrekt, den LO
mitliefert. Kannst Du eine Beispieldatenbank mit einer entsprechenden
Abfrage zusammenbauen, die bei Kontakt über JDBC das Bild aus einer
Abfrage heraus mit zusammengestelltem Pfad anzeigt, dies aber mit dem
direkten Treiber nicht tut?

Gruß

Robert

Hallo Michael,

Dann wäre jetzt die Zeit gekommen, eine Bugbeschreibung zusammen zu
stellen. Denn offensichtlich tut es ja der Treiber nicht korrekt, den LO
mitliefert. Kannst Du eine Beispieldatenbank mit einer entsprechenden
Abfrage zusammenbauen, die bei Kontakt über JDBC das Bild aus einer
Abfrage heraus mit zusammengestelltem Pfad anzeigt, dies aber mit dem
direkten Treiber nicht tut?

Habe den Bug anhand Deiner Beschreibung mit entwas anderer Formulierung
hier gemeldet:
https://bugs.documentfoundation.org/show_bug.cgi?id=124530

Es scheint wirklich so zu sein, dass der native Treiber für PostgreSQL
nicht das leistet, was der JDBC-Treiber locker hin bekommt. Das mit der
fehlenden Funktionalität für die Erstellung von Ansichten über die
Base-GUI ist schon ein starkes Stück.
Auch das habe ich hier gemeldet:
https://bugs.documentfoundation.org/show_bug.cgi?id=124531

Gruß

Robert