[GELÖST] Auswahlfeld mit vielen Einträgen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Pietral
Beiträge: 8
Registriert: Di, 28.04.2015 12:59

[GELÖST] Auswahlfeld mit vielen Einträgen

Beitrag von Pietral »

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.
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Auswahlfeld mit vielen Einträgen

Beitrag von RobertG »

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.

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
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
Dateianhänge
Branchenliste.odb
Listenfeld mit automatischer Filterung nach Anfangsbuchstaben
(89.36 KiB) 95-mal heruntergeladen
Pietral
Beiträge: 8
Registriert: Di, 28.04.2015 12:59

Re: Auswahlfeld mit vielen Einträgen

Beitrag von Pietral »

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.
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Auswahlfeld mit vielen Einträgen

Beitrag von RobertG »

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

Code: Alles auswählen

UPDATE "tbl_Branchen" SET "Branche" = LTRIM("Branche")
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
Dateianhänge
Branchenliste.odb
Listenfeld mit Filter - vereinfachte Anbindung an Listenfeldeigenschaften
(97.22 KiB) 107-mal heruntergeladen
Pietral
Beiträge: 8
Registriert: Di, 28.04.2015 12:59

Re: Auswahlfeld mit vielen Einträgen

Beitrag von Pietral »

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 ...
RobertG
********
Beiträge: 2034
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Auswahlfeld mit vielen Einträgen

Beitrag von RobertG »

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
Pietral
Beiträge: 8
Registriert: Di, 28.04.2015 12:59

Re: Auswahlfeld mit vielen Einträgen

Beitrag von Pietral »

... mach ich.
Antworten