Filtern über mehrere Spalten funktioniert nich richtig

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von KSE.

    Filtern über mehrere Spalten funktioniert nich richtig

    Hallo zusammen,

    ich möchte ein Datagridview mit Werte aus einer DB befüllen und nach einzelnen/mehreren Spalteneinträge filtern.

    Die Filtereinträge werden über eine Combobox angewählt. Es werden bis zu 3 Spalten auf einen bestimmten Wert überprüft. Wenn ich jetzt bspw. nur nach der 1 Spalte filtern will werden nicht alle Einträge angezeigt die erscheinen müssten.

    Irgendwie steh ich auf dem Schlauch...


    SQL:
    Spoiler anzeigen


    SQL-Abfrage

    1. SELECT IDBarcode, Name_Messgerät, PM_MM_Auswahl, PM_MM_Nummer, Naechstes_Kalibrierdatum, Art_des_Messgeraetes, Einsatzgebiet, Bemerkung,
    2. ID_Hersteller, ID_Kalibrierinstitut, Ist_TDAP_Prüfmittel, Interne_Kalibrierung, Ist_bei_Kalibrierung
    3. FROM tbl_PM_MM_Daten
    4. WHERE (PM_MM_Auswahl LIKE '%' + @PM_MM_Auswahl + '%') AND (Art_des_Messgeraetes LIKE '%' + @Art_des_Messgeraetes + '%') AND
    5. (Einsatzgebiet LIKE '%' + @Einsatzgebiet + '%')




    Hat jemand einen Tipp für mich?
    Gruß von der KSE

    ks-entwicklung.de
    Sind es so viele Daten das du diese jedes mal neu abfragen musst, oder könntest du einfach einmal alle Datensätze laden und diese dann bei dir direkt Filter? Aber egal, nur ein Vorschlag und tut hier nichts zur Sache. ;)

    Was passiert mit dem Statement wenn du nur noch nach einer Spalte filterst? Fliegen die anderen Parameter raus, oder wird einfach ein leerer String eingefügt?

    lg.
    lg.

    LucaWelker
    Deinen Vorschlag werde ich mir definitv noch durch den Kopf gehen lassen. Macht eigentlich Sinn nicht dauerhaft die DB abzufragen, wenn die Daten ja eh schon eingelesen sind.

    Dennoch will ich wissen was ich jetzt gerade falsch mache. Es wird für die restlichen zwei Spalten "" eingefügt.Also einen leeren String. Muss ich dann DBNull.value machen?
    Gruß von der KSE

    ks-entwicklung.de
    Ich denke nicht das es an der Art liegt.

    "%" sind "Joker"-Zeichen bei MySql oder? Um was für eine Datenbank handelt es sich denn?
    Unter MsSql sind die "Joker"-Zeichen glaub ich "*". Bin mir aber nicht sicher.

    lg.
    lg.

    LucaWelker
    xtts02 du hattest recht.

    Wenn ich meine Bindingsource via Code so filtere wie du es geschrieben hast funktioniert das einwandfrei. Ich habe/ wollte eigentlich die ganzen Datenbankzugriffe etc. über den Abfrage-Generator im Datasetdesigner realisieren. Wenn ich es dann so schreibe wie du erkennt der Generator das Eingabefeld @PM_MM_Auswahl nicht. Versteh ich ehrlich gesagt nicht warum....
    Gruß von der KSE

    ks-entwicklung.de
    Ich weiß nicht, ob meine Vorstellung zu laienhaft ist, aber:
    1. Ich würde die Abfrage nicht im Designer, sondern über die Filtereigenschaft der BindingSource machen (sparste dir den ganzen Select-Kram und hast alle Felder zur Verfügung).

    2. Ich würde das Zusammenfrickeln der Filterbedingung in eine separate Funktion packen, die die von allen drei Combos bei .ValueChanged aufgerufen wird und dann die Zustände aller Comboboxen checkt und danach die Bedingung zusammenstellt:

    VB.NET-Quellcode

    1. If Not combo1.text = "" then
    2. 'Hier Abfragepart combo1 formulieren
    3. End if

    Rückgabewert der Funktion wäre dann die Filterbedingung. Ist vielleicht nicht die professionellste Variante, funktioniert bei mir aber eigentlich immer ganz gut.
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    Du könntest die Daten auch einfach komplett einladen und zwischen dem DataSet/DataTable und dem DataGridView ein DataView zwischen hängen.
    Das DataView hat auch die Möglichkeit einen RowFilter zu bestimmen. Ich mache das so und filtere meine Liste mit 5 Comboboxen und einer Textbox für einen allgemeinen Suchbegriff. Das klappt wunderbar und du greifst nicht jedes mal auf die DB zu.

    VB.NET-Quellcode

    1. Friend DataView_Tabellenname As New DataView(DataTable_Tabellenname)
    2. '
    3. BindingSource_Tabellenname.DataSource = DataView_Tabellenname
    4. BindingNavigator_Tabellenname.BindingSource = BindingSource_Tabellenname
    5. DGV_Tabellenname.DataSource = BindingSource_Tabellenname
    6. '
    7. DataView_Tabellenname.RowFilter = "Spalte1 LIKE '%" & ComboBox1.Text & "%' AND Spalte2 LIKE '%" & ComboBox2.Text & "%'"


    So in etwa könnte das aussehen.
    Das mit der Bindingsource funktioniert auch. Das habe ich hinbekommen.

    Ich will mir einfach die Schreibarbeit ersparen, deswegen wollte ich es über den Desinger machen.

    In vielen Videotutorials wird die DB Geschichte über den Designer realisiert, also wieso coden?
    Gruß von der KSE

    ks-entwicklung.de
    Das was ich dir geschrieben hatte, kannst du mit dem Designer benutzen. Du fügst per Code lediglich das DataView ein und kannst dort dann bequem mit einer Zeile (DataView.RowFilter = ...) deine Daten filtern. Du greifst dabei halt nicht ständig auf die DB zu.
    Mit dem DataView kannst du z.B. auch direkt sortieren.
    Du musst das nicht in ein dataview laden. Geht doch genauso gut direkt über die bindingsource?!

    Ich werde es jetzt auch so realisieren. Da kommt mir schon das nächste Problem auf.

    Wenn ich nur nach einer Spalte sortiere und die restlichen Filter (comboboxen) leer lasse werden die Zeilen ohne Inhalt, der nicht gefilterten Spalten,nicht angezeigt.

    Zum besseren Verständnis:

    VB.NET-Quellcode

    1. PM_MM_Auswahl='Prüfmittel' AND Art_des_Messgeraetes LIKE '%%'AND Einsatzgebiet LIKE '%%'


    Liegt das daran, dass ich ein leeren String für die nicht benutzten Filterspalten übergebe ?
    Gruß von der KSE

    ks-entwicklung.de

    KSE schrieb:

    In vielen Videotutorials wird die DB Geschichte über den Designer realisiert, also wieso coden?
    Würde ich auch immer so machen, vor allem, wenns darum geht, das DataSet zusammenzustellen usw. Aber bei den Filtergeschichten fand ich als relativer Newbie die BindingSource.Filter-Sache handhabbarer. ;) Bin mit der Parameterübergabe usw. noch nicht so richtig warm.

    KSE schrieb:

    Liegt das daran, dass ich ein leeren String für die nicht benutzten Filterspalten übergebe ?
    Sieht so aus. Deswegen würd ich die Combos in einer Funktion abchecken und nur die in meinen Such-String aufnehmen, die tatsächlich was beinhalten.
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    Hallo zusammen,

    liegt vielleicht mein Fehler im SQL-String? Ich Filtere bspw. nach Prüfmittel. Jetzt sollte ich eigentlich alle Prüfmittel angezeigt bekommen, auch die ohne Einsatzgebieeintrag.

    Ist leider nicht der Fall, es werde nur die mit Einträgen im Einsatzgebiet angezeigt.

    Hab mal ein Bild angehängt für das bessere Verständnis.

    Und noch der SQL-String:

    SQL-Abfrage

    1. SELECT IDBarcode, Name_Messgerät, PM_MM_Auswahl, PM_MM_Nummer, Naechstes_Kalibrierdatum, Art_des_Messgeraetes, Einsatzgebiet, Bemerkung,
    2. ID_Hersteller, ID_Kalibrierinstitut, Ist_TDAP_Prüfmittel, Interne_Kalibrierung, Ist_bei_Kalibrierung
    3. FROM tbl_PM_MM_Daten
    4. WHERE (PM_MM_Auswahl LIKE N'%' + @PM_MM_Auswahl + N'%') AND (Art_des_Messgeraetes LIKE N'%' + @Art_des_Messgeraetes + N'%') AND
    5. (Einsatzgebiet LIKE N'%' + @Einsatzgebiet + N'%')
    Bilder
    • Unbenannt.png

      51,8 kB, 854×1.000, 200 mal angesehen
    Gruß von der KSE

    ks-entwicklung.de

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KSE“ ()

    Bist du sicher, dass dein "N" auch hinter den Text gehört ? Soweit ich weiß wird das "N" für Unicode-Zeichen NUR voran gestellt. ...wofür auch immer du das brauchst...

    Am Einfachste wäre es wie Marsianer in #13 schon erwähnt hat, deine "WHERE" Anweisung dynamisch zu gestalten. Soll heißen, dass in der "WHERE" Klausel auch nur das drinne steht, wo auch in den Combos was ausgewählt ist und nix mit nem leeren String. Ausserdem dachte ich, du wolltest nicht immer auf die DB zugreifen und das über die BindingSource machen ?
    bei dem dynamischen sollteman aber mit DBParametern arbeiten (was eine designergenerierte Query von Haus aus tut).
    Wichtig auch der Datentyp, weil Like kann man nur auf Stringse anwenden.

    Aber lassn ruhig nochne Weile rumprobieren - das verdeutlicht umso mehr die Qualität der einfachen Lösung ;)