[GELÖST] Auswahlfeld mit vielen Einträgen
Moderator: Moderatoren
[GELÖST] Auswahlfeld mit vielen Einträgen
Problemstellung: In einem Formular gibt es ein Listenfeld mit über 2000 Einträgen (hier: Branchen). Beim Ausfüllen des Formulars sollen nach Eingabe des 1. Buchstabens nur noch Einträge mit diesem Anfangsbuchstaben selektiert werden. Als Beispiel gebe ich ein "B" ein, es erscheinen nur noch Einträge mit "B" am Anfang. DB im Anhang ...
- Dateianhänge
-
- Branchenliste.odb
- (87.97 KiB) 102-mal heruntergeladen
Zuletzt geändert von Pietral am Do, 14.05.2015 11:27, insgesamt 1-mal geändert.
Re: Auswahlfeld mit vielen Einträgen
Hallo Pietral,
ich habe auf die Schnelle einmal ein Makro dazu zusammen gebaut. Ich werde noch versuchen, über eine Zwischenspeicherung den Filter erweiterbar zu machen.
Bei der Erstellung des Makros habe ich erst einmal gestutzt, weil Wohl sämtliche Felder in Deiner Branchen-Tabelle mit einem Leerzeichen beginnen. Da würde ich dringend noch nacharbeiten.
Das Makro habe ich beim Listenfeld an das Ereignis "Taste losgelassen" gebunden. Allerdings habe ich nicht Dein Formular genutzt, da mir da der Sinn nicht nachvollziehbar war. In der Regel werden ja die Schlüsselfelder in eine andere Tabelle als Fremdschlüssel weiter gegeben. Danach ist die Abfrage aufgebaut.
Die in der Designansicht erstellte Abfrage beschränkt bei mir den Inhalt auf alle Felder der gleichen Tabelle - nur mit ID < 1. Dann wird erst einmal nicht geladen und der Inhalt des Listenfeldes belastet keinen Speicher.
-----------------------------------------------
Nachtrag: Ich habe das jetzt so zusammengebaut, dass die Einschränkung auch noch weiter vorgenommen werden kann ('ab' zeigt dann nur die Auswahlmöglichkeiten für 'ab' in Groß- und Kleinschreibung...). Die angeklickten Buchstaben werden nach 5 Sekunden aus dem Speicher entfernt.
Zusätzlich habe ich das Ganze so gebaut, dass in die Zusatzinformationen des Listenfeldes der Anfangscode geschrieben werden muss, der in der Abfrage für das Listenfeld verwendet wird. Nach dem dort enthaltenen ersten Feld wird dann gefiltert. Damit kann das Makro für jedes weitere Listenfeld ebenfalls genutzt werden.
Gruß
Robert
ich habe auf die Schnelle einmal ein Makro dazu zusammen gebaut. Ich werde noch versuchen, über eine Zwischenspeicherung den Filter erweiterbar zu machen.
Bei der Erstellung des Makros habe ich erst einmal gestutzt, weil Wohl sämtliche Felder in Deiner Branchen-Tabelle mit einem Leerzeichen beginnen. Da würde ich dringend noch nacharbeiten.
Code: Alles auswählen
Sub ListFilter(oEvent AS OBJECT)
oFeld = oEvent.Source.Model
IF oEvent.KeyCode < 538 THEN
DIM stSql(0) AS STRING
DIM stText AS STRING
stText = LCase(oEvent.KeyChar & "%")
stSql(0) = "SELECT ""Branche"", ""ID"" FROM ""tbl_Branchen"" WHERE LOWER(LTRIM(""Branche"")) LIKE '"+stText+"' ORDER BY ""Branche"""
oFeld.ListSource = stSql
oFeld.refresh
END IF
End Sub
Die in der Designansicht erstellte Abfrage beschränkt bei mir den Inhalt auf alle Felder der gleichen Tabelle - nur mit ID < 1. Dann wird erst einmal nicht geladen und der Inhalt des Listenfeldes belastet keinen Speicher.
-----------------------------------------------
Nachtrag: Ich habe das jetzt so zusammengebaut, dass die Einschränkung auch noch weiter vorgenommen werden kann ('ab' zeigt dann nur die Auswahlmöglichkeiten für 'ab' in Groß- und Kleinschreibung...). Die angeklickten Buchstaben werden nach 5 Sekunden aus dem Speicher entfernt.
Zusätzlich habe ich das Ganze so gebaut, dass in die Zusatzinformationen des Listenfeldes der Anfangscode geschrieben werden muss, der in der Abfrage für das Listenfeld verwendet wird. Nach dem dort enthaltenen ersten Feld wird dann gefiltert. Damit kann das Makro für jedes weitere Listenfeld ebenfalls genutzt werden.
Gruß
Robert
- Dateianhänge
-
- Branchenliste.odb
- Listenfeld mit automatischer Filterung nach Anfangsbuchstaben
- (89.36 KiB) 95-mal heruntergeladen
Re: Auswahlfeld mit vielen Einträgen
OK, das sieht sehr kompliziert aus. Muß ich die Datenbank irgendwie anmelden, nachdem ich sie runtergeladen habe. Im Auswahlfeld erscheint momentan gar nichts.
Mir fehlt da noch sehr viel Grundwissen. In OO sind ja sehr viele Makros schon hinterlegt. Gibt es eine Informationsquelle, wo diese beschrieben werden?
Vielleicht noch eine Frage, die für viele hier interessant sein könnte: Steht das Makro jetzt für alle Datenbanken zur Verfügung oder ist es nur diesem Projekt zugeordnet.
Mir fehlt da noch sehr viel Grundwissen. In OO sind ja sehr viele Makros schon hinterlegt. Gibt es eine Informationsquelle, wo diese beschrieben werden?
Vielleicht noch eine Frage, die für viele hier interessant sein könnte: Steht das Makro jetzt für alle Datenbanken zur Verfügung oder ist es nur diesem Projekt zugeordnet.
Re: Auswahlfeld mit vielen Einträgen
Hallo Pietral,
ich arbeite zur Zeit noch an einer Verbesserung des Makros, die dazu führt, dass in dem Listenfeld nichts zusätzlich mehr angegeben werden muss. Es reicht der Code im Listenfeld. Die Begrenzung dort sollte dann über ein Limit erfolgen.
Du musst für die Ausführung von Makros erst einmal die Sicherheitsstufe Deines OpenOffice oder LibreOffice herabsetzen (Extras → Optionen → Sicherheit → Makrosicherheit). Wenn Die Sicherheitsstufe auf "2" gesetzt ist, dann wirst Du vor dem Öffnen eines Dokumentes danach gefragt, ob der Makrocode ausgeführt werden darf. Du kannst auch einen Pfad angeben, in dem die Dateien liegen, bei denen Du auf diese Nachfrage verzichten willst und ohne Nachfrage Code ausführen lassen willst.
Solange das Makro nur in der Base-Datei liegt ist es auch nur für diese verfügbar. Prinzipiell funktioniert dort das Makro aber für alle Listenfelder.
Die Base-Datei muss dafür nicht als Datenbank angemeldet sein.
In dem Listenfeld siehst Du erst einmal nichts, weil ich ursprünglich den SQL-Befehl so gesetzt habe, dass der Inhalt gar nicht geladen wird. In dem unten angehängten Beispiel siehst Du jetzt beim Start die ersten 5 Werte der Liste. Je mehr Werte geladen werden, desto größer dürfte auch der Speicherbedarf sein.
Hauptproblem speziell Deiner Liste ist aus meiner Sicht aber nicht die Filterung nach a, b usw. sondern der Fehler, dass alle Werte der Liste mit einer Leertaste beginnen. Deshalb kann Base keine Navigationshilfe anbieten. Führe einmal
in Base unter Extras → SQL aus, damit die Leerzeichen vor den Buchstaben verschwinden. Dann kannst Du auch ohne jegliches Makro in dem Listenfeld klar kommen.
Ich hänge noch einmal das Beispiel an - jetzt mit Makro, aber einfacherer Handhabung des Listenfeldes dazu und mit einem Formular, wo das Listenfeld auch ohne jegliches Makro funktioniert, weil eben die Leerzeichen beseitigt worden sind.
Gruß
Robert
ich arbeite zur Zeit noch an einer Verbesserung des Makros, die dazu führt, dass in dem Listenfeld nichts zusätzlich mehr angegeben werden muss. Es reicht der Code im Listenfeld. Die Begrenzung dort sollte dann über ein Limit erfolgen.
Du musst für die Ausführung von Makros erst einmal die Sicherheitsstufe Deines OpenOffice oder LibreOffice herabsetzen (Extras → Optionen → Sicherheit → Makrosicherheit). Wenn Die Sicherheitsstufe auf "2" gesetzt ist, dann wirst Du vor dem Öffnen eines Dokumentes danach gefragt, ob der Makrocode ausgeführt werden darf. Du kannst auch einen Pfad angeben, in dem die Dateien liegen, bei denen Du auf diese Nachfrage verzichten willst und ohne Nachfrage Code ausführen lassen willst.
Solange das Makro nur in der Base-Datei liegt ist es auch nur für diese verfügbar. Prinzipiell funktioniert dort das Makro aber für alle Listenfelder.
Die Base-Datei muss dafür nicht als Datenbank angemeldet sein.
In dem Listenfeld siehst Du erst einmal nichts, weil ich ursprünglich den SQL-Befehl so gesetzt habe, dass der Inhalt gar nicht geladen wird. In dem unten angehängten Beispiel siehst Du jetzt beim Start die ersten 5 Werte der Liste. Je mehr Werte geladen werden, desto größer dürfte auch der Speicherbedarf sein.
Hauptproblem speziell Deiner Liste ist aus meiner Sicht aber nicht die Filterung nach a, b usw. sondern der Fehler, dass alle Werte der Liste mit einer Leertaste beginnen. Deshalb kann Base keine Navigationshilfe anbieten. Führe einmal
Code: Alles auswählen
UPDATE "tbl_Branchen" SET "Branche" = LTRIM("Branche")
Ich hänge noch einmal das Beispiel an - jetzt mit Makro, aber einfacherer Handhabung des Listenfeldes dazu und mit einem Formular, wo das Listenfeld auch ohne jegliches Makro funktioniert, weil eben die Leerzeichen beseitigt worden sind.
Gruß
Robert
- Dateianhänge
-
- Branchenliste.odb
- Listenfeld mit Filter - vereinfachte Anbindung an Listenfeldeigenschaften
- (97.22 KiB) 107-mal heruntergeladen
Re: Auswahlfeld mit vielen Einträgen
Hallo,
es lag an den Leerzeichen vor den Einträgen. Das Problem saß vor dem Rechner
Nachdem ich die Leerzeichen entfernt habe, funktioniert es eigentlich so, wie ich es mir vorgestellt habe - also ohne Makro.
Kann es sein, dass diese Funktion im Listenfeld schon integriert ist.
Wieder was gelernt ...
es lag an den Leerzeichen vor den Einträgen. Das Problem saß vor dem Rechner
Nachdem ich die Leerzeichen entfernt habe, funktioniert es eigentlich so, wie ich es mir vorgestellt habe - also ohne Makro.
Kann es sein, dass diese Funktion im Listenfeld schon integriert ist.
Wieder was gelernt ...
Re: Auswahlfeld mit vielen Einträgen
Hallo Petral,
die Funktion des Filterns ist so nicht in die Listenfelder integriert. Das Listenfeld sucht aus Deinen über 2000 Einträgen nach den eingegebenen Anfangsbuchstaben nur den entprechenden Start heraus, ab dem Du wohl vermutlich suchen willst. Es sind also ohne weiteres auch Werte davor und danach nachschlagbar.
Die Funktion, wie sie in dem Makro steht, begrenzt den Inhalt des Listenfeldes. Dies kann dann sinnvoll sein, wenn bei zu großen Listenfeldern zu viel Speicher gebraucht wird, um ein Listenfeld (oder mehrere) erst einmal zu bestücken. Ich hatte so etwas einmal bei einer Bibliotheksdatenbank, allerdings mit Apache/PHP. Da brauchte das Formular entsprechend lange, bis erst einmal alle Listenfelder gefüllt wurde. Bei Base habe ich das mit den gerade einmal 2000 Datensätze allerdings nicht bemerkt.
Trotzdem habe ich die Prozedur jetzt auch direkt in das zukünftige Base-Handbuch übernommen.
Ich versuche prinzipiell auch erst einmal ohne Makroeinsatz aus zu kommen, und da Dir die Funktion von Base so schon reicht ist das natürlich gut.
Setze doch jetzt nur noch eben diesen Thread in dem ersten Beitrag unter "Betreff" als "Gelöst".
Gruß
Robert
die Funktion des Filterns ist so nicht in die Listenfelder integriert. Das Listenfeld sucht aus Deinen über 2000 Einträgen nach den eingegebenen Anfangsbuchstaben nur den entprechenden Start heraus, ab dem Du wohl vermutlich suchen willst. Es sind also ohne weiteres auch Werte davor und danach nachschlagbar.
Die Funktion, wie sie in dem Makro steht, begrenzt den Inhalt des Listenfeldes. Dies kann dann sinnvoll sein, wenn bei zu großen Listenfeldern zu viel Speicher gebraucht wird, um ein Listenfeld (oder mehrere) erst einmal zu bestücken. Ich hatte so etwas einmal bei einer Bibliotheksdatenbank, allerdings mit Apache/PHP. Da brauchte das Formular entsprechend lange, bis erst einmal alle Listenfelder gefüllt wurde. Bei Base habe ich das mit den gerade einmal 2000 Datensätze allerdings nicht bemerkt.
Trotzdem habe ich die Prozedur jetzt auch direkt in das zukünftige Base-Handbuch übernommen.
Ich versuche prinzipiell auch erst einmal ohne Makroeinsatz aus zu kommen, und da Dir die Funktion von Base so schon reicht ist das natürlich gut.
Setze doch jetzt nur noch eben diesen Thread in dem ersten Beitrag unter "Betreff" als "Gelöst".
Gruß
Robert
Re: Auswahlfeld mit vielen Einträgen
... mach ich.