Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Username am August 16, 2013, 08:27:48

Titel: Mehrwertige Felder als Filterkriterium (VBA)
Beitrag von: Username am August 16, 2013, 08:27:48
Schönen guten Morgen! ;)

Ich habe mal eine Frage zu den mehrwertigen Feldern von Acc2010.
Ich habe mir schon einiges zu dem Thema durchgelesen und bisher viel schlechtes gehört.
Ich habe in einer Tabelle ein Feld Taetigkeit, dass mehrere Werte enthalten darf. Ich habe nach langem stöbern und probieren folgende Funktion für einen Formularfilter gebastelt:
Private Sub bt_weiter_Click()

  Dim Criteria As String
  Dim Criteriam As String
  Dim i As Variant
  Dim h As Variant

  '1. Build criteria string from selected items in list box.
  Criteria = ""
  For Each i In Me.lst_Firma.ItemsSelected
     If Criteria <> "" Then
        Criteria = Criteria & " OR "
     End If
     Criteria = Criteria & "FirmaID_F=" _
      & Me.lst_Firma.Column(0, i) & ""
  Next i
 
  '2. Build criteria string from selected items in list box.
  Criteriam = ""
  For Each h In Me.lst_Taetigkeit.ItemsSelected
     If Criteriam <> "" Then
        Criteriam = Criteriam & " OR "
     End If
     Criteriam = Criteriam & "TaetigkeitID_F=" _
      & Me.lst_Taetigkeit.Column(0, h) & ""
  Next h


  ' Filter the form using selected items in the list box.
  Me.txtFirma = Criteria & ";" & Criteriam
  'Forms!frmPersonalstammdaten![FirmaID_F].FilterOn = True
  DoCmd.OpenForm "frmPersonalstammdaten", , , Criteria & " And " & Criteriam
End Sub


Nach der Firma zu filtern ist kein Problem (ich lösche unnötige Zeilen zum Testen natürlich raus ;)). Bei der Taetigkeit wird es aber schwieriger. Wenn ich im gefilterten Formular aus der Entwurfsansicht in die Formularansicht wechsle, erscheint die Meldung "Das mehrwertige Feld TaetigkeitID_F kann nicht in einer WHERE-Clause verwendet werden.
In der Datenblattansicht eines Formulars kann man mithilfe der Filterfunktionen ja auch mehrwertige Felder filtern. Was an dem Code muss anders, damit es klappt / warum funktioniert es nicht per VBA? ::)

Danke!
Titel: Re: Mehrwertige Felder als Filterkriterium
Beitrag von: MzKlMu am August 16, 2013, 08:38:32
Hallo,
ZitatIch habe mir schon einiges zu dem Thema durchgelesen und bisher viel schlechtes gehört.
das schlechte überwiegt, richte Dich danach.
Diese mehrwertigen Felder sind ein Marketinggag von Microsoft um Einsteigern den Umgang mit n:m Beziehungen scheinbar zu erleichtern. Im ersten Moment ist das auch so, aber wenn man dann auswerten muss geht der Kampf los.
Verzichte auf solche Felder (verwende auch keine einfachen Nachschlagefelder). Solche Felder verhindern den sauberen Aufbau einer DB.

Siehe hierzu:
http://dbwiki.net/wiki/Access_Anf%C3%A4nger:_Die_Nachteile_von_Nachschlagefeldern (http://dbwiki.net/wiki/Access_Anf%C3%A4nger:_Die_Nachteile_von_Nachschlagefeldern)
gilt in verschärfter Form auch für Mehrwertfelder.

Zu Deinem Problem kann ich leider nichts sagen, ich habe solche Felder noch nie verwendet, habe also keine Erfahrung damit.
Titel: Re: Mehrwertige Felder als Filterkriterium
Beitrag von: Username am August 16, 2013, 08:45:11
Hey MzKlMu
Ich habe mir deine Beiträge darüber in anderen Foren schon durchgelesen und verstehe auch, warum diese Felder Blödsinn sind. Aber Access kann doch grundsätzlich mehrwertige Felder filtern. Ist das ganze nur auf Makro-Eben möglich oder auch per VBA. Ich denke kaum, dass MS sich den Schnitzer erlaubt und eine Funktion implementiert, die keiner richtig benutzen kann :D
Titel: Re: Mehrwertige Felder als Filterkriterium
Beitrag von: MzKlMu am August 16, 2013, 09:06:36
Hallo,
ZitatIch denke kaum, dass MS sich den Schnitzer erlaubt und eine Funktion implementiert, die keiner richtig benutzen kann
das möchte ich bezweifeln.
Anbei mal eine Link zu einer Microsoftseite.

http://office.microsoft.com/de-de/access-help/verwenden-von-mehrwertigen-feldern-in-abfragen-HA010149297.aspx (http://office.microsoft.com/de-de/access-help/verwenden-von-mehrwertigen-feldern-in-abfragen-HA010149297.aspx)

