Seite 1 von 1
[GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 17:20
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.
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 17:52
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
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 17:57
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.
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 19:22
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'?
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 19:27
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.
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 19:32
von F3K Total
von wo aus willst du das Makro starten?
Aus einem internen Formular?
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 19:35
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.
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 19:46
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
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mo, 25.03.2013 20:29
von geimist
Super! Es klappt
Vielen Dank
Re: [GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben
Verfasst: Di, 26.03.2013 23:28
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
Re: BASE-Abfrage: Wie Parameter per Makro übergeben?
Verfasst: Mi, 27.03.2013 01:40
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("","")
Re: [GELÖST] BASE-Abfrage: Wie Parameter per Makro übergeben
Verfasst: Mi, 27.03.2013 06:17
von F3K Total
Sauber! Transfer-Leistung 1+
Gruß R