Dynamische Abfrage per Makro?!
Moderator: Moderatoren
Dynamische Abfrage per Makro?!
Guten Tag,
ich habe folgende Problemstellung:
Ich habe eine Abfrage die sich jeden Monat wiederholt.
Nun möchte ich aber nicht ne Abfrage für jeden Monat haben sondern EINE Abfrage.
Wenn diese Abfrage aufgerufen wird gebe ich einen Monat ein oder ein Intervall (z.b. [01.01.2009] & [31.01.2009]).
Diese Datumsangabe soll in meinen SQL Befehl eingebaut werden mit Platzhaltern/Variablen.
Gibt es da irgendeine Möglichkeit für?
Wäre über jeden Rat oder Hilfestellung dankbar!
Michael
ich habe folgende Problemstellung:
Ich habe eine Abfrage die sich jeden Monat wiederholt.
Nun möchte ich aber nicht ne Abfrage für jeden Monat haben sondern EINE Abfrage.
Wenn diese Abfrage aufgerufen wird gebe ich einen Monat ein oder ein Intervall (z.b. [01.01.2009] & [31.01.2009]).
Diese Datumsangabe soll in meinen SQL Befehl eingebaut werden mit Platzhaltern/Variablen.
Gibt es da irgendeine Möglichkeit für?
Wäre über jeden Rat oder Hilfestellung dankbar!
Michael
Re: Dynamische Abfrage per Makro?!
Hi,
wenn du nur eine Abfrage haben möchtest, die immer wieder verwendet wird, dann würde ich dir vorschlagen dir diese Abfrage über eine Function zu holen.
z.B.
Diese Function rufst du dann immer auf, wenn du sie brauchst und speicherst sie in einer String-Variablen, z.B. so sQuery = GetQuery().
Ich weiß jetzt nicht, wie du deine Abfragen gemacht hast bzw. machst. Ob du die Abfrage eingegeben hast oder ob du sie in der Base Datei gespeichert hast.
Wenn du sie von Hand eingegeben hast, dann ist es ganz einfach.
Und der Aufruf sieht wie folgt aus: sQuery = GetQuery("01.01.2009")
Danach kannst du Abfrage z.B. so absetzen: oResultSet = oStatement.executeQuery(sQuery)
oStatement musst du vorher noch erzeugen, wie das geht findest du überall.
Wenn ich deinen Fall nicht getroffen haben sollte, dann poste mal deinen Codeausschnitt.
Wenn du mit Platzhaltern arbeiten willst, dann kannst du dir einen beliebigen Platzhalter aussuchen und deine Abfrage selber bauen.
Es gibt eine ReplaceString-Methode, die ist sehr gut.
Alles über diese Methode findest du in der OnlineHilfe, ist sehr gut beschrieben.
Gruß
Ironzwerg
wenn du nur eine Abfrage haben möchtest, die immer wieder verwendet wird, dann würde ich dir vorschlagen dir diese Abfrage über eine Function zu holen.
z.B.
Code: Alles auswählen
Function GetQuery() as String
GetQuery = "Select * from Table"
End Function
Ich weiß jetzt nicht, wie du deine Abfragen gemacht hast bzw. machst. Ob du die Abfrage eingegeben hast oder ob du sie in der Base Datei gespeichert hast.
Wenn du sie von Hand eingegeben hast, dann ist es ganz einfach.
Code: Alles auswählen
Function GetQuery(sDate as String) as String
GetQuery = "Select * from Table where Column = " + sDate
End Function
Danach kannst du Abfrage z.B. so absetzen: oResultSet = oStatement.executeQuery(sQuery)
oStatement musst du vorher noch erzeugen, wie das geht findest du überall.
Wenn ich deinen Fall nicht getroffen haben sollte, dann poste mal deinen Codeausschnitt.
Wenn du mit Platzhaltern arbeiten willst, dann kannst du dir einen beliebigen Platzhalter aussuchen und deine Abfrage selber bauen.
Es gibt eine ReplaceString-Methode, die ist sehr gut.
Alles über diese Methode findest du in der OnlineHilfe, ist sehr gut beschrieben.
Gruß
Ironzwerg
Das Antonym von Antonym ist Synonym
Re: Dynamische Abfrage per Makro?!
Meine Abfrage sieht so aus:
Und ich möchte wenn die Abfrage in OpenOffice aufgerufen wird... das ein Fenster ausgeht in dem ich ein Datum eintragen kann, welches dann wiederum an passender Stelle in der SQL-Abfrage eingefügt wird (Aufnahme >= ).
Mein Problem ist gerade die "Übergabe" des Datum's.
Du schreibst folgendes:
Aber wie bekomme ich es geregelt das ich das Datum "per Hand" eingeben kann wenn ich die Abfrage aufrufe?
Code: Alles auswählen
"SELECT `Reparatur_ID` AS `Reparatur_ID`, `Aufnahme` AS `Aufnahme`, `Fahrzeug_T` AS `Fahrzeug_T`, `Grund` AS `Grund`, `KM` AS `KM`, `Erstzul` AS `Erstzul`, `Einbau_am` AS `Einbau_am`, `PKZ` AS `PKZ`, `Fahrzeug_I` AS `Fahrzeug_I`, `Typ_Kuehla` AS `Typ_Kuehla`, `Standkuehl` AS `Standkuehl`, `RLZ` AS `RLZ`, `Leistung` AS `Leistung`, `TO_DO` AS `TO_DO`, `Land` AS `Land`, `Ausloeser` AS `Ursache`, `Teil_zurueck` AS `Teil_zurueck`, `Bemerkung_Ruecklieferung` AS `Bemerkung_Ruecklieferung` FROM `werkschulungen`.`reparaturen` AS `reparaturen` WHERE `Aufnahme` >= {D '2008-05-01' } AND `Aufnahme` < {D '2008-06-01' }"
Mein Problem ist gerade die "Übergabe" des Datum's.
Du schreibst folgendes:
Ich verstehe dass das Datum an die Funktion übergeben wird und diese dann den fertigen SQL String zusammenbastelt.Und der Aufruf sieht wie folgt aus: sQuery = GetQuery("01.01.2009")
Aber wie bekomme ich es geregelt das ich das Datum "per Hand" eingeben kann wenn ich die Abfrage aufrufe?
Re: Dynamische Abfrage per Makro?!
Das ist auch nicht schwer.
Du möchtest ja das Datum aus einem Dialog holen.
Den Dialog schließt du z.B. mit einem Klick auf einen OK-Button. Diesen Ok-Button verbindest du wiederum mit einer Methode, die das Datum aus dem entsprechenden Control holt.
z.B. mit oDateBox.getText().
Nach dem du das Datum geholt hast, kannst du damit machen was du möchtest.
Am Besten du machst es so, dass du private Variablen für den Dialog und die Controls anlegst, die beim öffnen des Dialoges initalisiert werden. So brauchst du das nur einmal machen und kannst die Variablen dann Modulweit verwenden.
Du möchtest ja das Datum aus einem Dialog holen.
Den Dialog schließt du z.B. mit einem Klick auf einen OK-Button. Diesen Ok-Button verbindest du wiederum mit einer Methode, die das Datum aus dem entsprechenden Control holt.
z.B. mit oDateBox.getText().
Nach dem du das Datum geholt hast, kannst du damit machen was du möchtest.
Am Besten du machst es so, dass du private Variablen für den Dialog und die Controls anlegst, die beim öffnen des Dialoges initalisiert werden. So brauchst du das nur einmal machen und kannst die Variablen dann Modulweit verwenden.
Das Antonym von Antonym ist Synonym
Re: Dynamische Abfrage per Makro?!
Ich bin leider noch absolut blutiger Anfänger was die Sache angeht und der letzte Schritt ging mir leider zu schnell
.
Ich zeige dir mal den Code den ich bisher gebastelt habe.
Ich habe mich jetzt dazu entschieden dass ich einfach nur einen Monat eingeben möchte (In diesem Dialog den du beschrieben hast).
Wenn dann z.B. Januar eingegeben wird, soll er automatisch mit ner if else Abfrage darauf prüfen und je nachdem die Datumsvariablen setzen.
Das bekomm ich aber hin.
Mein Hauptproblem bei der ganzen Sache besteht dahin gehend:
Wie bekomme ich einen Dialog mit Eingabefeld hin?
Dafür fehlt mir noch das Verständnis / das know-how!
Vielen Dank für deine Mühen bisher Ironzwerg!

