❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

(gelö)Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

(gelö)Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von Freischreiber » Sa 21. Feb 2015, 09:24

Hallo,

könnte bitte mal jemand mit Makroerfahrung die angehängte Datenbank anschauen und das Makro zum Laufen bringen?

Ich wollte versuchen, eine Filterfunktion nicht mit Parameterabfrage oder Filtertabelle zu machen, sondern mit

Code: Alles auswählen

oform1.Filter = "Text = '"+stSuchtext+"'" 
So ähnlich läuft das bei mir auch schon mit einem Wert aus einer Unterformular-Tabelle (von Kundenblatt aus Auftragsblatt aufrufen, mit getstring, findcolumn).

Probleme hier sind aber:
- Ich krieg den Text nicht aus dem Textfeld :evil:
- Wie kann ich nach Eingabe im Suchfeld das Formular "sich selbst" aufrufen lassen, um den Filter zu aktualisieren?

Danke und Gruß
Freischreiber
Dateianhänge
Filterdatenbank.zip
(10.85 KiB) 178-mal heruntergeladen
Zuletzt geändert von Freischreiber am Mi 22. Apr 2015, 11:41, insgesamt 1-mal geändert.
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von RobertG » Sa 21. Feb 2015, 10:03

Hallo freischreiber,

ich habe den Code einmal etwas angepasst:

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
 oFeld = oEvent.Source.Model.Parent.getByName("Suchfeld")
 stSuchtext = oFeld.text
 oform1 = ThisDatabaseDocument.getformdocuments.GetByName("f-Formular1")
 oform1.open
 oform1 = oform1.Component.drawpage.forms(0)
 oform1.Filter = "Text = '"+stSuchtext+"'" 
 oform1.ApplyFilter = TRUE
 oform1.reload
End Sub
Das funktioniert zwar so, ist aber etwas merkwürdig aufgebaut. Danach habe ich das dann von allen überflüssigen Einträgen entschlackt:

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
 oForm = oEvent.Source.Model.Parent
 oFeld = oForm.getByName("Suchfeld")
 stSuchtext = oFeld.text
 oForm.Filter = "Text = '"+stSuchtext+"'" 
 oForm.ApplyFilter = TRUE
 oForm.reload
End Sub
Das Makro wird durch einen Button in dem Formular ausgelöst. Von dem Button aus ermittele ich das Formular. Von dem Formular aus dann das "Suchfeld". Im Suchfeld steht Text. Das Suchfeld ist nicht weiter mit der Tabelle der Datenbank verbunden. Du kannst also auch nicht mit getSring oder so etwas arbeiten.
Das Formular, in dem das Feld liegt, ist das gleiche Formular, dem jetzt ein Filter zugeweisen werden soll. Das Formular ist also beteits offen. Der Filter muss nur erstellt, zugeweiesen und die Formularoberfläche neu eingelesen werden. Ein "reload" ist etwas anderes als ein Formulardokument komplett neu zu öffnen.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von Freischreiber » Sa 21. Feb 2015, 10:52

Hallo Robert,

ja genau! So wollte ich das schreiben, aber mir fehlten die Worte. :mrgreen: Vielen Dank.

Dann hab ich noch ein LIKE eingeführt, um trunkiert suchen zu können, siehe unten.

Gescheitert bin ich aber an einem LOWER oder so, damit Kleinbuchstaben bei der Suche reichen... geht das im Makro auch irgendwie? Ich kann ja schlecht schreiben: "LOWER (oForm.Filter) = LOWER..."?

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
oFeld = oForm.getByName("Suchfeld")
stSuchtext = oFeld.text
oForm.Filter = "Text LIKE '"+stSuchtext+"'"
oForm.ApplyFilter = TRUE
oForm.reload
End Sub
Gruß
Freischreiber

PS: Ist das nicht auch eine nette Filtermethode? Komfortabler als eine Parameterabfrage und genauso schnell wie eine Filtertabelle, kommt aber ohne Unterformular aus und funktioniert auch mit Splitdatenbanken/mehreren Benutzern.
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von RobertG » Sa 21. Feb 2015, 12:17

Hallo Freischreiber,

wenn schon mit LIKE, dann aber auch so, dass wirklich beliebige Treffer gefunden werden, die dem Inhalt entsprechen:

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
oFeld = oForm.getByName("Suchfeld")
stSuchtext = LCASE(oFeld.text)
oForm.Filter = "LCASE(Text) LIKE '%"+stSuchtext+"%'" 
oForm.ApplyFilter = TRUE
oForm.reload
End Sub
LOWER gibt es als Basic-Funktion nicht. LCASE erfüllt aber den gleichen Zweck. Aus welchen Kompatibilitätsgründen es für die HSQLDB zwei Funktionen für den gleichen Zweck gibt kann ich so nicht auf Anhieb sagen.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von Freischreiber » Mi 25. Feb 2015, 16:14

Hallo Robert,

