Seite 1 von 1
BASIC Beispiel-Code für Zugriff auf Filter gesucht
Verfasst: So, 12.11.2006 22:43
von egerlach
Ich habe ein Formular mit einem Subformular. Das Fomular hat nur ein Text-Feld, das ist der Filter für das Subformular. Jetzt will ich den aktuellen Filter auslesen (in meinem Bsp eine Zahl). Hat mir jmd ein Beispiel für ein solches BASIC-Skript?
Ziel ist übrigens, daß der BASIC-Code eine Text-Datei im Dateisystem erstellt, dabei soll dann der Inhalt des Filter mitverarbeitet werden.
Nachtrag: habe gerade entdeckt, daß wenn ich einen Button in das Unterformular setze, daß dann unter Formulareigenschaften unte rFilter steht: (`plz` = 76133). Kann dann diesen Filter irgendwie in einem BASIC Programm übernehmen? (Das wäre eine Krücke für die oben beschriebene bessere Lösung). D.H. wenn ich mir meinen SQL-String für den Aufruf in MySQL schreibe, dann will ich die 76133
eben in irgendeiner Variablen zur Verfügung haben. Geht das?
Gruss
Eckard
Verfasst: Mo, 13.11.2006 13:32
von Steffan
Hallo Eckard,
beiliegender Code liest Text aus einem Textfeld im Hauptformular aus und setzt einen Filter für die Felder Firma oder Nachname der DB-Tabelle des Subformulars.
Code: Alles auswählen
oDoc = ThisComponent
oDraw = oDoc.drawpage
oFormMain = oDraw.forms.getbyName("MyFormMain") 'Hauptformular
oFormSub = oDraw.forms.getbyName("MyFormSub") 'Subformular
oFilt = oFormMain.getbyname("txtFilter") 'Textbox für Filtertext
sFilter= lcase(oFilt.Text)
sFilter = %" & sFilter & "%"
setFilter= "( (LCASE(company1) LIKE '" & sFilter & "') OR (LCASE(family_name) LIKE '" & sFilter & "') )"
oFormSub.Filter=setFilter
oFormSub.Reload
(Ist aus Code von mir zusammengestellt, ohne noch mal zu testen, hoffe es funktioniert so)
Beste Grüße,
Steffan
Verfasst: Di, 14.11.2006 00:50
von egerlach
Ich will nur den Wert des Filterfeldes auslesen, habe Dein Skript mal genommen:
Code: Alles auswählen
Sub Main
DIM aDoc as object, meineZahl as integer
oDoc = ThisComponent
oDraw = oDoc.drawpage
oFormMain = oDraw.forms.getbyName("MainForm") 'Hauptformular
oFilt = oFormMain.getbyname("plzfeld") 'Textbox für Filtertext
meineZahl = oFilt.value
msgbox "xxxxxx ",meineZahl
End Sub
Fehlermeldung: BASIC-Laufzeitfehler! Eigenschaft oder Methode nicht gefunden. Der Code bleibt bei meineZahl = oFilt.value hängen. Warum?
Im Formular Navigator steht:
Formulare
Code: Alles auswählen
- Main Form
-Sub Form
Sub Form Grid
TextBox
[...]
ABC
#plzfeld
PushButton
Verfasst: Di, 14.11.2006 08:17
von Steffan
Hallo,
wenn Du nur den Wert der Textbox auslesen willst, muss es heißen:
Damit liegt die Zahl in Textform vor, falls Du sie z.B. Als Integer-Wert brauchst, musst Du sie noch umwandeln.
Außerdem solltest Du noch mal prüfen, ob der Name des Hauptformulars korrekt angegeben ist.
im Navigator: "Main Form"
in Deinem Code: oFormMain = oDraw.forms.getbyName("MainForm")
Und als drittes ist Deine Syntax für die MsgBox falsch. Wenn Du nur die Zahl ausgeben willst, dann nimm einfach
Dein Code gibt "xxxx" aus und versucht die Zahl als Typ, der das Aussehen der Box steuert zu übergeben. Da sollte Dir die Hilfe weiterhelfen.
Beste Grüße,
Steffan
Verfasst: Mi, 15.11.2006 00:37
von egerlach
cInt(meineZahl) geht nicht (Fehlermeldung), die meineZahl ist schon Zahl, z.B. kann mit msgbox 2 * meineZahl direkt operiert werden.
Achja, "Main Form" war natürlich falsch von mir abgetippt, richtig ist "MainForm"
So, das Programm funktioniert syntaktisch, wirft mir aber immer 76133 aus, aber nicht die Zahl, die ich eingegeben habe! Die Filterfunktion funktioniert, gebe ich z.B. 79106 in den Filter ein, dann werden im Sub-Formular wirklich die Adresse mit PLZ 79106 angezeigt. Das tolle BASIC-Programm aber wirft stur den Filter aus, der beim Start des Formulares aktiv ist. Was nu? (OO-Base ein wahrer Zeitvertreib, ideal für jmd der sonst nichts besseres zu tun weiss ...

)
Hier der syntaktisch funktionierende Code:
Code: Alles auswählen
Sub Main
dim meineZahl as double, oForm as object, oCtr as object, iZahl as double
oDoc = ThisComponent
oDraw = oDoc.drawpage
oFormMain = oDraw.forms.getbyName("MainForm") 'Hauptformular
oFilt = oFormMain.getbyname("plzfeld") 'Textbox für Filtertext
meineZahl = oFilt.Text
msgbox meineZahl
End Sub
Gruss
Eckard
Verfasst: Mi, 15.11.2006 08:26
von Steffan
Hallo,
cInt(meineZahl) geht nicht (Fehlermeldung), die meineZahl ist schon Zahl, z.B. kann mit msgbox 2 * meineZahl direkt operiert werden.
Das ist natürlich klar, ich hatte die Definition für meineZahl übersehen.
Aber ansonsten kann ich Dein Problem nicht nachvollziehen. Ich habe deinen Code bei mir getestet und die msgBox schreibt ganz brav das was in der Textbox mit dem Namen "plzfeld" steht. Da Du noch von Formularfiltern redest, nehme ich mal an, das der Code noch weitergeht. Poste doch mal den gesamten Code, dann werden wir das Problem schon lösen.
Steffan
Verfasst: Mi, 15.11.2006 10:45
von egerlach
Hallo Steffan,
tausend Dank für Deine Hilfen.
Nein, der Code ist da (derzeit!) wirklich zu ende!
Ich habe ein Formular und ein Subformular. Das Formular besteht nur aus einem einzigen Eingabefeld, dieses Zahlenfeld. Dort gebe ich einen neuen Filter ein, nachdem ich auf das Icon "Formularbasierter Filter" geklickt habe. Dann nämlich öffnet sich ein kleines Fenster in OO-Base mit zwei Icons darinnen. Nachdem in in das Zahlenfeld eine neue PLZ eingegeben habe, muß ich dem kleinen OO-BAse-Fenster auf das Icon mit Bezeichnung "Filter anwenden" klicken und dann erst (wahnsinnig umständich ist das alle sin OO-Base ....

.. mit Papier und Bleistift fast schneller .. wenn ich hier nicht Linux hätte, wäre schon längst Access gekauft) ist das Subformular mit der neuen PLZ gefiltert. Uff!
So und gerade eben habe ich festgestellt, daß ich in das Zahlenfeld NOCHMALS die PLZ eingeben muß, einfach so, ohne vorher auf die Filter-Icons zu klicken, DANN ist diese erneute Eingabe einer beliebigen Zahl mit dem BASIC-Programm von Dir auslesbar. Es gibt also ZWEI wechselweise Belegungen des Zahlenfeldes: EINE mit dem Filter und EINE mit dem Text den man da eingibt. (Wer hat sich denn den Quatsch ausgedacht???)
Also: wenn das alles so umständlich ist, dann ist mir ein Eingabeformular für die PLZ lieber. Siehe parallele Anfrage in einem anderen thread hier im Forum.
Eigentlich wollte ich wie ein Feld, das ich die PLZ eingebe (mit Option Pull-down und Selektion einer der 3.000 PLZ's) und dann auf return drücken wie das schon bei Access 1.1 so üblich war. Aber das scheint es hier nicht zu geben. leider.
Gruss
Eckard
Verfasst: Mi, 15.11.2006 13:39
von Steffan
Hallo Eckard,
also den formularbasierten Filter verwende ich persönlich auch nicht, da mir das ganze ebenfalls zu umständlich ist. Bei mir funktioniert das so (Kontaktdatenbank):
- Formular enthält ein Tabellenkontrollfeld, in dem in tabellarischer Form alle Datensätze angezeigt werden (wäre bei dir wohl im Subformular)
- über (oder unter) der Tabelle befindet sich eine Filtertextbox
- der Textbox wird im Eigenschaftenfenster beim Ereignis 'Text modifiziert' das Makro aus meinem ersten Posting zugewiesen
- Wenn jetzt Text in der Textbox eingegeben wird, wird permanent die Filtereinstellung des Formulars geändert und in der Tabelle werden nur Datensätze angezeigt, die den eingegebenen Kriterien entspechen
- Für deine Anwendung hieße das nach entsprechender Anpassung des Codes: Du gibst eine '0' und in der Tabelle erscheinen alle Datensätze deren PLZ mit 0 beginnt, Du hängst eine '1' dran und erhälst alle Adressen deren PLZ mit '01' beginnt usw. usf. Das ganze funktioniert ohne zusätzliche Eingaben, Du brauchst noch nicht mal Enter zu drücken.
- Sobald die Liste in der Tabelle übersichtlich genug ist, wähle ich den gewünschten Kontakt durch Klick aus und verwende ihn für weitere Aktionen
Ob das für dich so praktikabel ist, weiß ich nicht, allerdings konnte ich so bei mir das umständliche Handling des Formularbasierten Filters vermeiden.
Beste Grüße,
Steffan.