Langer Text, in dem Mikrosoft Link. Der eigentlich alles sagt, nämlich nicht verwenden. Das muss man alles erst gar nicht wissen, wenn man auf die Mehrwertfelder verzichtet und zwar nicht weil man auf Neues verzichten soll, sondern weil eine ganz normale n:m Beziehung die deutlich einfachere, übersichtlichere und bei vielen Datensätzen wahrscheinlich auch mit Abstand die schnellste Lösung ist. Je mehr ich den MS Artikel lese um so mehr bin ich dieser Überzeugung.
Und noch etwas sollte man bedenken, die können ja nicht die eigene Erfindung schlecht reden.
Titel: Re: Mehrwertige Felder als Filterkriterium
Beitrag von: Username am August 16, 2013, 09:16:50
 :D :D :D
Den Text habe ich mir gestern auch schon angetan.
ZitatUnd noch etwas sollte man bedenken, die können ja nicht die eigene Erfindung schlecht reden.
Wäre nicht die erste MS-Erfindung, die Kritik erntet ;D
Dann ist das Thema wohl beendet ;)
Danke
Titel: Re: Mehrwertige Felder als Filterkriterium
Beitrag von: ebs17 am August 16, 2013, 11:25:48
Einen Gedanken könnte man aber noch anfügen:

Stelle Dir vor, Deine Datenbank wird erfolgreich. Ein schrecklicher Gedanke.

Die Nutzung führt dazu, dass die Datenbank in eine kritische Größe kommt und/oder in intensiven Mehrnutzerbetrieb gehen soll. Ein Umstieg auf einen SQL Server oder ein anderes aktives DBMS wird notwendig. Diese kennen aber solche Sonderfeatures nicht. Wer würde eine gewachsene große DB im laufenden Betrieb umstellen wollen und das bezahlen?

MfGA
ebs
Titel: Re: Mehrwertige Felder als Filterkriterium (VBA)
Beitrag von: Username am August 16, 2013, 11:41:19
Ich habe das ganze aus Neugierde mal weiter verfolgt und auch eine Lösung gefunden:
Private Sub bt_weiter_Click()

   Dim Criteria As String
   Dim Criteriam As String
   Dim i As Variant
   Dim h As Variant

   '1. Build criteria string from selected items in list box.
   Criteria = ""
   For Each i In Me.lst_Firma.ItemsSelected
      If Criteria <> "" Then
         Criteria = Criteria & " OR "
      End If
      Criteria = Criteria & "FirmaID_F=" _
       & Me.lst_Firma.Column(0, i) & ""
   Next i
   
   '2. Build criteria string from selected items in list box.
   Criteriam = ""
   For Each h In Me.lst_Taetigkeit.ItemsSelected
      If Criteriam <> "" Then
         Criteriam = Criteriam & " OR "
      End If                    '>Guck mal hier<
      Criteriam = Criteriam & "TaetigkeitID_F.Value= " & Me.lst_Taetigkeit.Column(1, h) & ""
   Next h


   ' Filter the form using selected items in the list box.
   Me.txtFirma = Criteriam
   DoCmd.OpenForm "frmPersonalstammdaten", , , Criteria & " And " & Criteriam
End Sub

Die Werte in Mehrfachwertfeldern lassen sich per Feld.Value ansprechen und auch mit mehreren Daten für eine Zeile in einer Zeile auslesen. Wer ein Projekt erstellt, dass nicht gerade
Zitatin eine kritische Größe kommt und/oder in intensiven Mehrnutzerbetrieb gehen soll
oder
ZitatEin Umstieg auf einen SQL Server oder ein anderes aktives DBMS
geplant ist, immerhin eine Lösung.

@ebs17:
ZitatStelle Dir vor, Deine Datenbank wird erfolgreich. Ein schrecklicher Gedanke.
Jetzt mal nicht gleich persönlich werden. Verstehe ich vllt. falsch, aber jeder fängt mal an! :(

LG Username
Titel: Re: Mehrwertige Felder als Filterkriterium (VBA)
Beitrag von: MzKlMu am August 16, 2013, 11:47:20
Hallo,
das Zitat von ebs hast Du völlig in den falschen Hals bekommen. Der schreckliche Gedanke bezog sich ganz sicher auf den durch eine erfolgreiche DB möglicherweise erforderlichen Umstieg auf ein anderes aktives DBMS. Denn mehrwertige Felder gibt es nur bei Access. Eine solche Accessdatenbank ist völlig inkompatibel mit anderen Datenbanksystemen und muss in n:m umgebaut werden.
Titel: Re: Mehrwertige Felder als Filterkriterium (VBA)
Beitrag von: Username am August 16, 2013, 11:51:13
Alles klar ;)
Titel: Re: Mehrwertige Felder als Filterkriterium (VBA)
Beitrag von: DF6GL am August 16, 2013, 12:00:25
Hallo,

nochmal zu den Mehrwertfeldern:

ZitatEnd If                    '>Guck mal hier<     
Criteriam = Criteriam & "TaetigkeitID_F.Value= " & Me.lst_Taetigkeit.Column(1, h) & ""


funktioniert nur solange, wie es eine sichtbare Nachschlagtabelle(auf der das Listenfeld beruht) gibt.  Beruhen die "Mehrwerte"  auf einer Wert-Liste, dann ist die dazugehörende (von Access intern erzeugte)  Nachschlagtabelle in der Urschleimsuppe von Access verschwunden (nur als "TabellenID" erkennbar) , so dass der erforderliche ID-Wert für einen Vergleich nicht mehr erreichbar ist.