[GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben?
Moderator: Moderatoren
[GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben?
Hallo Zusammen,
Mein Aufbau:
Ich habe eine Abfrage mit der Parameterabfrage 'Mitarbeiter' (also an der entsprechenden Stelle in der Abfrage ein Fragezeichen gesetzt). Um diese Abfrage habe ich einen Bericht gebaut, den ich per Makro ausführe. Da kommt die Parameterabfragebox und dann wird das ganze an Thunderbird geleitet - resultierend aus diesem Thread.
Meine Frage:
Ich möchte an Stelle der Parameterabfragebox Werte aus der Datenbank nehmen. Aber wie kann ich diese Werte per Makro in eine Abfrage einbinden, die ja einem fertig formatierten Bericht zugrunde liegt.
Gibt es überhaupt solch eine Möglichkeit?
Vielen Dank schon einmal.
Mein Aufbau:
Ich habe eine Abfrage mit der Parameterabfrage 'Mitarbeiter' (also an der entsprechenden Stelle in der Abfrage ein Fragezeichen gesetzt). Um diese Abfrage habe ich einen Bericht gebaut, den ich per Makro ausführe. Da kommt die Parameterabfragebox und dann wird das ganze an Thunderbird geleitet - resultierend aus diesem Thread.
Meine Frage:
Ich möchte an Stelle der Parameterabfragebox Werte aus der Datenbank nehmen. Aber wie kann ich diese Werte per Makro in eine Abfrage einbinden, die ja einem fertig formatierten Bericht zugrunde liegt.
Gibt es überhaupt solch eine Möglichkeit?
Vielen Dank schon einmal.
Zuletzt geändert von geimist am Mi, 27.03.2013 01:41, insgesamt 3-mal geändert.
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
So etwas habe ich noch nicht gemacht, ich bin mir aber ziemlich sicher, dass es geht.geimist hat geschrieben:Gibt es überhaupt solch eine Möglichkeit?
In deinem Makro rufst du doch einen Bericht ab. Wenn du den als Objekt deklarierst, kannst du ihn mit xray oder mri untersuchen. (Möglicherweise muss er zuerst geöffnet werden, bevor er zur Verfügung steht.) Genauso wie im Berichtsgenerator müsstest du dort unter Bericht > Daten > Filter die entsprechende Einstellung sehen und danach im Makro ändern können. Ich glaube, ich habe so etwas hier auch schon über die Forumssuche gesehen.
Unter Umständen muss die Abfrage geändert werden. Wichtig ist, dass der betreffende Parameter in der Spaltenliste enthalten ist (unabhängig davon, ob diese Spalte im Bericht auftauchen soll oder nicht); dann kann diese Spalte in der WHERE-Klausel und damit im Filter berücksichtigt werden.
Viel Erfolg! (Ich will es auch irgendwann einbauen.) Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Hi, klar gibt es die.
Du kannst Die Abfrage schlicht per Makro definieren.
Ein Beispiel: Angenommen die bereits angelegte Abfrage heißt qExport,
dann kannst Du mit diesem Code das SQL-Kommando neu setzen, wobei das Kommando ein String ist, den du nach belieben aufbauen kannst.
nID ist in diesem Falle ein veränderbarer Wert.
Viel Erfolg
Gruß R
EDIT: Wenn, wie Du schreibst, der Parameter in der Datenbank liegt, benötigst Du gar kein Makro, sondern die passende Abfrage.
Du kannst Die Abfrage schlicht per Makro definieren.
Ein Beispiel: Angenommen die bereits angelegte Abfrage heißt qExport,
dann kannst Du mit diesem Code das SQL-Kommando neu setzen, wobei das Kommando ein String ist, den du nach belieben aufbauen kannst.
Code: Alles auswählen
sub S_Create_Export_Query
nID = 17
oqExport = thisdatabasedocument.DataSource.QueryDefinitions.getbyname("qExport")
oqExport.Command = "SELECT * FROM ""Table1"" WHERE ""ID"" = "& nID
end sub
Viel Erfolg
Gruß R
EDIT: Wenn, wie Du schreibst, der Parameter in der Datenbank liegt, benötigst Du gar kein Makro, sondern die passende Abfrage.
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
F3K Total hat geschrieben:Code: Alles auswählen
sub S_Create_Export_Query nID = 17 oqExport = thisdatabasedocument.DataSource.QueryDefinitions.getbyname("qExport") oqExport.Command = "SELECT * FROM ""Table1"" WHERE ""ID"" = "& nID end sub
Vielen Dank. Dieser Ansatz klingt sehr vielversprechend.
Da ich ja aber noch mit einer älteren OOo-Version arbeiten muss, gab es wohl die Ansprechbarkeit in Form von thisdatabasedocument noch nicht.
Mit dieser Form kann ich zwar eine neue Abfrage erstellen, aber keine bestehende ersetzen / updaten:
Code: Alles auswählen
Sub BerichtParameterabfrage
Dim DatabaseContext as Object
Dim oDatenquelle as Object
Dim oAbfDef as Object 'die einzelne Abfrage
Dim oAbfragen as Object 'alle Abfragen (Sammelobject)
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDatenquelle = DatabaseContext.getByName("angemeldete DB")
oAbfDef = createUnoService ("com.sun.star.sdb.QueryDefinition")
oAbfDef.Command = "SELECT ""Name"" FROM ""Adressen"" "
oAbfragen = oDatenquelle.getQueryDefinitions()
oAbfragen.insertByName ("TEST-b", oAbfDef)
End Sub
Gibt es da so was wie 'ubdateByName' an Stelle von 'insertByName'?
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Das Ganze wird eine Art Serien E-Mail. Ich kann zwar die Abfrage so erstellen, dass das Dokument im Ganzen erstellt wird, aber ich möchte es etwas personalisieren. Ich werde den Bericht nacheinander mit unterschiedlichen Parametern aufrufen und die ausgegebene E-Mail persönlich gestalten. Daher benötige ich den Weg via Makro.F3K Total hat geschrieben:Wenn, wie Du schreibst, der Parameter in der Datenbank liegt, benötigst Du gar kein Makro, sondern die passende Abfrage.
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
von wo aus willst du das Makro starten?
Aus einem internen Formular?
Aus einem internen Formular?
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Per Button - in mehreren Formularen.
Selbst wenn dein Makro so in einem Formular starte, erscheint Objektvariable nicht belegt. Ich glaube, die direkt DB-Ansprechbarkeit aus sich selbst heraus via 'thisdatabasedocument' wurde erst mit OOo 3.3 (?) eingeführt, wenn ich mich nicht täusche.
Selbst wenn dein Makro so in einem Formular starte, erscheint Objektvariable nicht belegt. Ich glaube, die direkt DB-Ansprechbarkeit aus sich selbst heraus via 'thisdatabasedocument' wurde erst mit OOo 3.3 (?) eingeführt, wenn ich mich nicht täusche.
- Dateianhänge
-
- Bildschirmfoto 2013-03-25 um 19.43.27.png (97.61 KiB) 5709 mal betrachtet
Zuletzt geändert von geimist am Mo, 25.03.2013 19:49, insgesamt 1-mal geändert.
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Dann sollte dies klappen:
Gruß R
Code: Alles auswählen
Sub BerichtParameterabfrage
nID = 17
oform = thiscomponent.drawpage.forms(0)
oconnection = oform.activeconnection
oqExport = oconnection.Queries.getbyname("qExport")
oqExport.Command = "SELECT * FROM ""Table1"" WHERE ""ID"" = "& nID
end sub
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Super! Es klappt
Vielen Dank

Vielen Dank
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: [GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben
Eine Frage hätte ich dann noch:
Es gibt doch noch ein Szeniario, wo ich das Ganze von extern auslöse, d.h. nicht über ein Formular der DB mit der Abfrage. Ich möchte also 'thiscomponent' mit dem Zugriff auf die angemeldete DB ersetzten.
SQL-Abfragen mache ich bisher so:
Wie kann ich 'thiscomponent' jetzt hier in diesem Code ersetzen:
Es gibt doch noch ein Szeniario, wo ich das Ganze von extern auslöse, d.h. nicht über ein Formular der DB mit der Abfrage. Ich möchte also 'thiscomponent' mit dem Zugriff auf die angemeldete DB ersetzten.
SQL-Abfragen mache ich bisher so:
Code: Alles auswählen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDatenquelle = DatabaseContext.getByName("NAME-MEINER-DB")
If not oDatenquelle.IsPasswordRequired Then
oDatVerb = oDatenquelle.getConnection("","") '("Benutzername","Passwort")
else
oHandler = oDatenquelle.createUnoService("com.sun.star.sdb.InteractionHandler")
oDatVerb = oDatenquelle.ConnectWithCompletion(oHandler)
End If
oStatement = oDatVerb.createStatement()
oStatement.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
sSQL = "SELECT ""MailPfad"" FROM ""CONFIG"" WHERE ""ID"" = 'config'"
oRow = oStatement.executeQuery( sSQL )
oRow.absolute(1)
Code: Alles auswählen
Sub BerichtParameterabfrage
nID = 17
oform = thiscomponent.drawpage.forms(0)
oconnection = oform.activeconnection
oqExport = oconnection.Queries.getbyname("qExport")
oqExport.Command = "SELECT * FROM ""Table1"" WHERE ""ID"" = "& nID
end sub
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Habe es rausgefunden:
oCon muss ich an Stelle wie oben so definieren:
oCon muss ich an Stelle wie oben so definieren:
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Name-meiner-DB")
oCon = DataSource.GetConnection("","")
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: [GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben
Sauber! Transfer-Leistung 1+
Gruß R

Gruß R
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 11: AOO, LO Linux Mint: AOO, LO