BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

(gelöst) Makros in externem Formular laufen nicht

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
PeterF
Beiträge: 28
Registriert: Mi 15. Aug 2018, 09:30

(gelöst) Makros in externem Formular laufen nicht

Beitrag von PeterF » Fr 21. Sep 2018, 11:54

Hallo Leute,

habe diesmal eine Frage bezüglich eines externen Formulars:

Trotz mittlerem Sicherheitslevel und definierter "Vertrauenswürdiger Quellen" wollen die Makros in einem Formular (externes Writerdokument im selben Ordner wie DB) nicht anspringen, obwohl ich die Makros aus der DB in das Formular kopiert habe.
Das Formular wird über folgendes Makro geöffnet:

Code: Alles auswählen

Sub Formular_aufrufen(sFormularName,scaller)
	msgBox sFormularName
	Dim oDoc As Object, sURL As String, Arg()
	sURL = ConvertToURL("/home/peter/bin/" &sFormularName &".odt")
	msgBox sURL
	oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Arg())
	oForm = thisComponent.drawpage.forms.getByName("MainForm")
	wait(1000)
	oForm.getByName("txtTELEFON").Text = scaller
End Sub
Beim direkten Öffnen des Formulars läuft es, wie gewünscht. Nur beim Öffnen mithilfe dieses Makros eben nicht.

Vielen Dank für Eure Vorschläge

Gruß aus Sachsen
Peter
Zuletzt geändert von PeterF am Fr 21. Sep 2018, 21:50, insgesamt 1-mal geändert.

F3K Total
Beiträge: 2409
Registriert: So 10. Apr 2011, 10:10

Re: Makros in externem Formular laufen nicht

Beitrag von F3K Total » Fr 21. Sep 2018, 16:12

Moin, ungeprüft, versuche mal dieses:

Code: Alles auswählen

Sub Formular_aufrufen(sFormularName,scaller)
        dim Arg(0) as new com.sun.star.beans.PropertyValue
        Arg(0).Name = "MacroExecutionMode"
        Arg(0).Value = 4
	msgBox sFormularName
	Dim oDoc As Object, sURL As String, Arg()
	sURL = ConvertToURL("/home/peter/bin/" &sFormularName &".odt")
	msgBox sURL
	oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Arg())
	oForm = thisComponent.drawpage.forms.getByName("MainForm")
	wait(1000)
	oForm.getByName("txtTELEFON").Text = scaller
End Sub
Man muss das Ausführen von Makros auch zulassen ...
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

PeterF
Beiträge: 28
Registriert: Mi 15. Aug 2018, 09:30

Re: Makros in externem Formular laufen nicht

Beitrag von PeterF » Fr 21. Sep 2018, 16:28

Hallo R,

Volltreffer!!!
Danke.

Übrigens, was denkst Du über den Ort von Formularen? Ist in der DB besser als extern?
Ich hab mich für extern entschieden, da in meinem Fall der Aufruf des Formulars in der DB aus einem Makro mich ständig mit Fehlermeldungen beglückt hat - trotz Definition aller nötigen 4 Argumente (arg(0).Name="openMode", ...Value="open", arg(1).Name="ActiveConnection", ...Value=oVerb).
Ich glaub der Parameter parent war das Problem (oDBDoc = thisComponent.parent) - funktioniert aus einem Makro nicht!

Gruß
Peter

F3K Total
Beiträge: 2409
Registriert: So 10. Apr 2011, 10:10

Re: Makros in externem Formular laufen nicht

Beitrag von F3K Total » Fr 21. Sep 2018, 18:13

Hi,
wusstest du, dass man auf das Datenbankdokument mit

Code: Alles auswählen

oDBDoc = thisDatabaseDocument
zugreifen kann?
Da gibt es dann

Code: Alles auswählen

oFormDocuments = thisDatabaseDocument.FormDocuments
oReportDocuments = thisDatabaseDocument.ReportDocuments
Die man dann z.B. so öffnen kann:

Code: Alles auswählen