super! Auf mehrere Spalten erweitert sieht es bei mir jetzt so aus:

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
oFeld = oForm.getByName("Suchfeld")
stSuchtext = LCASE(oFeld.text) 'ermöglicht Großbuchstaben in Suchfeld
oForm.Filter = "LCASE(Spalte1) LIKE '%"+stSuchtext+"%' OR LCASE(Spalte2) LIKE '%"+stSuchtext+"%' "
oForm.ApplyFilter = TRUE
oForm.reload
End Sub
Vielen Dank und viele Grüße
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von Freischreiber » Di 14. Apr 2015, 10:53

Hallo Robert,

kurze Verständnisfrage noch zu diesem Makro. Ich habe versucht, die Zeile

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
in die für mich gewohnte Form zu bringen:

Code: Alles auswählen

Sub Main
DIM oEvent AS OBJECT
Aber das scheint nicht dasselbe zu sein. Basic meldet dann bei oForm BASIC-Laufzeitfehler. Objektvariable nicht belegt.

Kannst du mir sagen, woran das liegt?

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von RobertG » Di 14. Apr 2015, 16:05

Hallo Freischreiber,

mit

Code: Alles auswählen

Sub Main(oEvent AS OBJECT)
wird beim Aufruf des Makros mitgelesen, von woher das Ereignis aufgerufen wird. oEvent ist für die gesamte Prozedur damit schon einmal mit Inhalt gefüllt. Ob das nun oEvent oder xyzSonstwie heißt ist dabei völlig egal - aber die Varaible hat Inhalt.
Mit

Code: Alles auswählen

Sub Main
DIM oEvent AS OBJECT
wird eine Prozedur aufgerufen und anschließend eine Variable deklariert, die keinen Inhalt hat. Den Inhalt hierfür musst Du später festlegen. Du hast damit das Makro von seinem auslösenden Ereignis abgenabelt. Wenn Du jetzt irgendetwas suchst, was auf oEvent aufbaut, dann musst Du erst einmal erklären, was Du mit oEvent meinst.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von Freischreiber » Di 14. Apr 2015, 16:46

Hallo Robert,

aha, und es hat anscheinend auch gar keinen darstellbaren (Text-)Inhalt, sondern ist nur ein Zeiger für die nachfolgenden Zeilen: "In dem Formular, das dieses Makro aufgerufen hat, nach dem Textfeld X suchen!" ? Das ist wohl wichtig, wenn mehrere Formulare offen sind?

Bei mir ist schon wieder die nächste Frage aufgetaucht.

Das Makro soll auch die Adressentabelle filtern. Die Zeile

Code: Alles auswählen

oForm.Filter = "LCASE(Nachname) LIKE '%"+stSuchtext+"%' OR LCASE(Firma) LIKE '%"+stSuchtext+"%' "
soll die Suche per Nachname oder Firma ermöglichen, hat aber wohl ein Problem, wenn eines der Tabellenfelder null bzw. leer ist. ("Unzulässiger Wert oder Datentyp. Datentypen unverträglich.")

Bei der Parameterabfrage hattest du das mit

Code: Alles auswählen

WHERE LOWER ( "Nachname" ) LIKE LOWER ( '%' || NULLIF ( :NachnameOderFirmaOderOKfürNeu, '' ) || '%' ) ...
gelöst, aber das scheint so in BASIC nicht zu gehen.

Der Versuch

Code: Alles auswählen

oForm.Filter = "LCASE(Nachname) LIKE '%"+NULLIF (stSuchtext, "''")+"%'" OR "LCASE(Firma) LIKE '%"+NULLIF (stSuchtext, "''")+"%'"
scheitert mit Sub- oder Function-Prozedur nicht definiert.

Gibt es da etwas Entsprechendes in BASIC?

Gruß und vielen Dank
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von RobertG » Di 14. Apr 2015, 19:44

Hallo Freischreiber,

was sind denn das Für Feldtypen, die Du mit LIKE bearbeiten willst. Auch leere Felder müssten da keine Probleme bereiten. Leere Felder werden dann bei den Ergebnissen gar nicht angezeigt.
Was ist mit den Feldern? Müssen die nicht irgendwie mit Anführungszeichen maskiert werden?

Code: Alles auswählen

oForm.Filter = "LCASE(""Nachname"") LIKE '%"+stSuchtext+"%' OR LCASE(""Firma"") LIKE '%"+stSuchtext+"%' "
Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Freischreiber
* LO-Experte *
Beiträge: 837
Registriert: Fr 28. Mär 2014, 10:41

Re: Filtern über oform1.Filter = "Text = '"+stSuchtext+"'"

Beitrag von Freischreiber » Mi 15. Apr 2015, 08:12

Hallo Robert,

ohje, ich hatte ein Anführungszeichen zuviel drin, was mir diese irreführende Fehlermeldung eingebrockt hatte. Jetzt gehts mit:

Code: Alles auswählen

oForm.Filter = "LCASE(Nachname) LIKE '%"+stSuchtext+"%' OR LCASE(Firma) LIKE '%"+stSuchtext+"%'"
Feldtyp ist VARCHAR. Mit den doppelten Anführungszeichen um die Spaltennamen geht es auch, ist aber nicht nötig, vielleicht weil externe DB? Nur einmal Anführungszeichen ("Nachname") geht nicht...

Vielen vielen Dank!

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten