Seite 1 von 1

Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: Sa 7. Jan 2023, 17:34
von caldir65
Hallo,

ich habe eine SQL-Datenbank auf meinem Server, die ich über Base von einem PC bearbeite mit LO 7.3.7.2 unter Kubuntu 22.10.
Das dafür erstellte Formular funktioniert auch wunderbar, auch Bilder und PDF-Dokumente bekomme ich verlinkt mit Vorschau. Für die PDF-Dokumente habe ich zusätzlich einen Button gemacht bzw. aus der Beispieldatenbank übernommen, welcher via Makro das PDF-Dokument in einem auf dem PC installierten Programm anzeigen soll. Das Makro habe ich meinen Gegebenheiten angepasst (Formular- und Feldnamen).

Wenn ich jetzt bei einem Formular mit einem PDF-Dokument den Button anklicke (angelegt mit Aktion ausführen: Standard.Module1.DateiAuslesen_mitName (document, Basic)), kommt folgende Meldung:

Code: Alles auswählen

BASIC-Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: Text.
Diese Makros habe ich übernommen:

Code: Alles auswählen

REM  *****  BASIC  *****

SUB Betrachten
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oFeld AS OBJECT
	DIM oShell AS OBJECT
	DIM stUrl AS STRING
	DIM stFeld AS STRING
	DIM arUrl_Start()
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	REM Lage des Feldes in dem entsprechenden Formular aufsuchen
	oForm = oDrawpage.Forms.getByName("HausratMain")
	oFeld = oForm.getByName("GraphischesFeld")
	stUrl = oFeld.BoundField.getString
	REM Start des Files mit der entsprechenden URL-Verbindung
	arUrl_Start = split(oDoc.Parent.Url,oDoc.Parent.Title)
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	stFeld = convertToUrl(arUrl_Start(0) + stUrl)
	oShell.execute(stFeld,,0)
END SUB

SUB DateiAuslesen
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oFeld AS OBJECT
	DIM oStream AS OBJECT
	DIM oShell AS OBJECT
	DIM oPath AS OBJECT
	DIM oSimpleFileAccess AS OBJECT
	DIM st AS STRING
	DIM stPfad AS STRING
	DIM stFeld AS STRING
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	REM Lage des Feldes in dem entsprechenden Formular aufsuchen
	oForm = oDrawpage.Forms.getByName("HausratMain")
	oFeld = oForm.getByName("Betrachten")
	oStream = oFeld.BoundField.getBinaryStream
	oPath = createUnoService("com.sun.star.util.PathSettings")
	st = ""	'Je nach System könnte eine Endung der Datei notwendig sein
	stPfad = oPath.Temp & "/DbDatei" & st
	oSimpleFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")
	oSimpleFileAccess.writeFile(stPfad, oStream)
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	stFeld = convertToUrl(stPfad)
	oShell.execute(stFeld,,0)	
END SUB

SUB DateiAuslesen_mitName
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oFeld AS OBJECT
	DIM oFeld2 AS OBJECT
	DIM oStream AS OBJECT
	DIM oShell AS OBJECT
	DIM oPath AS OBJECT
	DIM oSimpleFileAccess AS OBJECT
	DIM stName AS STRING
	DIM stPfad AS STRING
	DIM stFeld AS STRING
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	REM Lage des Feldes in dem entsprechenden Formular aufsuchen
	oForm = oDrawpage.Forms.getByName("HausratMain")
	oFeld = oForm.getByName("Betrachten")
	oFeld2 = oForm.getByName("rechnung")
	stName = oFeld2.Text
	IF stName = "" THEN
		stName = "DbDatei"
	END IF
	oStream = oFeld.BoundField.getBinaryStream
	oPath = createUnoService("com.sun.star.util.PathSettings")
	stPfad = oPath.Temp & "/" & stName
	oSimpleFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")
	oSimpleFileAccess.writeFile(stPfad, oStream)
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	stFeld = convertToUrl(stPfad)
	oShell.execute(stFeld,,0)
END SUB

SUB DateiName	
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oField AS OBJECT
	DIM stImageUrl AS STRING
	DIM stFile AS STRING
	GlobalScope.BasicLibraries.LoadLibrary("Tools")
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	oForm = oDrawpage.Forms.getByName("HausratMain")
	oField = oForm.getByName("Betrachten")
	stImageUrl = oField.ImageUrl
	IF stImageUrl <> "" THEN
		stFile = FileNameoutofPath(stImageUrl)
		oForm.UpdateString(oForm.FindColumn("DateiName"), stFile)
	END IF
END SUB
Was läuft da noch falsch?

Danke für die Hilfe.

Gruß, CHristoph

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: Sa 7. Jan 2023, 19:19
von Wanderer
Der Fehlermeldung nach scheint das Objekt "rechnung" auf dem Formular keine Methode "Text" zu haben.

Erster Schritt also: Was ist das fur ein Feld und mit welcher Spalte der Datenbank ist es verknüpft, welchen Typ hat die Spalte in der Datenbank.

? Bilder und PDF sind extern gespeichert (Datenbank enthält Dateinamen) oder intern als BLOB?

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: Sa 7. Jan 2023, 19:57
von caldir65
Das Tabellenfeld in der DB ist vom Typ "Text (varchar)", bei dem Feld im Formular habe ich ein "grafisches Steuerelement" angelegt, welches mit dem Tabellenfeld rechnung verknüpft ist.