Thisdatabasedocument.FormDocuments.getByName("F_Adressen").open
Allerdings ist es bei einem Neustart der .odb-Datei, wenn man keine Tabelle, Bericht oder Formular händisch geöffnet hat, erstmal erforderlich die Datenbank zu verbinden.
Dies geht durch einmaliges Ausführen dieses Makros:

Code: Alles auswählen

sub Start_DB
    oController = Thisdatabasedocument.CurrentController
    if not oController.isconnected then oController.connect
end sub
HTH Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

PeterF
Beiträge: 28
Registriert: Mi 15. Aug 2018, 09:30

Re: Makros in externem Formular laufen nicht

Beitrag von PeterF » Fr 21. Sep 2018, 20:04

Danke R,
ich glaub, ich muss weiter ausholen. Die "thisDataBaseDocument.CurrentController" - Befehle laufen ins leere, da mein Start in der KDE-Konsole beginnt.
In dem Beitrag viewtopic.php?f=10&t=19357 hatte ich nach einer Lösung gesucht, aus LO die Caller-ID eines (z.Bsp. FritzBox) Anrufes aufzufangen und in Base in einer von mir schon vorbereiteten DB weiterzuverarbeiten.
Da es keine LO-interne Lösung gibt, verwende ich den JAnrufmonitor, der mit einer Erweiterung den Befehl "/home/peter/bin/demo.sh %callernumber%" an das Skript "demo.sh" übergibt, welches so aussieht:

Code: Alles auswählen

#!/bin/bash
Dim scall as string
scall=$1
soffice "macro:///Standard.Module1.Test_Anruf($scall)"
exit
Im Skript wird nun das Makro Test_Anruf aufgerufen und die Variable scall übergeben.
Das Makro sieht so aus:

Code: Alles auswählen

Sub Test_Anruf(scall)
	scaller = "012303-123457"		'Test-Telefonnummer
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	oDatenquelle = Databasecontext.getByName("LaBella_Datenbank-test2")		'Registrierte DB
	oDatVerb = oDatenquelle.getConnection("","")
	oStatement = oDatVerb.createStatement()
	sSQL = "SELECT * FROM ""Kunden_Test"" WHERE (""TELEFON"" =" &"'" &scaller &"' OR ""TELEFON2"" =" &"'" &scaller &"')"
	oErgSet = oStatement.executeQuery(sSQL)
	oErgSet.Next
	lSize = oErgSet.getRow()
	If lSize = 0 Then 
		msgBox "Neue Telefonnumer: " &scaller
		sFormularName = "Kundeneingabe"
		Formular_aufrufen(sFormularName,scaller)
	Else
		msgBox oErgSet.getString(1) &CHR(13) & oErgSet.getString(4) & oErgSet.getString(2) &" "& oErgSet.getString(3) &CHR(13) _
		& oErgSet.getString(5) &" "& oErgSet.getString(6) &CHR(13) & oErgSet.getString(9) &" "& oErgSet.getString(8) _
		&CHR(13) &"Gemeinde: " & oErgSet.getString(7)
	End If
End Sub
Die Variable scall wird nun mit den Einträgen in meiner DB "LaBella_Datenbank-test2" verglichen und zeigt bei vorhandener Telefonnummer den Kunden mit seiner Adresse in einer Messagebox an.
Die von mir eingeführte Variable scaller ersetzt hier scall, sonst hätte ich mich ständig selbst anrufen müssen, um das Makro zu prüfen.
Falls das verwendete ResultSet leer ist (kein Match in der DB), wird das Formular "Kundeneingabe" geöffnet und die von JAnrufmonitor übergebene Telefonnummer in das Feld "TELEFON" eingetragen.
Das dazu benötigte Makro "Formular_aufrufen" steht oben in der von Dir empfohlenen Version, die auch funktioniert.

Also jeder Versuch mit "CurrentController" oder "thisComponent.parent" führte zu einer Objekt-Fehlermeldung, da ich mich außerhalb einer DB oder eines Dokumentes befand.

Gruß Peter

F3K Total
Beiträge: 2409
Registriert: So 10. Apr 2011, 10:10

