Von Base-Formular einen Calc-Dialog öffnen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Sali zäme

Situation
Ich will von einem Formular aus Base per Button folgendes Makro starten.

Code: Alles auswählen

Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
GlobalScope.DialogLibraries.LoadLibrary( "Standard" )
Dlg = CreateUnoDialog( GlobalScope.DialogLibraries( "dOffertenerstellen"  )
Dlg.execute()
End Sub
Der Dialog ist im Dokument "nur Dave Offertenvorlage1.ods" abgespeichert und heisst "dOffertenerstellen".

Bei der Codezeile: Dlg.execute() kommt die Fehlermeldung BASIC-Laufzeitfehler. Objektvariable nicht belegt.
Das Calc-Dokument wird zwar geöffnet aber der Dialog nicht und die Makros darin funktionieren nicht.

Weiss da wer Rat?

Gruss Dave
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von F3K Total »

Hi Dave,

mit der Zeile

Code: Alles auswählen

GlobalScope.DialogLibraries.LoadLibrary( "Standard" )
lädst Du die Standard Dialog Library unter Meine Makros&Dialoge
Willst Du die Library im gerade geöffneten Dokument laden, geht das z.B. so.

Code: Alles auswählen

Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
Doc.DialogLibraries.LoadLibrary("Standard")
oForm = Doc.DialogLibraries.Standard.dOffertenerstellen
Dlg = CreateUnoDialog(oForm)
Dlg.execute()
End Sub
Gruß R
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Hi R

Vielen Dank, ich habe so viele Varianten hier im Forum gefunden und ausprobiert und alle hatten versagt.

Nun passts und ich kann weiter tüffteln ;)

Gruss Dave
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

So, nachdem ich nun den Code erweitert habe damit er mir auch gleich Texte von den Feldern aus dem Formular in den Dialog einträgt ( was funktioniert ;)) ist nun das Problem, dass die Buttons auf dem Dialog nicht funktionieren.

Ums besser zu erklären:
Auf dem Dialog sind mehrere Buttons die den Dialog schliessen und mich direkt auf ein bestimmtes Sheet bringen und dort die Werte eintragen.
z.B.

Code: Alles auswählen

Sub DialogCloseLieferschein
dlg.endExecute()
Dim oController as Object
Dim oResults as Object
Dim oDoc as Object
oDoc = thisComponent
oController = oDoc.getCurrentController()     
oResults = oDoc.Sheets().getByIndex(50)
oController.setActiveSheet(oResults)
end Sub
Bisher hat der Code einwandfrei funktioniert aber nun bekomme ich bei dlg.endExecute() die Fehlermeldung BASIC-Laufzeitfehler. Objektvariable nicht belegt. Wobei dlg global als Object definiert ist.

Code: Alles auswählen

Sub DialogCloseLieferschein
Dim dlg As Object
dlg.endExecute()
Dim oController as Object
Dim oResults as Object
Dim oDoc as Object
oDoc = thisComponent
oController = oDoc.getCurrentController()     
oResults = oDoc.Sheets().getByIndex(50)
oController.setActiveSheet(oResults)
end Sub
Bei diesem Code das selbe

Code: Alles auswählen

Sub DialogCloseLieferschein
Dim dlg As Object
DialogLibraries.LoadLibrary( "Standard" )
dlg = CreateUnoDialog( DialogLibraries.Standard.dOffertenerstellen )
dlg.endExecute()
Dim oController as Object
Dim oResults as Object
Dim oDoc as Object
oDoc = thisComponent
oController = oDoc.getCurrentController()     
oResults = oDoc.Sheets().getByIndex(50)
oController.setActiveSheet(oResults)
end Sub
und bei diesem Code wechselt zwar das Sheet, aber der Dialog bleibt offen und die Werte aus dem Dialog werden nicht im Sheet übernommen.

Ich nehme an das liegt daran das ich den Dialog ein zweites mal geladen habe.

Wie kann ich das aber umgehen?
Muss ich denn bei:

Code: Alles auswählen

Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
Doc.DialogLibraries.LoadLibrary("Standard")
oForm = Doc.DialogLibraries.Standard.dOffertenerstellen
Dlg = CreateUnoDialog(oForm)
Dlg.execute()
End Sub
noch

Code: Alles auswählen

Doc.BasicLibraries.LoadLibrary("Standard")
einbauen?
Dies hab ich nämlich versucht aber nicht hinbekommen

So langsam wirds komplizierter :(
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von DPunch »

Servus
wellmo hat geschrieben:So langsam wirds komplizierter
Eigentlich ist das nicht wirklich kompliziert.
Selbst wenn Du "dlg" global als Objekt deklariert hast, durch

Code: Alles auswählen

Sub DialogCloseLieferschein
Dim dlg As Object '########## <--------------------
dlg.endExecute()
überschreibst Du die globale Variable dlg durch eine lokale, nur für die Laufzeit der Prozedur gültige, neue, leere Variable dlg.
Schmeiss die erneute Deklaration von dlg aus allen Prozeduren raus.
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Hallo DPunch

Ich muss dich und mich leider enttäuschen.

egal ob mit oder ohne dlg, der Fehler kommt leider.

Edit:
Liegt es nicht daran das die Basic.lib beim laden des Dialoges nicht mitgeladen wird?
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von DPunch »

Servus
wellmo hat geschrieben:egal ob mit oder ohne dlg, der Fehler kommt leider.
Wenn der Dialog geladen und angezeigt wird, ist die Meldung nur durch einen Fehler Deinerseits erklärbar.
Ohne den kompletten Quellcode bleibt jeder Hilfeversuch dabei allerdings ein Stochern im Dunkeln.
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von Frieder D. »

Hallo wellmo,

du könntest versuchen, beim Laden des Dokuments,
den Makro-Ausführungsmodus auf "Ausführen ohne nachzufragen"(=4) zu setzen .

Code: Alles auswählen

Dim myProp(0) as new com.sun.star.beans.PropertyValue
  myProp(0).name="MacroExecutionMode"
  myProp(0).value = 4	
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, myProp())
Des weiteren kannst du natürlich auch die Dokumenten-Bibliotheken laden:

Code: Alles auswählen

Doc.BasicLibraries.loadLibrary("Name der Bibliothek im Dokument")
Das könnte allerdings zu Problemen führen, falls du Subs- oder Funktionen im ods-Dokument hast,
deren Name Identisch mit Namen von Subs- oder Funktionen in der Base-Bibliothek sind.

Gruß
Frieder
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Hallo

@DPunch
DPunch hat geschrieben:

Wenn der Dialog geladen und angezeigt wird, ist die Meldung nur durch einen Fehler Deinerseits erklärbar.
Davon gehe ich aus.
Die ganzen Quellcodes sind gross, zumindest denk ich das. Leider hab ich auch erst am Dienstag wieder zugriff drauf.

@Frieder D.
Frieder D. hat geschrieben: Des weiteren kannst du natürlich auch die Dokumenten-Bibliotheken laden:

Code: Alles auswählen

Doc.BasicLibraries.loadLibrary("Name der Bibliothek im Dokument")
dies hab ich folgendermassen gemacht:

Code: Alles auswählen

Sub Dokuerstellen
Dim Dlg as Object
Dim Doc As Object
Dim Url As String
Dim Dummy()
Url = "file:///C:/Users/Dave/Desktop/nur Dave Offertenvorlage1.ods"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
Doc.BasicLibraries.loadLibrary("Standard")
Doc.DialogLibraries.LoadLibrary("Standard")
oForm = Doc.DialogLibraries.Standard.dOffertenerstellen
Dlg = CreateUnoDialog(oForm)
Dlg.execute()
End Sub
dies bringt aber die gleiche Fehlermeldung.

Was bewirkt dein Vorschlag
Frieder D. hat geschrieben: du könntest versuchen, beim Laden des Dokuments,
den Makro-Ausführungsmodus auf "Ausführen ohne nachzufragen"(=4) zu setzen .
Wie erwähnt kann ich es leider erst am Dienstag ausprobieren.
Dabei werd ich auch mal testen was passiert wenn ich die Sub "CloseDialogLieferschein" mal zusätzlich in die Basic.Lib des Basedokuments schreibe.

Auf jedenfall Danke für die Hilfestellungen und ich werd mich am Dienstag mit weiteren Infos wieder melden.