Ich zeige dir mal den Code den ich bisher gebastelt habe.
Code: Alles auswählen
Sub helloworld(monat as string)
GlobalScope.BasicLibraries.LoadLibrary("Tools")
dim sql as string
sql="SELECT `Reparatur_ID` AS `Reparatur_ID`, `Aufnahme` AS `Aufnahme`, `Fahrzeug_T` AS `Fahrzeug_T`, `Grund` AS `Grund`, `KM` AS `KM`, `Erstzul` AS `Erstzul`, `Einbau_am` AS `Einbau_am`, `PKZ` AS `PKZ`, `Fahrzeug_I` AS `Fahrzeug_I`, `Typ_Kuehla` AS `Typ_Kuehla`, `Standkuehl` AS `Standkuehl`, `RLZ` AS `RLZ`, `Leistung` AS `Leistung`, `TO_DO` AS `TO_DO`, `Land` AS `Land`, `Ausloeser` AS `Ursache`, `Teil_zurueck` AS `Teil_zurueck`, `Bemerkung_Ruecklieferung` AS `Bemerkung_Ruecklieferung` FROM `werkschulungen`.`reparaturen` AS `reparaturen` WHERE `Aufnahme` >= {D 'ANFANG' } AND `Aufnahme` < {D 'ENDE' }"
dim a as string
dim e as string
a="2009.01.01"
e="2009.02.01"
sql=ReplaceString(sql,a,"ANFANG")
sql=ReplaceString(sql,e,"ENDE")
msgbox sql
End Sub
Wenn dann z.B. Januar eingegeben wird, soll er automatisch mit ner if else Abfrage darauf prüfen und je nachdem die Datumsvariablen setzen.
Das bekomm ich aber hin.
Mein Hauptproblem bei der ganzen Sache besteht dahin gehend:
Wie bekomme ich einen Dialog mit Eingabefeld hin?
Dafür fehlt mir noch das Verständnis / das know-how!
Vielen Dank für deine Mühen bisher Ironzwerg!
Re: Dynamische Abfrage per Makro?!
Bis jetzt sieht alles recht gut aus.
Das mit dem Dialog ist das einfachste. Sorry ist aber so.
Drück Alt+F11, dann auf Verwalten.
Dann klickst du auf den Reiter Dialoge, klickst auf Neu, gibst einen Namen ein und klickst auf OK.
Der Dialog erscheint dann in dem Baum.
Markier den Dialog und klick auf Bearbeiten.
Schon gelangst du in den Dialog-Editor, in dem kannst du diech frei entfalten.
Spiel ein wenig damit rum.
Du kannst auf Controls das Kontextmenü aufrufen und genauere Einstellungen vornehmen und auch den Ereignissen bestimmte Methoden zuweisen.
Google mal nach Dialogen und OpenOffice Basic oder so.
Es gibt viele Schritt für Schritt Anleitungen für das Erstellen von Dialogen auch mit Bildern.
Gruß
Ironzwerg
P.S.: Nichts zu danken, jeder fängt mal Klein an, ich musste auch viel Lernen und lerne immer noch viel
Das mit dem Dialog ist das einfachste. Sorry ist aber so.
Drück Alt+F11, dann auf Verwalten.
Dann klickst du auf den Reiter Dialoge, klickst auf Neu, gibst einen Namen ein und klickst auf OK.
Der Dialog erscheint dann in dem Baum.
Markier den Dialog und klick auf Bearbeiten.
Schon gelangst du in den Dialog-Editor, in dem kannst du diech frei entfalten.
Spiel ein wenig damit rum.
Du kannst auf Controls das Kontextmenü aufrufen und genauere Einstellungen vornehmen und auch den Ereignissen bestimmte Methoden zuweisen.
Google mal nach Dialogen und OpenOffice Basic oder so.
Es gibt viele Schritt für Schritt Anleitungen für das Erstellen von Dialogen auch mit Bildern.
Gruß
Ironzwerg
P.S.: Nichts zu danken, jeder fängt mal Klein an, ich musste auch viel Lernen und lerne immer noch viel

