Seite 1 von 1

Filtern per Code

Verfasst: Fr, 12.11.2010 23:10
von Reginald
Hallo!
Ich habe in einem Formular verschiedene Adressen: Kunden, Lieferanten und Sonstige. Das Kriterium steht in einem Feld "Status". Die kann ich mit der Standard-Filterfunktion von OO Base selektieren. Jetzt will ich das ganze aber mit einem Button machen.

Also Button 1 und er zeigt mir nur alle Kunden an. Button 2 für alle Lieferanten etc.

Kann mir jemand den Code nennen - oder zumindest den Befehl, um per Code zu filtern?

Oder, am besten: Ich habe nur einen Button und es geht eine neue Maske auf, wo ich dann die 3 Buttons sehe und dort auswählen kann.

(Ich habe vor 20 Jahrem mal Basic programmiert, und so ganz langsam komme ich wieder in das Thema Programmierung rein ...)

Danke schon mal!

Reginald

Re: Filtern per Code

Verfasst: So, 14.11.2010 14:11
von Steffan
Hallo Reginald,
Du könntest Deinem Button1 z.B. folgenden Code zuweisen:

Code: Alles auswählen

...
oDoc = ThisComponent
oCtrl = oDoc.getCurrentController()
oDraw = oDoc.drawpage
oForm = oDraw.forms.getbyName("Formularname")
oForm.Filter="(Status = 'Kunde')"
oForm.Reload
...
Komfortabler wirds, wenn Du in Dein Formular eine Listbox einbaust, die die verschiedenen Einträge von 'Status' enthält und der dann den obigen Code zuweist. (In diesem Fall muss der Code noch noch um das Auslesen den selektierten Wertes ergänzt werden.)

Beste Grüße,
Steffan

Re: Filtern per Code

Verfasst: Fr, 19.11.2010 02:59
von Reginald
Hallo Steffan,

vielen Dank für deine Antwort! Ein klein wenig modifiziert funktioniert es nun:

Code: Alles auswählen

Sub FilterKunden
oDoc = ThisComponent  'Das ist immer so eine Muss-Zeile
oForm = oDoc.drawpage.forms.getbyindex(0)  'Drawpage des Formulars. Auch immer so eine Musszeile.
oForm.Filter="(Status = 'Kunde')"
oForm.Reload
End Sub
Jetzt die Gretchenfragen:
+ Manche Statusfelder haben den Wert "Kunde", manche "Kunden", manche "Firmenkunde". Wie muß die Zeile oForm.Filter=... aussehen, wenn ich sozusagen nach *kunde* suchen möchte?
+ Wie sieht der Spass aus, wenn der Filterwert in einer Variablen sFilter steht? Also in der Art oForm.Filter="(Status = sFilter)" (funzt so leider nicht, habe auch schon viele andere Varianten ausprobiert ....)
+ Mit welchem Wert kann ich den Filter wieder resetten, so dass ich wieder alle Datensätze sehen kann?

Vielen Dank!
Reginald

Re: Filtern per Code

Verfasst: Fr, 19.11.2010 03:34
von Reginald
Also bzgl. dem Resetten habe ich mir jetzt schon helfen können:

Code: Alles auswählen

Sub FilterResetten
	oDoc = ThisComponent
	oForm = oDoc.drawpage.forms.getbyindex(0)
	oForm.ApplyFilter = false
	oForm.Reload
End Sub
Entsprechend sollte bei dem Code ganz oben auch noch die Zeile oForm.ApplyFilter = true eingefügt werden for dem oForm.Reload

Ich kann den Wert für sFilterfield anstatt über ein Suchfeld im Formular über eine Inputbox abfragen:

Code: Alles auswählen

sFilterfield = InputBox("Bitte Status eingeben:","Datensätze filtern","<<Zu filternder Status>>")
Das mag für viele Kleinigkeiten sind, für mich aber schon große Schritten beim Neuerlernen einer Sprache ...

+ Trotzdem bleibt die Frage, wie muss der Code aussehen, damit ich nach dem Feld sFilterfield filtern kann, also in der Art Status = sFilterfield.
+ Wie, wenn ich mit Platzhaltern suchen möchte, also in der Art Status = *sFilterfield*


Also, danke schon einmal!!

Reginald

Re: Filtern per Code

Verfasst: Fr, 19.11.2010 10:18
von Steffan
Hallo Reginald,

Du musst Deinen Filterstring halt aus Text und deiner Variablen zusammensetzen also

Code: Alles auswählen

oForm.Filter="LCASE(Status) LIKE '%" & lcase(sFilterfield) & "%'"
Damit wird nicht zwischen Groß- und Kleinschreibung unterschieden (LCASE), das %-Zeichen ist in der SQL-Syntax Platzhalter für eine beliebige Anzahl von Zeichen.

Allerdings solltest Du überlegen, ob du in Deiner DB nicht eine Tabelle Status anlegst, in die Du die verschiedenen Stati (heisst das so?) einträgst und in Deiner Haupttabelle nur über die ID verknüpfst. Wenn Du jedesmal den Status per Hand neu einträgst kann es zu Fehlern kommen. Und wenn bei Status z.B. "Künde" steht wird dieser Datensatz auch nicht mit dem o.g. Filter erkannt.

Beste Grüße,
Steffan

Re: Filtern per Code

Verfasst: So, 21.11.2010 00:30
von Reginald
Hm, das klingt ziemlich plausibel, funktioniert aber nicht ... Er zeigt mir dann keinen Datensatz an, obwohl es einen gibt per den Werten, die ich filter. Also er zeigt so eine Maske an, die wie ein ganz neuer, leerer Datensatz aussieht ...

Hast du noch eine Idee zur Variante der Syntax?

Grüße
Reginald

Re: Filtern per Code

Verfasst: So, 21.11.2010 11:20
von Steffan
Hallo Reginald,

schau Dir mal die beiliegende Beispiel-DB an (Formular1). In das Textfeld kannst Du dort irgend einen Text eingeben, nach dem dann das Feld Status gefiltert wird. Ich denke, das sollte Dir bei deiner Frage helfen.

Beste Grüße,
Steffan
testfilter.odb
Beispiel-DB für Filtern per Code
(13.39 KiB) 153-mal heruntergeladen

Re: Filtern per Code

Verfasst: Fr, 03.12.2010 20:06
von Reginald
Hallo Steffan,
vielen Dank für deine Antwort!
Zusammen mit diesen Beiträgen hier
http://www.oooforum.de/viewtopic.php?f= ... fd473c5df6
habe ich alles genau so hinbekommen, wie ich wollte, bzw. sogar noch besser, weil ich deinen Ansatz mit eingebaut habe, also ich habe gleich noch eine Listenansicht im Formular, die dann sozusagen als Vorschau dient.

Das Ergebnis meiner ganzen Testerei und so als Beispiel für diejenigen, die es interessiert, in der Anlage.
TestFilter.odb
Verschiedene Filter im Formular
(15.45 KiB) 111-mal heruntergeladen
Danke noch einmal,
Reginald