Gruss Dave
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von DPunch »

Servus
wellmo hat geschrieben:dies hab ich folgendermassen gemacht:
(...)
dies bringt aber die gleiche Fehlermeldung.
Kein Wunder.
Da Du auch in diesem Fall mit

Code: Alles auswählen

Dim Dlg as Object
eine lokale Variable für den Dialog erzeugst, kannst Du ihn aus keiner anderen Prozedur heraus ansprechen - jeder Versuch würde in der Fehlermeldung "Objektvariable nicht belegt" enden...
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Hallo DPunch
DPunch hat geschrieben:Servus

Ohne den kompletten Quellcode bleibt jeder Hilfeversuch dabei allerdings ein Stochern im Dunkeln.
Damit Ihr nicht mehr im Dunkeln stochern müsst habe ich mal beide Dateien hochgeladen.

Bitte nicht erschrecken ab den Code, ich hab ja schon diverse Möglichkeiten genannt bekommen um gewisse Codezeilen zu kürzen, habs aber noch nicht gemacht.
Die Offertenvorlage1 funktioniert alleine einwandfrei, nur wenn ich es über das Baseformular starte nicht.

PS: Die paar Namen in der DB sind frei erfunden
Dateianhänge
wellmo nur Dave.odb
(31.86 KiB) 59-mal heruntergeladen
nur Dave Offertenvorlage1.ods
(104.74 KiB) 84-mal heruntergeladen
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von F3K Total »

Hi, es ist schwer durchzusteigen,
Es liegt meiner Meinung nach daran, das Du den Dialog dlg aus einem in Base gestarteten Makro öffnest, dann ist er dem Calc-Dokument wohl unbekannt.
Willst Du dlg in zwei Dokumenten verwenden, geht das als globale Variable in der Application-Bibliothek meine Makros/Standard.

Code: Alles auswählen

global dlg as Object

Ausserdem hast Du dlg noch zweimal innerhalb einer Sub definiert, und zwar in OfferteBau und OfferteSauna.
Auch odialog solltest Du wie folgt definieren:

Code: Alles auswählen

global odialog as Object
, dass geht wiederum im Calc Dokument, weil das Makro, was odiaolg geöffnet hat hier definiert ist.

Gruß R
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Wow, du bist durch meine Codes durchgestiegen :)

Vielen Dank für deine Vorschläge, ich werde die Codes morgen ändern und Meldung erstatten.

Gruss Dave
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

Guete Morgä mitenand

Leider hat's nichts genutzt dlg global in der Application-Bibliothek meine Makros/Standard zu definieren, hab auch alle Dokumente geschlossen und neu geöffnet damit sicher alles richtig geladen wird.

hat sonst noch jemand Lösungsvorschläge?

Edit: Ups, es funktioniert doch, ich muss natürlich auch die dlg-Definition in der Base-Bibliothek rausnehmen damit die globale benutzt wird :)
Der Dialog schliesst nun und wechselt auf das gewünschte Sheet. Aber die Werte werden nicht in das Sheet übertragen.

Gruss Dave
wellmo
**
Beiträge: 32
Registriert: Di, 13.12.2011 19:21

Re: Von Base-Formular einen Calc-Dialog öffnen

Beitrag von wellmo »

UPDATE

Ich habe nun viel versucht und rumgetüfftelt.
Ich habs nun soweit das auch die Werte des Dialogs ins Sheet eingetragen werden, dazu musste ich allerdings alle Abfrage-Routinen in die Base-Bibliothek schreiben, die Variablen anpassen etc.
Allerdings hab ich auf den Sheets auch Buttons zum Speichern ( auf die Festplatte und einen Link in die Datenbank) und Drucken des jeweiligen Sheets.
Diese Buttons funktionieren nun allerdings auch nicht mehr. Ich werde wohl nicht drumherum kommen, diese auch in die Base-Bibliothek zu schreiben und anzupassen.
Ich hoffe allerdings, es gibt da noch einen anderen weg, weil mich graust es schon wenn ich den "Jacuzzi-Dialog" samt allem Code zum Abfragen und einfügen auch umschreiben muss.
Antworten