Das Antonym von Antonym ist Synonym
Re: Dynamische Abfrage per Makro?!
Okay ich bin schon mal einen Schritt weiter...
Ich habe Code der folgenden Dialog auslöst:

Jetzt habe ich ein Textfeld und ein "OK-Button".
Drücke ich auf OK, soll sich der Dialog schließen und die Eingabe aus dem Feld an Variable XY im Makro übergeben werden.
Komme aber an dem Punkt nicht weiter.
Hier nochmal der aktuelle Code:
Ich habe Code der folgenden Dialog auslöst:

Jetzt habe ich ein Textfeld und ein "OK-Button".
Drücke ich auf OK, soll sich der Dialog schließen und die Eingabe aus dem Feld an Variable XY im Makro übergeben werden.
Komme aber an dem Punkt nicht weiter.
Hier nochmal der aktuelle Code:
Code: Alles auswählen
public Dlg As Object
Sub helloworld
GlobalScope.BasicLibraries.LoadLibrary("Tools")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dlg.Execute()
dim sql as string
sql="SELECT `Reparatur_ID` AS `Reparatur_ID`, `Aufnahme` AS `Aufnahme`, `Fahrzeug_T` AS `Fahrzeug_T`, `Grund` AS `Grund`, `KM` AS `KM`, `Erstzul` AS `Erstzul`, `Einbau_am` AS `Einbau_am`, `PKZ` AS `PKZ`, `Fahrzeug_I` AS `Fahrzeug_I`, `Typ_Kuehla` AS `Typ_Kuehla`, `Standkuehl` AS `Standkuehl`, `RLZ` AS `RLZ`, `Leistung` AS `Leistung`, `TO_DO` AS `TO_DO`, `Land` AS `Land`, `Ausloeser` AS `Ursache`, `Teil_zurueck` AS `Teil_zurueck`, `Bemerkung_Ruecklieferung` AS `Bemerkung_Ruecklieferung` FROM `werkschulungen`.`reparaturen` AS `reparaturen` WHERE `Aufnahme` >= {D 'ANFANG' } AND `Aufnahme` < {D 'ENDE' }"
dim a as string
dim e as string
a="2009.01.01"
e="2009.02.01"
sql=ReplaceString(sql,a,"ANFANG")
sql=ReplaceString(sql,e,"ENDE")
Wert=Msgbox("Abfragetext",2+16)
msgbox sql
End Sub
Re: Dynamische Abfrage per Makro?!
Jetzt machst du eine private Variable sDate vom Typ String z.B.
Dann kannst du eine neue Methode machen, die den Wert ausliest, in die Variable sDate schreibt und den Dialog schließt.
Bei dir sieht das dann wie folgt aus:
Wenn das geschehen ist, kannst du bei den Eigenschaften des Button beim Ereignis "Beim Auslösen" diese Methode zuweisen.
Jetzt musst du in deiner Hauptmethode nur noch die Variable sDate einbringen und schon funktioniert es.
Du kannst ja zum Testen, hinter Dlg.execute()
MsgBox sDate einfügen, dann sollte dir der eingegebene Wert in der MsgBox ausgegeben werden.
Gruß
Ironzwerg
Dann kannst du eine neue Methode machen, die den Wert ausliest, in die Variable sDate schreibt und den Dialog schließt.
Bei dir sieht das dann wie folgt aus:
Code: Alles auswählen
Sub GetDate()
Dim oTextField as Object
oTextField = Dlg.getControl("TextField1")
sDate = oTextField.getText()
Dlg.endExecute()
end Sub
Jetzt musst du in deiner Hauptmethode nur noch die Variable sDate einbringen und schon funktioniert es.
Du kannst ja zum Testen, hinter Dlg.execute()
MsgBox sDate einfügen, dann sollte dir der eingegebene Wert in der MsgBox ausgegeben werden.
Gruß
Ironzwerg
Das Antonym von Antonym ist Synonym
Re: Dynamische Abfrage per Makro?!
Wunderbar... es funktioniert 
Ich kann die beiden Datumsangaben eingeben und der String wird am Ende richtig zusammen gebaut
Jetzt muss ich mit diesem String nur noch eine Abfrage auf die Datenbank ausführen und am Besten in eine Calc Tabelle schreiben!!
Du meintest dafür gäbe es genug Beispiele im Netz?
Hier der aktuelle Code:

