Oktober 22, 2021, 21:14:24

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Mehrwertige Listenfelder filtern

Begonnen von steho80, September 30, 2021, 19:02:16

⏪ vorheriges - nächstes ⏩

steho80

Hallo liebes Forum,

da ich in der lang andauernden Kurzarbeit nun etwas Zeit habe, habe ich mir vorgenommen Access und VBA zu erlernen um es auch beruflich zu nutzen. Bin also absoluter Neueinsteiger bezgl. Access und VBA. Als Projekt/Aufgabe zum Einstieg / erlernen habe ich mir von einem Bekannten den inhaltlichen Übertrag einer Web - basierten DB in eine Access DB geben lassen, da erstere bald abgeschaltet wird. Es handelt sich beiden Daten im Wesentlichen um Kontaktdaten bzw. Kontakteigenschaften. Er möchte später die Daten in der Access DB nur haben, lesen und in den Daten suchen können. Ich habe mir entsprechend Gedanken zum Aufbau gemacht und die Tabellen angelegt, sowie entsprechende Forms zur Eingabe der Daten (quasi für mich selbst) und gewissermaßen als lesbare Akte, sowie eine Form zum Suchen und Filtern für den späteren Nutzer erstellt.

Bei letzterem bin ich jetzt an meine Grenze gestoßen und hoffe, dass Ihr mir kurzfristig weiterhelfen könnt, damit ich dem Bekannten die DB bald zur Verfügung stellen kann.

Ich habe verschieden Comboboxen und Textfelder in meinen Such- bzw. Eingabeformen, sowie Listenfeldern mit Mehrfachwerten. Das Filtern in der Suchform nach Daten aus Txt und cmb - Boxen  bekomme ich hin. Beim Filtern der Listenfelder bzw. der Mehrfachwerte komme ich jetzt trotz langem recherchieren und belesen einfach nicht weiter. Da ich hinsichtlich des Verständnisses zum Setzen der Filter ohnehin noch so meine Problem habe (wie / warum SQL , wie /wann VBA) , hängt es hier! Es ist vermutlich total trivial.

Mein Verständnis zum Ansatz wie es funktioniert: über einen Button "btnSearchItemSel" auf der Suchform "frmIPCEITableSearch" werden die gesetzten Filterkriterium aus dem Listenfeld ausgelesen (funktioniert) und der Filterstring zusammengestellt. Das ist mir in der Umsetzung aber (noch) unklar (was äußerst frustrierend ist), d.h. welche tbl, frms oder qry ich ansprechen muss um den String richtig zusammenzusetzen, wie der String zusammengesetzt werden muss (SQL oder VBA String) und wie dieser Filter dann zu setzen ist. Alles was ich an Code gefunden hab war zu unvollständig für nen Einsteiger als das es erschließend erklärt wäre.

Die DB habe ich neutralisiert angehängt, in meiner "FORM_frmIPCEITableSearch" hängt es an folgender Stelle!

Private Sub btnSearchItemSel_Click()
   
    Dim varItem As Variant
    Dim strSearch As String
    Dim task As String
   
'läuft über das Mehrwertfeld "ListHydroProduction" und entnimmt dort die selektierten Werte
'----------------------------------------------------------------------------------
For Each varItem In Me!ctlSearchHydroProd.ItemsSelected
    strSearch = strSearch & ",'" & Me!ctlSearchHydroProd.ItemData(varItem) & "'"
    'MsgBox strSearch
Next varItem
    MsgBox strSearch

If Len(strSearch) = 0 Then      ' wenn die Länge des String 0 (quasi nichts ausgewählt)
    MsgBox "Nothing selected"
    task = "select * from tblIPCEI" ' dann nimm alles bzw. filtere nicht
Else
    strSearch = Right(strSearch, Len(strSearch) - 1)
    ' wie setzt sich der Filterstring zusammen
    '-------------------------------------------
    task = "select * from tblIPCEI where (HydroProduction in (" & strSearch & " ))"
    MsgBox task
End If

' wie ist der Filter zu setzen ??
'--------------------------------
'DoCmd.ApplyFilter task

Wenn ich den fertigen Code sehe macht es bestimmt klick!

Ich hoffe ihr könnt mir zeitnah helfen!

Vielen lieben Dank im Voraus.

MzKlMu

September 30, 2021, 19:35:59 #1 Letzte Bearbeitung: September 30, 2021, 19:59:27 von MzKlMu
Hallo,
Mehrwertfelder vermeidet der erfahrene Access Entwickler, die machen nur Probleme und sind nicht wirklich sinnvoll.
Vollständig angelegte n:m Beziehungen sind da die bessere Wahl. Du wirst zu solchen Feldern auch kaum Hilfe bekommen, die verwendet kaum jemand. Auch die einfachen Nachschlagefelder sind tunlichst zu vermeiden.

