Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Filter in Kombifeld mit großen Datenmengen

Begonnen von Mykis, November 24, 2011, 17:20:24

⏪ vorheriges - nächstes ⏩

Mykis

Hallo,

als Neuling in diesem Forum möchte ich auch gleich mein erstes Problem ansprechen. Ich betreue ein nicht kommerzielles Pilzkartierungsprogramm programmiert mit Access 2000.
Durch die großen Datenmengen treten immer mal neue Probleme auf.

Ich habe ein Kombinationsfeld mit zwei Spalten ,,Fundort" und ,,Datum".
Durch die Begrenzung der Datenmengen in Kombifeldern (64000) werden momentan nur noch Fundorte bis zum Buchstaben "W" angezeigt. (Datensätze ca. 69000)
Nun möchte ich bei der Auswahl in diesem Kombifeld bei der Eingabe des ersten Buchstabens z.B. ,,Z" alle Fundorte mit ,,z" beginnend in der Auswahl des Kombifeldes haben. Durch die Begrenzung wird jetzt nur der Erste mit ,,z" beginnend angezeigt.
Nach Eingabe eines neuen Anfangsbuchstaben sollte dann eine neue Auswahl im Kombifeld
möglich sein.

Vielen Dank im Voraus!

DF6GL

Hallo,


vielleicht helfen da "abhängige Kombifelder"... Im ersten Kombi wird lediglich der Anfangsbuchstabe ausgewählt, der dann im zweiten lediglich die Einträge auflisten lässt, die mit diesem Buchstaben beginnen.

http://www.donkarl.com/?FAQ4.36

http://dbwiki.net/images/6/6f/AccSampleKombiAuswahl.zip
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Mykis

Vielen dank für die schnelle Antwort.

Das wäre eine Möglichkeit, da aber das Formular (siehe Anhang) schon sehr komplex aufgebaut ist, wollte ich durch eine elegantere Lösung weitere Auswahlfelder vermeiden.

[Anhang gelöscht durch Administrator]

DF6GL

Hallo,

naja, so sehr komplex ist das ja nun noch nicht. Statt dem ersten Kombifeld kann ja auch ein normales kleines Textfeld für die Eingabe eines einzelnen Buchstabens herhalten.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Frank77

Hallo !
Ich bin da auch noch ziemlicher Neuling in Access und könnte da auch eine Lösung gebrauchen
Vielleicht hab ja einer eine Code Idee dazu

Man könnte doch im Key Ereignis den Filter beim ersten tasten druck der A – Z
Tasten aktivieren   

Private Sub Datumsfeld_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
      Case 65                                                                       ' A
      Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE GruppenID= " & Me!cbo_Gruppen
     
      Case 66                                                                       ' B
      Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE GruppenID= " & Me!cbo_Gruppen       
      .........
      .........
      .........
      .........
      End Select
End Sub


Gruß Frank

Zu auslesen der ASCII habe ich ein kleines Tool angehängt


[Anhang gelöscht durch Administrator]
Selbstständig = Selbst und Ständig

Beaker s.a.

Hallo Frank,
Wozu das ganze Select Case Gefrickel?
Wie wär's mit

Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"

Es stellt sich allerdings die Frage nach dem Sinn eines Kombis mit fast 70.000 Zeilen.
@Mykis
Da solltest Du mal Dein Datenmodell durchforsten, da gibt es sicher Normalisierungspotential.
hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Frank77

Hi!

Danke!
Erspart eine Menge Arbeit beim Tippen  ,,Anfänger Fehler" 
Hab das mal zusammen mit der Shirt taste gemacht
Wenn das Kombinationsfeld ungebunden ist könnte man dann durch weiterschreiben die Auto Vervollständigung nutzen und gleich weiter selektieren

Private Sub cbo_Artikel _KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 1 Then
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
End Sub

Habs allerdings noch nicht getestet

Gruß Frank
Selbstständig = Selbst und Ständig

Beaker s.a.

Hallo Franz,

ZitatHab das mal zusammen mit der Shirt taste gemacht
Wozu, LIKE berücksichtigt IMO die Gross-/Kleinschreibung doch nicht.

ZitatWenn das Kombinationsfeld ungebunden ist
Wenn's nur der Suche dient, sollte das so sein. Wenn's um die Auswahl eines Wertes für ein Datenfeld geht, musst Du sicherstellen, dass der Wert dann auch gespeichert wird.

Zitatkönnte man dann durch weiterschreiben die Auto Vervollständigung nutzen und gleich weiter selektieren
Das macht die Prozedur doch automatisch, da sie nach JEDEM Tastendruck gefeuert wird.

ZitatHabs allerdings noch nicht getestet
Ich allerdings auch nicht  ;)

Bemerkung am Rande:
ZitatIf Shift = 1
Verwende lieber die eingebauten Konstanten (hier: acShiftMask) statt fester Werte. Da bekommst Du keine Probleme mit Änderungen, die sich MS da vielleicht mal einfallen lässt.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Mykis