Ich kann die beiden Datumsangaben eingeben und der String wird am Ende richtig zusammen gebaut

Jetzt muss ich mit diesem String nur noch eine Abfrage auf die Datenbank ausführen und am Besten in eine Calc Tabelle schreiben!!
Du meintest dafür gäbe es genug Beispiele im Netz?
Hier der aktuelle Code:
Code: Alles auswählen
public Dlg As Object
private a As String
private e As String
Sub helloworld
GlobalScope.BasicLibraries.LoadLibrary("Tools")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dlg.Execute()
dim sql as string
sql="SELECT `Reparatur_ID` AS `Reparatur_ID`, `Aufnahme` AS `Aufnahme`, `Fahrzeug_T` AS `Fahrzeug_T`, `Grund` AS `Grund`, `KM` AS `KM`, `Erstzul` AS `Erstzul`, `Einbau_am` AS `Einbau_am`, `PKZ` AS `PKZ`, `Fahrzeug_I` AS `Fahrzeug_I`, `Typ_Kuehla` AS `Typ_Kuehla`, `Standkuehl` AS `Standkuehl`, `RLZ` AS `RLZ`, `Leistung` AS `Leistung`, `TO_DO` AS `TO_DO`, `Land` AS `Land`, `Ausloeser` AS `Ursache`, `Teil_zurueck` AS `Teil_zurueck`, `Bemerkung_Ruecklieferung` AS `Bemerkung_Ruecklieferung` FROM `werkschulungen`.`reparaturen` AS `reparaturen` WHERE `Aufnahme` >= {D 'ANFANG' } AND `Aufnahme` < {D 'ENDE' }"
sql=ReplaceString(sql,a,"ANFANG")
sql=ReplaceString(sql,e,"ENDE")
msgbox sql
End Sub
Sub RunGraphikWizard
GlobalScope.BasicLibraries.LoadLibrary("Tools")
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
Dlg.Execute()
End Sub
Sub FinishGraphicsDialog
Dlg.endExecute()
a = Dlg.Model.TextField1.Text
e = Dlg.Model.TextField2.Text
End Sub
Re: Dynamische Abfrage per Makro?!
Das hört sich doch gut an.
Jupp, dafür gibt es genug Beispiele und Dokus.
Hier ist das Programmierhandbuch, ist sehr gut
http://docs.sun.com/app/docs/doc/819-13 ... =de&a=view
Und hier noch eine Seite, die auch nicht zu unterschätzen ist.
http://www.starbasicfaq.de/index.html
Viel Erfolg damit
Gruß
Ironzwerg
Jupp, dafür gibt es genug Beispiele und Dokus.
Hier ist das Programmierhandbuch, ist sehr gut
http://docs.sun.com/app/docs/doc/819-13 ... =de&a=view
Und hier noch eine Seite, die auch nicht zu unterschätzen ist.
http://www.starbasicfaq.de/index.html
Viel Erfolg damit
Gruß
Ironzwerg
Das Antonym von Antonym ist Synonym