Dynamische Abfrage per Makro?!

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

Moderator: Moderatoren

Mike85
*
Beiträge: 15
Registriert: Di, 29.07.2008 12:53

Dynamische Abfrage per Makro?!

Beitrag von Mike85 »

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
Ironzwerg
***
Beiträge: 65
Registriert: Mi, 22.08.2007 22:36
Wohnort: Bielefeld
Kontaktdaten:

Re: Dynamische Abfrage per Makro?!

Beitrag von Ironzwerg »

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.

Code: Alles auswählen

Function GetQuery() as String
GetQuery = "Select * from Table"
End Function
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.

Code: Alles auswählen

Function GetQuery(sDate as String) as String
GetQuery = "Select * from Table where Column = " + sDate
End Function
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
Das Antonym von Antonym ist Synonym
Mike85
*
Beiträge: 15
Registriert: Di, 29.07.2008 12:53

Re: Dynamische Abfrage per Makro?!

Beitrag von Mike85 »

Meine Abfrage sieht so aus:

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' }"
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:
Und der Aufruf sieht wie folgt aus: sQuery = GetQuery("01.01.2009")
Ich verstehe dass das Datum an die Funktion übergeben wird und diese dann den fertigen SQL String zusammenbastelt.

Aber wie bekomme ich es geregelt das ich das Datum "per Hand" eingeben kann wenn ich die Abfrage aufrufe?
Ironzwerg
***
Beiträge: 65
Registriert: Mi, 22.08.2007 22:36
Wohnort: Bielefeld
Kontaktdaten:

Re: Dynamische Abfrage per Makro?!

Beitrag von Ironzwerg »

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.
Das Antonym von Antonym ist Synonym
Mike85
*
Beiträge: 15
Registriert: Di, 29.07.2008 12:53

Re: Dynamische Abfrage per Makro?!

Beitrag von Mike85 »

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.

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
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!
Ironzwerg
***
Beiträge: 65
Registriert: Mi, 22.08.2007 22:36
Wohnort: Bielefeld
Kontaktdaten:

Re: Dynamische Abfrage per Makro?!

Beitrag von Ironzwerg »

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 Antonym von Antonym ist Synonym
Mike85
*
Beiträge: 15
Registriert: Di, 29.07.2008 12:53

Re: Dynamische Abfrage per Makro?!

Beitrag von Mike85 »

Okay ich bin schon mal einen Schritt weiter...

Ich habe Code der folgenden Dialog auslöst:

Bild

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
Ironzwerg
***
Beiträge: 65
Registriert: Mi, 22.08.2007 22:36
Wohnort: Bielefeld
Kontaktdaten:

Re: Dynamische Abfrage per Makro?!

Beitrag von Ironzwerg »

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:

Code: Alles auswählen

Sub GetDate()

Dim oTextField as Object

oTextField = Dlg.getControl("TextField1")
sDate = oTextField.getText()
Dlg.endExecute()

end Sub

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
Das Antonym von Antonym ist Synonym
Mike85
*
Beiträge: 15
Registriert: Di, 29.07.2008 12:53

Re: Dynamische Abfrage per Makro?!

Beitrag von Mike85 »

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:

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
Ironzwerg
***
Beiträge: 65
Registriert: Mi, 22.08.2007 22:36
Wohnort: Bielefeld
Kontaktdaten:

Re: Dynamische Abfrage per Makro?!

Beitrag von Ironzwerg »

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
Das Antonym von Antonym ist Synonym
Antworten