Hallo,

inzwischen habe ich eine elegante Lösung für mein Problem gefunden.

http://www.office-loesung.de/ftopic278275_0_0_asc.php

Leider muß ich mit 70 000 und mehr Datensätzen in den Komboboxen arbeiten, da sich die Kartierungsdaten über zwei Jahrhunderte
erstrecken und noch ständig anwachsen.

Beste Grüße Mykis

Maxel

Zum Code von ekkehard würde evtl. - ohne es getestet zu haben - ein
Me!Kombifeld.Dropdown
ergänzend passen.
Viele Grüße
Maxel

Beaker s.a.

Hallo,

@Maxel
ZitatZum Code von ekkehard würde evtl. - ohne es getestet zu haben - ein

Code: In Zwischenablage kopieren
Me!Kombifeld.Dropdown

ergänzend passen.

Macht eigentlich Sinn, fragt sich nur wie das in diesem Fall aussieht, will sagen, ob es da viel Geflacker gibt, da die Procedur ja bei jedem Tastendruck gefeuert wird. Da finde ich die Lösung, die Mykis gefunden hat schon besser, weil dort das Dropdown erst nach einer festgelegten Anzahl eingegebener Zeichen ausgeführt wird.

@Mykis
Zitatda sich die Kartierungsdaten über zwei Jahrhunderte
erstrecken

Ergeben sich dadurch nicht Möglichkeiten der vorgängigen Einschränkung? Z.B. ein Textfeld zur Aufnahme einer Jahreszahl, mit der dann die Kombobox schon mal vorgefiltert werden kann.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Frank77

Hallo

Die Prozedur von Beaker s.a. funktioniert Einwand frei bei mir man  müsste das Ganze nur so aufbauen das die Prozedur nach dem ersten Tastendruck nicht mehr einsetzt  dann kann man durch weiterschreiben gleich weiter selektieren
Das Dropdown dann auf die eingabetaste oder der Pfeiltaste nach unten setzen 

Ich habe es mit einer Prüfung auf null versucht im key Ereignis es spricht aber nicht drauf an
Das mit der Shirt taste geht auch nicht  die Zeile wird einfach übergangen  wie die null Zeile auch

Den link hätte ich mir gerne mal angeschaut aber da kommt nur mittlerweile der Fehler schade 

SQL Error : 145 Table './db_ol_live/phpbb_posts_text' is marked as crashed and should be repaired

Gruß Frank
Selbstständig = Selbst und Ständig

Mykis

Mein Link funktioniert derzeit nicht, deshalb hier der Code:


Public Sub SetCboRecordsource(cbo As ComboBox, Recordsource As String, _
                              LookupColumn As String, _
                              Optional PrefixLength As Long = 1)
    Dim SQL As String
   
    If Len(cbo.Text) >= PrefixLength Then
        SQL = "SELECT * " & _
                "FROM [" & Recordsource & "] " & _
               "WHERE Left([" & LookupColumn & "]," & _
                           PrefixLength & ") = '" & Left(cbo.Text, _
                                                         PrefixLength) & "'"
        If cbo.RowSource <> SQL Then
            'Debug.Print SQL
            cbo.RowSource = SQL
            cbo.Dropdown
        End If
      Else
        cbo.RowSource = ""
    End If
End Sub



In der Combobox muß unter "Bei Taste Auf" folgende Zeile:  SetCboRecordsource Me!Name des Kombifeldes, "Name Abfrage", "Name des zu filternden Feldes"

Gruß Mykis

Beaker s.a.

Hallo Mykis,

ZitatDie Prozedur von Beaker s.a. funktioniert Einwand frei bei mir man  müsste das Ganze nur so aufbauen das die Prozedur nach dem ersten Tastendruck nicht mehr einsetzt

Dann setzt Du an den Anfang ein

If Len(Me!DeinKombi & "") > 1 then Exit Sub

Du musst aber zwischen meinem Code und dem, den Du jetzt benutzt unterscheiden.
Die Procedur aus dem Netz läuft erst an, will sagen ändert die RowSource des Kombis, wenn eine, von Dir bestimmte Anzahl Zeichen eingegeben wurden (3. Parameter). Wenn Du da obige If-Abfrage voranstellst muss der 3. Parameter 0 sein, sonst bleibt das Kombi leer.

ZitatIch habe es mit einer Prüfung auf null versucht im key Ereignis es spricht aber nicht drauf an

Bei sowas solltest Du immer den Code hier reinschreiben, damit man sehen kann was Du da wie prüfst.

hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Frank77

Hi!  ;D

Habs ganz banal so probiert 

If Me.Feld1 = Null Then

Nz(Me! Feld1, "") <> "" Then Exit sub

If IsNull(Me![ Feld1]) Then Exit sub

If Shift = 1 Then

Mit der acShiftMask bin ich noch nicht so klar gekommen da fehlt mir noch das wissen dazu

Gruß Frank  und danke für eure mühe
Selbstständig = Selbst und Ständig