Base: Eingabeaufforderung für Abfrage

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

Moderator: Moderatoren

arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Base: Eingabeaufforderung für Abfrage

Beitrag von arkadiuszpaluszek »

Kurz gesagt, Du möchtest einen Filter erstellen.

Nun, für sowas würde ich persönlich die Eingabefelder nicht per Makro erzeugen sondern einfach ein entsprechendes Formular gestalten - oben mit einer Leiste von Feldern wo die Filterkriterien eingetragen werden, unten ein Tabellenelement welches die Ergebnisse beinhaltet. Wenn ich Dich richtig verstanden habe, möchtest Du nach folgenden Kriterien filtern können:

1. Person
2. Datum

Lass mich das etwas vereinfacht machen und zuerst mit der Person anfangen:

Das würde ich gar nicht per Makro tun, sondern durch ein Formular mit einem Unterformular, wobei die jeweiligen Formulare eben über die Personal-ID verknüpft sind, dann kann ich schon nach Personen filtern. Ist Dir klar wie man das macht? Wenn nicht, gibst Du bestimmt Bescheid. Hier wird die ID (also Personalnummer) ausgelesen, um diese als Rückgabewert zu erhalten obwohl Du einen Namen aussuchst empfehle ich ein Listenfeld.

Filtern nach Datum wird schwieriger, weil es hier nicht mehr um eine einfache Übereinstimmung sondern um Zeitspannen von... bis... geht. Hierfür würde ich im Filter zwei Datumsfelder anlegen, die mit keinem der Felder der DB verknüpft sind sondern nur vom Makro gelesen werden.

Dies funktioniert dann so:

Code: Alles auswählen

dim oDoc as Object, oForm as Object, oEl as Object
oDoc=thisComponent
oForm=oDoc.Drawpage.Forms.GetByName("NameDesFormulars") ' den Namen kannst Du im Formularnavigator einsehen, verändern etc.
oEl=oForm.GetByName("Datumsfeld-von")
von=oEl.text 'dieses Datum ist in einem Format, welches wir so fürs Filtern nicht gebrauchen können.... also verändern wir das Datum in ein Format, welches von der DB verstanden wird:
von=CDateToIso(von)

oEl=oForm.GetByName("Datumsfeld-bis")
bis=oEl.text
bis=CDateToIso

Nun haben wir also bereits zwei Variablen, welche die Zeitspanne, nach welcher Du filtern möchtest, umschließen. Nun würde ich also im Unterformular entsprechend den SQL-Befehl verändern, was voraussetzt, dass der Inhalt des Unterformulars eben ein SQL-Befehl ist (also "SELECT * FROM zusatztabelle" statt einfach nur "zusatztabelle" als Tabelle als Formularinhalt hinterlegen). Damit dann die Verknüpfung der beiden Tabellen nach der Person XY noch möglich ist, sollte auch der Inhalt des Hauptformulars ein SQL-Befehl sein ("SELECT * FROM MainTabelle")

Nun filtern wir nach Datum:

Code: Alles auswählen

oForm=oDoc.Drawpage.Forms.GetByName("Name des Unterformulars")
oForm.CommandType=2 'hier sage ich dem Formular vorsichtshalber nochmal dass sein Inhalt spätestens von jetzt an ein SQL-Befehl ist
MeinSQLbefehl="SELECT * FROM ""Zusatztabelle"" WHERE ""Datum""<"+(bis+1)+" AND ""Datum"">"+(von-1) 'bitte achte hier auf die doppelten "
oForm.Command=MeinSQLbefehl
oForm.reload() 'Das Formular wird nun neu geladen, das Tabellenelement müsste jetzt die gefilterten Infos haben. 
Das Alles funktioniert aber nur, wenn Du nach einer einzigen Person filtern willst. Möchtest Du aber nur von -> bis filtern und die Personen mal links liegen lassen, mach Dir vielleicht ein anderes Formular welches eben über die Verknbüpfung nicht verfügt, oder Du fügst hier im oben beschriebenem Beispiel auch ein Listenfeld ein welches nicht mit der DB verbunden ist - dann brauchst Du auch kein Haupt- und Unterformular sondern nur ein einziges Formular, das Makro muss dann sehen ob auch nach Personen gefiltert werden soll. Den Teil welches also das Datum ausliest ergänzen wir noch um Folgendes:

Code: Alles auswählen

oEl=oForm.getByName("Personal")
Persnr=oEl.value
meinFilter="" ' das bedeutet nur nach Datum filtern - lege ich jetzt so fest
if oEL<>0 then
        meinFilter="nach Person filtern"
        Personalnr=oEl.value
end if
Je nachdem ob im Listenfeld jemand ausgewählt wurde beinhaltet die Variable meinFilter jetzt also einen anderen Wert, nun wird gefiltert:

Code: Alles auswählen

if meinFilter="" then
             oForm.CommandType=2
             MeinSQLbefehl="SELECT * FROM ""Zusatztabelle"" WHERE ""Datum""<"+(bis+1)+" AND ""Datum"">"+(von-1)
  else
             oForm.CommandType=2
             MeinSQLbefehl="SELECT * FROM ""Zusatztabelle"" WHERE ""Datum""<"+(bis+1)+" AND ""Datum"">"+(von-1)+" AND ""Personalnr""="+Personalnr
end if
oForm.Command=MeinSQLbefehl
oForm.reload()
O.k., habe ich jetzt so aus dem Stegreif geschrieben und hoffe keine Fehler gemacht zu haben! :) Falls es nicht läuft, gib Bescheid!

Gruss

Arek

P.S.: Darf ich fragen was Deine Aufgabe im Betrieb ist? :? Es ist nicht alltäglich, dass man vom Vorgesetzten gebeten wird eine Datenbank zu programmieren, von unserer Buchhaltung z.B. kann das niemand! :)