Warum hast Du keine Beziehungen angelegt ?
So wie das jetzt ist, dürfte das auch gar nicht gehen, Du hast als Fremdschlüssel Textfelder (Nachschlagefelder) die eigentlich mit den Primärschlüsseln in Beziehung stehen sollten, was aber nicht geht. Beziehungen laufen über den Primärschlüssel und nicht über die Klartextfelder. Auch Filterungen und Suchen läuft über die ID und nicht über den Klartext, das ist ja der Sinn der ID, die Du einfach angelegt hast aber nicht nutzt. Was die Kombifelder zeigen, kannst Du einstellen, also Du siehst den Klartext, aber genutzt wird die ID.
Und die Primärschlüsselfelder einfach ID zu nennen ist auch keine gute Idee.
Hinzu kommt auch noch die fremde Sprache, die das Verständnis für die Zusammenhänge erschwert.

Aus meiner Sicht ist die DB mit dem jetzigen Aufbau unbrauchbar. Hier musst Du noch mal vollständig von vorn beginnen.

Du solltest Dich erst mal mit den Grundlagen beschäftigen.
https://www.access-tutorial.de/
Da kannst Du auch sehen, wie das mit den Beziehungen geht.
Gruß
Klaus

steho80

Hallo MzKlMu,

danke für die schnelle Antwort. Das "Problem" ist, dass ich mit der DB eigentlich nur vorhandenen Daten eine neue "Verpackung" geben möchte, das heisst die DB soll in ihrer Endnutzung nicht weitergepflegt werden, keine zusätzlichen Bericht o.Ä. erstellt werden etc. Sie soll wirklich nur zum speichern (umverpacken) und lesbar machen eines vorhandenen , festen Bestandes an Informationen genutzt werden (ja , eine Db mit Beziehungen macht das auch). 

Mein Ansatz war nur eine einzige Tabelle zu haben in der die Daten vorgehalten werden und die Vielzahl der restlichen Tabellen nur als Basis für die Nachschlagefelder einzusetzen um nicht Wertelisten mit 20+ Werten zu nutzen. Insbesondere weil meines Wissens diese internen Listen auch irgendwo im System verschwinden.  Somit habe ich auch die Schlüssel in den Tabellen natürlich nicht gepflegt und Beziehungen erstellt.

Um's kurz zu machen, mir ist schon klar, dass Access als relationale Datenbank irgendwie anders funktioniert, die Beziehungen es eben ausmachen. Diesbezgl. habe ich mir schon jede Menge Literatur besorgt und umfangreich belesen. Ich war ja bis zu dem Punkt eigentlich auch auf einem für mich vermeintlich guten Weg was die Funktionalität angeht.
Die englischen Begrifflichkeiten habe ich im Übrigen so übernommen, da dies die analogen Bezeichnungen in der web-basierten DB sind. Ich wollte mir jetzt nicht die Mühe machen die Begrifflichkeiten sinngerecht zu übersetzen, bzw. gibt es für mich, der den Hintergrund kennt an der Stelle kein Verständnisproblem.

Das diese mehrwertigen Felder kaum genutzt werden und in der Access Community " verpönt" sind, ist mir beim Versuch das Problem zu lösen zwischenzeitlich auch schon beim Lesen untergekommen, dessen war ich mir anfänglich nicht bewusst und ich habe auch nicht vermutet, dass es ein schwieriges Problem ist.

Also gut, vielleicht sollte ich das an der Stelle als "etwas dazu gelernt" abhaken und die DB auf klassischem Weg mit Beziehungen versuchen aufzubauen. Dann kann ich auch mehr von den vorhandenen Lösungen/Codes etc. profitieren.

Vielen herzlichen Dank für die hilfreichen Hinweise!

Viele Grüße steho80

MzKlMu

Hallo,
Zitatnur als Basis für die Nachschlagefelder einzusetzen um nicht Wertelisten mit 20+ Werten zu nutzen.
Nachschlagefelder und Wertelisten sind ja unabhängig. Nachschlagefelder sollten nur in Formularen (als Kombinationsfelder) eingesetzt werden. Und da kannst Du dann völlig problemlos auch Tabellen als Datenherkunft benutzen bzw. solltest Tabellen benutzen. Wertelisten sind viel zu unflexibel. Ich würde noch nicht mal für 2 Werte eine Werteliste benutzen.
Gruß
Klaus