In der Tabelle werden nur die Pfade und Dateinamen zu den Dateien abgelegt, die Dateien selber liegen in Unterverzeichnissen der LO-DB

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: So 8. Jan 2023, 12:27
von RobertG
Du hast da ein Grafisches Steuerelement. Das hat die Eigenschaft "Text" wohl nicht. Nimm doch einfach "CurrentValue".

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: So 8. Jan 2023, 12:56
von caldir65
Hallo Robert,

wie meinst DU das mit "einfach CurrentValue nehmen"? Ich bin jetzt nicht soo bewandert (stehe noch ziemlich am Anfang) mit LibeBase und insb. Makros.

Gruß, Christoph

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: So 8. Jan 2023, 14:48
von RobertG
Hallo Christoph,

Du willst mit

Code: Alles auswählen

oFeld2 = oForm.getByName("rechnung")
stName = oFeld2.Text
den angezeigten Text von einem Feld auslesen. Sehe ich aber Deinen Screenshot, dann handelt es sich bei dem Formularfeld nicht um ein Textfeld sondern um ein grafisches Kontrollfeld zur Anzeige von Bildern usw.
Also:

Code: Alles auswählen

stName = oFeld2.CurrentValue
sofern es sich tatsächlich um einen Text handelt klappt das. In der ersten Prozedur steht ein Weg, wie so eine URL aus dem Kontrollfeld auch ausgelesen werden kann:

Code: Alles auswählen

oFeld = oForm.getByName("GraphischesFeld")
stUrl = oFeld.BoundField.getString
Der Text steht also nicht sichtbar auf der Benutzeroberfläche, wohl aber in dem mit dem Formular verbundenen Tabelle. Deswegen kann aus dem verbundenen Feld (BoundField) der Text ausgelesen werden. Das ist bei einem grafischen Kontrollfeld dann gleichbedeutend mit einer URL. Bei Dir wird dann daraus:

Code: Alles auswählen

oFeld2 = oForm.getByName("rechnung")
stName = oFeld2.BoundField.getString
Nur bezweifele ich, dass bei Dir überhaupt Text in dem Feld steht, denn Du nutzt ja ein Makro, das dazu dient, ein Bild aus der Tabelle aus zu lesen, und nicht ein Bild anzuzeigen, das irgendwo in einem Pfad liegt.

Gruß

Robert

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: So 8. Jan 2023, 16:58
von caldir65
Hallo Robert,

mit Deiner Bemerkung "... in der ersten Prozedur ..." hast Du mich auf die Lösung gebracht - es sollte immer die falsche Prozedur aufgerufen werden - ich habe mich von der Namensgebung verleiten lassen, für mich war die Prozedur "DateiAuslesen_mitName" erstmal die Wahl - dabei hätte ich einfach nur die Prozedur "Betrachten" aufrufen müssen, damit es funktioniert.

Danke, so funktioniert es jetzt.

Gruß, Christoph

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: Di 10. Jan 2023, 21:15
von caldir65
Moin,

wie müsste ich das denn jetzt ausgestalten, wenn ich jetzt den Button bzw. das Makro den Inhalt eines Feldes in einem Unterformular abrufen lasse - also Formular "HausratMain", Unter-Formular "Abfrage-Anzeige", Grafisches Steuerelement "Rechnung" (statt Formular "HausratMain", Steuerelement "Rechnung")

Code: Alles auswählen

SUB Betrachten
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oFeld AS OBJECT
	DIM oShell AS OBJECT
	DIM stUrl AS STRING
	DIM stFeld AS STRING
	DIM arUrl_Start()
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	REM Lage des Feldes in dem entsprechenden Formular aufsuchen
	oForm = oDrawpage.Forms.getByName("Abfrage-Anzeige")
	oFeld = oForm.getByName("Rechnung")
	stUrl = oFeld.BoundField.getString
	REM Start des Files mit der entsprechenden URL-Verbindung
	arUrl_Start = split(oDoc.Parent.Url,oDoc.Parent.Title)
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	stFeld = convertToUrl(arUrl_Start(0) + stUrl)
	oShell.execute(stFeld,,0)
END SUB{/code]
Dieses Makro funktioniert, wenn das abgefragte Feld im Hauptformular liegt, ich hätte es aber gerne im Unterformular ...

Gruß, Christoph

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: Di 10. Jan 2023, 21:29
von RobertG
Mach' das mit dem auslösenden Ereignis. Der Button muss dann nur in dem entsprechenden Formular liegen. Der Name des Formulars spielt keine Rolle. Dann musst Du nicht lange nach dem Formular suchen:

Code: Alles auswählen

SUB Betrachten(oEvent AS OBJECT)
	DIM oForm AS OBJECT
	DIM oFeld AS OBJECT
	DIM oShell AS OBJECT
	DIM stUrl AS STRING
	DIM stFeld AS STRING
	DIM arUrl_Start()
	REM Lage des Feldes in dem entsprechenden Formular aufsuchen
	oForm = oEvent.Source.Model.Parent
	oFeld = oForm.getByName("Rechnung")
	stUrl = oFeld.BoundField.getString
	REM Start des Files mit der entsprechenden URL-Verbindung
	arUrl_Start = split(oDoc.Parent.Url,oDoc.Parent.Title)
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	stFeld = convertToUrl(arUrl_Start(0) + stUrl)
	oShell.execute(stFeld,,0)
END SUB{/code]
Diesen schnelleren Zugriff kannte ich am Anfang noch nicht. Inzwischen arbeite ich sehr häufig mit dem auslösenden Ereignis.

Gruß

Robert

Re: Base-Formular und MariaDB: Fehler statt PDF-Anzeige in externem Prog

Verfasst: Mi 11. Jan 2023, 08:10
von caldir65
Moin Robert,

vielen Dank, das funktioniert!

Gruß, Christoph