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!
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
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]
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.
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]
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
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
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
Hallo,
inzwischen habe ich eine elegante Lösung für mein Problem gefunden.
http://www.office-loesung.de/ftopic278275_0_0_asc.php (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
Zum Code von ekkehard würde evtl. - ohne es getestet zu haben - ein
Me!Kombifeld.Dropdown
ergänzend passen.
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
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
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
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
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
Hallo Frank,
ZitatIf Me.Feld1 = Null Then
Nz(Me! Feld1, "") <> "" Then Exit sub
If IsNull(Me![ Feld1]) Then Exit sub
Das Feld kann ja nicht NULL sein, Du hast doch einen Buchstaben eingegeben wodurch dieses Ereignis ja erst gefeuert wird.
ZitatIf Shift = 1 Then
Mit der acShiftMask bin ich noch nicht so klar gekommen da fehlt mir noch das wissen dazu
Da steckt intern auch der Wert 1 dahinter; nur wenn MS sich mal ausdenkt da eine 2 draus zu machen, machst Du mit "Shift=1" dicke Backen.
Diese Konstanten gibt es zu Hauf, um nicht zu sagen "wie Sand am Meer". Die meisten davon bekommst Du über IntelliSense angezeigt, oder in der OH.
gruss ekkehard
Hi!
ah tut mir leid hab mich da verschrieben muss nebenher noch 2 kleine Rabauken Hütten
bei all den Prozeduren im key Ereignis wird bei mir (Access 2010 Win7 64bit) die Prozedur immer ausgeführt
die anderen Bedingungen sind sozusagen für´n A.......
If Me.Feld1 = Null Then
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
Else
Exit sub
End IfIf Nz(Me! Feld1, "") <> "" Then
Exit sub
Else
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
End IfIf IsNull(Me![ Feld1]) Then
Exit sub
Else
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
End If
If Shift = 1 Then
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
End Sub
Zitat von: Beaker s.a. am Dezember 02, 2011, 18:02:07
ZitatIf Shift = 1 Then
Mit der acShiftMask bin ich noch nicht so klar gekommen da fehlt mir noch das wissen dazu
Da steckt intern auch der Wert 1 dahinter; nur wenn MS sich mal ausdenkt da eine 2 draus zu machen, machst Du mit "Shift=1" dicke Backen.
Diese Konstanten gibt es zu Hauf, um nicht zu sagen "wie Sand am Meer". Die meisten davon bekommst Du über IntelliSense angezeigt, oder in der OH.
Das wird dann so geschrieben?
If (Shift And acShiftMask) > 0 Then
Gruß frank
Hallo,
eine IF-Bedingungen mit Prüfung auf "NULL" muss so aussehen (btw: Es sind nur Variablen vom Datentyp Variant damit testbar):
If isNull(Me!Feld1) Then
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
Else
Exit sub
End If
oder kürzer:
.
.
If isNull(Me!Feld1) Then Exit Sub
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
End Sub
oder auch mit der nz-Funktion:
If nz(Me!Feld1,"") ="" Then Exit Sub
Me!cbo_Artikel.RowSource = "SELECT ArtikelBezeichnung FROM tbl_Artikel WHERE ArtikelBezeichnung LIKE '" & Chr(KeyAscii) & "*'"
End Sub
(btw: wenn es keine Tippfehler sind: Leerzeichen sind auch Zeichen und haben je nach Position und Verwendung bestimmte Bedeutung.
Me![ Feld1]
bedeutet ein (Formular-)Steuerelement mit einem führendem Leerzeichen in seinem Namen )
Hi!
Danke für die Erläuterung Tippfehler sin des kleine hab es in Word geschrieben der hat mir das wohl verschoben da hab ich nicht aufgepasst
Gruß Frank
Hallo Frank,
ZitatDas wird dann so geschrieben?
If (Shift And acShiftMask) > 0 Then
Richtig.
Leider kann ich Dir das nicht erklären :(. Da findet ein(e) Vergleich/Berechnung auf Bitebene statt, glaub ich mal gelesen zu haben. Hab's dann aber nicht versucht zu verstehen (schäm), weil ich es noch gebraucht habe. Ausser in genau diesem Fall; aber da hab' ich's aus der OH abgeschrieben und brauchte es nicht zu verstehen ;)
Vielleicht hat ja einer der Profis Lust uns das zu erläutern.
gruss ekkehard