Makro zum öffnen einer Datei

Nur um diesen Namen geht es. Liegt denn in diesem Formular das Feld “fn_Name”? Der Name muss dann im Formularnavigator direkt unterhalb des Formulars “Art” liegen.

Ich vermisse den Screenshot, aus dem ich die Namen im Formularnavigator ersehen kann.

@RobertG


Kräuter_Indikationen.odb (257.8 KB)

Da sind gleich mehrere Haken drin: Bei dem Formular handelt es sich um ein Unterformular.

In dem Unterformular liegt das Feld, das Du auslesen willst in einem Listenfeld innerhalb eines Kontrollfeldes. Von dem Listenfeld willst Du außerdem nicht den Wert, sondern den angzeigten Inhalt auslesen. Und wie Du mit dem angezeigten Inhalt zu einem lesbaren Link kommen willst erschließt sich mir auch nicht.

Das Formular könntest Du über

oDrawpage.Forms.getByName("Art").getByName("intArt")

oder auch über den auslösenden Button ermitteln.
Das Feld kommst Du eventuell über

oFeld = oForm.getByName("Tabellensteuerelement 1").getByName("fn_Name")

Aber weiter komme ich damit auch nicht, weil Du ein Tabellenkontrollelement mit lauter Listenfeldern voll gepackt hast, die alle mit dem gleichen Fremdschlüsselfeld verbunden sind.

Warum machst Du nicht eine Abfrage, auf der dieses Unterformular basiert - ganz ohne Listenfelder?

Meine Güte, Du kannst doch eh nicht programmieren. Nimm doch einfach mein Makro, das hundertfach bewährt ist und mit jedem Element in jedem Ober- oder Unterformular einfach so funktioniert. Es funktioniert sogar in Basic, obwohl das schwieriger zu installieren ist, weshalb ich das in Python verbreite.
Der Code ist bis auf die Basic-Syntax identisch:

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

Sub URLButton_Approve(oEv)
    openURL(oEv, False)
End Sub

Sub FileButton_Approve(oEv)
    openURL(oEv, True)
End Sub

Sub openURL(oEv, bConvertToURL)
    oModel = oEv.Source.getModel()
    oModel.ButtonType = com.sun.star.form.FormButtonType.URL
    oForm = oModel.getParent()
    oColumn = oForm.Columns.getByName(oModel.Tag)
    if bConvertToURL then
        sURL = convertToUrl(oColumn.getString())
    else
        sURL = oColumn.getString()
    endif
    oModel.TargetURL = sURL
End Sub

@Villeroy
Das sind ja, soweit ich es sehe 3 Makros - wie binde ich die ein ?
lg

@RobertG

Kurz gesagt: Weil ich nicht wusste, dass das ein Problem darstellt :slight_smile: und nicht daran gedacht habe.

Aber auch wenn ich das auf eine Abfrage statt der Listenfelder “umschnitze” - Ich habe statt dem int_table mit den Listenfeldern eine Abfrage des tbl_Pflanzen mit der Art_Id aus dem int_tbl_Art generiert (Art_Pflanzen) und diese statt dem jetzigen UF eingebunden (heißt jetzt: “ArtPflanzen”) … funktioniert auch :slight_smile: … aber…

oDrawpage.Forms.getByName("ArtPflanzen").getByName("Art_Pflanzen")

… produziert die gleiche Fehlermeldung.

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten 
Type: com.sun.star.container.NoSuchElementException
Message: at ./forms/source/misc/InterfaceContainer.cxx:697.

lg

Eben das ist das Problem: Du versuchst alles Mögliche nach der Methode Trial- and Error. Das wird nie zu einem Erfolg führen. Da Du auch noch gar nicht irgendwo sichtbar einen Link in einer Deiner Tabelle hast weiß ich nicht mehr, was das Ganze soll. Da ist jede Hilfe von mir vergeblich.

@RobertG
Ich hatte das Eingangs des Thread geschrieben. Es liegen Dokumente im selben Verzeichnis wie die Datenbank. Diese haben den Namen der Pflanze und die Endung .odt. Das Makro sollte nun aus dem Namen im Feld den Pflanzennamen auslesen, an diesen Namen ein “.odt” anhängen und es mit dem vom System für .odt vorgesehenen Programm öffnen. (Als Erweiterung evt. wenn es keine Datei mit .odt gibt es mit .doc oder .txt versuchen). Da bräuchte ich eben kein Feld mit einem Link, da der Link eben einer wiederkehrenden Logik unterliegt, nämlich Name + .odt im selben Verzeichnis wie die Datenbank. (Variante: Im Unterverzeichnis “Dokumente” des Datenbankverzeichnisses).

@Villeroy
Hi
Ich habe den Python-Code ins user.Verzeichnis installiert.

Es funktioniert auch, allerdings war das Verbinden mit dem auszulesendem Pfad in Verbindung mit einer Abfrage (q_Completion) und dem Subform mit Textbox doch etwas mehr als “einfach”.

Was ich allerdings nicht checke:
Was machen die Zeilen:

import uno
from com.sun.star.form.FormButtonType import URL

Ich kann nämlich aus dem sonstigem Code der URLBButton.py nicht ersehen, was das/der Makro/Code macht, weill ich da nur Definitionen sehe.

def FileButton_Approve(oEv):
    openURL(oEv, True)