Re: (gelöst) Makros in externem Formular laufen nicht

Beitrag von F3K Total » Sa 22. Sep 2018, 12:08

Moin,
ist doch Klasse wenn alles so funktioniert, wie du es brauchst.
Ja, ich arbeite meistens mit Formularen innerhalb der .odb, weil ich dann alles zusammen habe, es leichter zu transferieren ist, keine angemeldete Datenquelle benötige. DIes ginge in deinem Fall dann, wenn du die .odb wenigstens im Hintergrung laden würdest.
Beispiel:

Code: Alles auswählen

Global oDB_Adressen
sub open_internal_Form
    DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
    oDatenquelle = Databasecontext.getByName("Adressen_FAQ")
    oDatVerb = oDatenquelle.getConnection("","")
    dim Arg(1) as new com.sun.star.beans.PropertyValue
    Arg(0).Name = "Hidden"
    Arg(0).Value = true   
    Arg(1).Name = "MacroExecutionMode"
    Arg(1).Value = 4
    oUrl = ConvertToURL("C:\Users\Rik\Desktop\Adressen_FAQ.odb")
    oDB_Adressen = StarDesktop.loadComponentFromURL(oUrl,"_blank", 0, Arg)
    oController = oDB_Adressen.currentcontroller
    if not oController.isconnected then oController.connect
    oFAdressen = oDB_Adressen.FormDocuments.getByName("F_Adressen").open' Formular aus der .odb öffen
end sub
Nicht vergessen die versteckte Datenbank wieder zu schließen, sonst sind Eingaben womöglich futsch. Aus dem Formular:

Code: Alles auswählen

sub Close_ODB_from_internal_Form
    oDB_Adressen.Datasource.flush' Sicherstellen dass Änderungen auch auch Platte gespeichert werden
    oDB_Adressen.close -1'Datenbank schliessen
    Stardesktop.terminate'OpenOffice komplett beenden
end sub
Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

PeterF
Beiträge: 28
Registriert: Mi 15. Aug 2018, 09:30

Re: (gelöst) Makros in externem Formular laufen nicht

Beitrag von PeterF » Sa 22. Sep 2018, 14:11

Hi Rik,

Also Deinen Vorschlag mit dem internen Speicherort der Formulare halte ich auch für praktikabler als den externen. Ich hab es bis jetzt nur nicht zum Laufen bekommen. Ah - Deine Idee hat auch hier funktioniert. Großartig. Vielen Dank

Ich bin mal Deinem MiniKasse-Link gefolgt, und sehe, dass Du was ähnliches programmiert hast, was ich gerade versuche.
Meine POS-ähnliche Lösung setzt auf einen sich erweiternden Stammkunden-Kreis einer kleineren Firma im Lebensmittel-Servicebereich (wie .Bsp. eine Pizzeria). Deshalb brauche ich die oben erwähnte Caller-ID Erkennung, um in Sekundenschnelle nötige Infos über den Besteller zu bekommen.
Ich bin z.Zt. Auslieferungsfahrer - kenne somit, was man in der Stunde der Not braucht. Wir haben zwar eine Software-Lösung eines dieser namhaften Online-Services, doch die wird sehr schlecht gepflegt.
Das fängt schon damit an, dass man zur Adresseingabe des Kunden unmögliche PLZ-Ort Kombinationen aussuchen muss, die Insiderwissen der zugrundeliegenden DB braucht (Trial und Error).
Da lag es nahe, es einmal selbst zu versuchen. Ich bin auch ein Fan von Open-Source Software. Mit Linux (Ubuntu) habe ich mich schon seit ca 20 Jahren beschäftigt.
Ich muss zugeben, ohne dieses Forum wäre ich noch nicht soweit gekommen - trotz 6 Fachbücher und einen Dipl.-Ing..
Deshalb an dieser Stelle nochmal ein großes Lob an alle, die hier aktiv beteiligt sind und deren Unterstützer im Hintergrund.
Ich glaube, dass wir somit einen wichtigen Teil der Zukunft gestalten!

Gruß Peter

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten