[GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben?

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

Moderator: Moderatoren

geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

[GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von geimist »

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.
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
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von juetho »

geimist hat geschrieben:Gibt es überhaupt solch eine Möglichkeit?
So etwas habe ich noch nicht gemacht, ich bin mir aber ziemlich sicher, dass es geht.

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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von F3K Total »

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.

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
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.
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von geimist »

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
Das ist jetzt zwar sehr 'BASE-lastig', …
Gibt es da so was wie 'ubdateByName' an Stelle von 'insertByName'?
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von geimist »

F3K Total hat geschrieben:Wenn, wie Du schreibst, der Parameter in der Datenbank liegt, benötigst Du gar kein Makro, sondern die passende Abfrage.
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.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von F3K Total »

von wo aus willst du das Makro starten?
Aus einem internen Formular?
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von geimist »

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.
Dateianhänge
Bildschirmfoto 2013-03-25 um 19.43.27.png
Bildschirmfoto 2013-03-25 um 19.43.27.png (97.61 KiB) 5708 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von F3K Total »

Dann sollte dies klappen:

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ß R
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von geimist »

Super! Es klappt :D

Vielen Dank
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: [GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben

Beitrag von geimist »

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:

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)
Wie kann ich 'thiscomponent' jetzt hier in diesem Code ersetzen:

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
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: BASE-Abfrage: Wie Parameter per Makro übergeben?

Beitrag von geimist »

Habe es rausgefunden:
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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: [GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben

Beitrag von F3K Total »

Sauber! Transfer-Leistung 1+ :wink:
Gruß R
Antworten