und was bedeutet die Zeile:

g_exportedScripts = URLButton_Approve, FileButton_Approve,

Danke

Lädt die Konstanten LibreOffice: com::sun::star::form Module Reference, so dass oModel.ButtonType = URL einen Sinn ergibt. URL hätte sonst keine Bedeutung.
Du kannst getrost beide Zeilen löschen und die Eigenschaft "Aktion= “Öffne Dokument oder URL” manuell setzten.

Auch die kannnst du getrost löschen. Wenn du diese Zeile löscht, werden im Makrodialog alle Routinen angezeigt, die das Modul enthält, also auch die dritte routine def openURL(oEv, bConvertToURL):, die aber nur indirekt durch die beiden anderen aufgerufen werden kann. Im Unterschied zu Basic, kann man bei Python-Makros nur die Routinen anzeigen lassen, die auch wirklich in den Makro-Dialogen auswählbar sein sollen. Probiere es aus! Lösche die letzte Zeile, weise openURL einer Schaltfläche zu, und beim Draufklicken fängst du eine Fehlermeldung, die besagt, dass die Anzahl der übergebenen Parameter nicht stimmt (“1 given, expected 2” oder so).

Hi
Danke für die Erklärungen … muss mich noch ein bisschen da reindenken …
z.b. was LibreOffice: com::sun::star::form Module Reference eigentlich ist … und wo das liegt.

Eine Frage stellt sich noch. Wie bringe ich das Makro dazu, relative Pfade zu akzeptieren, also …
statt /mnt/SATA1_H/MeinOfficeBasedat/Kräuter_Indikationen_Docs/ eben ./Kräuter_Indikationen_Docs/
Besten Dank
Libels

Für relative Pfade habe ich das zu simpel gestrickt. Du kannst den Pfad einfach in deiner Abfrage festlegen. Datenbanken wechseln ja nicht jeden Tag den Speicherort.
In meiner Beispieldatenbank kann der Pfad in einer Tabelle abgelegt werden. Du kannst den Pfad aber auch einfach in eine Abfrage schreiben.

SELECT *, '/mnt/SATA1_H/MeinOfficeBasedat/' || "Datei" AS "Pfad" FROM "tabelle"

Wählt die ganze Tabelle aus und zusätzlich ein Feld “Pfad” wo der Feldinhalt von “Datei” mit dem fehlenden Pfad verkettet ist.

Das wird dir auf Anhieb nicht gelingen. Du musst entweder programmieren lernen (für LO Base auf einigermaßen hohem Niveau) oder du musst ein paar Leuten vertrauen, dass sie es nicht darauf anlegen, dein System zu ruinieren.

Hi
Ich habe eine Tabelle (Setup) in welcher der Filepath abgelegt wird - so wie in der Beispieldatenbank.
In der downgeloadeten Beispieldatenbank steht da sogar ein relativer Pfad, nämlich “/temp/test/” der aber natürlich nicht funktioniert, weil es das Verzeichnis nicht gibt.
Wenn ich dort einen relativen Pfad eingebe - relativ zum Verzeichnis in dem die Datenbak befindlich ist, kommt eine Fehlermeldung, dass das entweder keine absolute URL ist oder aber die Datei nicht existiert.
Wenn ich den absoluten Pfad in eine Abfrage schreibe habe ich nichts gewonnen - da kann ich ihn ja gleich in die Tabelle “Setup” schreiben - wie eben jetzt. Ich würde das Makro aber gerne dazu bringen den relativen Pfad zum Datenbankverzeichnis zu akzeptieren :sunglasses: :wink:
lg Libels

Du musst den absoluten Pfad nur ein einziges mal in die Tabelle oder in die Abfrage schreiben und dann vielleicht noch mal falls sich der Pfad der Datenbank ändern sollte. Hast du eine Ahnung wie viele Stunden wir schon in dein Projekt investiert haben? Die einzige Lösung für dieses völlig unwichtige Problem wäre ein Makro, das den Pfad des Datenbankdokuments in die Tabelle schreibt oder in die Abfrage. Ich schreibe das nicht. Punkt.

Ja, gut - wollte niemandem die Zeit stehlen oder nerven.
Vielen Dank für die Erklärungen und Hinweise.

Hi
versuch erstmal so```

SUB Link_oeffnen
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM oFeld AS OBJECT
DIM oShell AS OBJECT
DIM stFeld AS STRING
oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm = oDrawpage.getForms.getByName(“frm_Anzeige_Art”)
oFeld = oForm.getByName(“int_tbl_Art.Pflanze”)
stFeld = oFeld.Text

ohne Sternchen natürlich, das sollte eigentlich eine Hervorhebung sein. Hat wohl nicht funktioniert :wink:

jetzt hat es doch noch funktioniert

@getobject.de
Ändert leider nichts.

Hi nochmal,

Also bei funzt es.

wichtig:

  1. Den Button mit der Aktion belegen MAKRO: Link_oeffnen
  2. Das Makro über den Button starten. Nicht manuell über F5 oder sonstiges.
    Im letzteren Fall liest du mit ThisComponent ein anderes Objekt womöglich die IDE
oFeld = oForm.getByName("int_tbl_Art.Pflanze")

Mit dieser Zeile stimmt etwas nicht. Liegt hier noch ein Listenfeld? Oder ist das nun wirklich der Name inklusive Punkt?