Allgemeines Handling von verschiedenen Filtern

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Lingo.

    Allgemeines Handling von verschiedenen Filtern

    Hallo leute,
    ich habe in meiner Hauptmaske verschiedene Unternehmen die ich über checkboxen an oder abwählen kann.
    Es sind 6 Checkboxen.
    Nun muss ich wenn die Daten aktualisiert oder die checkbox angeklickt wird jedes mal die Filter auswerten. Dies mache ich z.Z. noch über diverse if Abfragen. bei 6 checkboxen und den unterschiedlichen Kombinationen die möglich sind, kann man sich sicherlich vorstellen wie viele Ifs und unter Ifs das ergibt.
    Nun frage ich mich, ob man diese Abfrage von verschiedenen Filtern nicht irgendwie erleichtern kann.
    Wie handhabt ihr das?
    Grüße,
    @Rattenfänger mal so als Beispiel:

    VB.NET-Quellcode

    1. If BoolFilterL1 = True And BoolFilterL2 = False And BoolFilterL3 = False And BoolFilterWinLOG = False And BoolFilterFiBU = False And BoolFilterAndere = False Then
    2. cmd.CommandText = "SELECT K.ID, K.IERLEDIGT, K.THEMA, K.CRDATE FROM KONTAKTE AS K WHERE K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) OR UPPER(K.THEMA) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%') OR UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) AND K.ID_PROGRM=1 ORDER BY K.THEMA"
    3. ElseIf BoolFilterL1 = True And BoolFilterL2 = True And BoolFilterL3 = False And BoolFilterWinLOG = False And BoolFilterFiBU = False And BoolFilterAndere = False Then
    4. cmd.CommandText = "SELECT K.ID, K.IERLEDIGT, K.THEMA, K.CRDATE FROM KONTAKTE AS K WHERE K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) OR UPPER(K.THEMA) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%') OR UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) AND (K.ID_PROGRM=1 OR K.ID_PROGRM=2) ORDER BY K.THEMA"
    5. ElseIf BoolFilterL1 = True And BoolFilterL2 = True And BoolFilterL3 = True And BoolFilterWinLOG = False And BoolFilterFiBU = False And BoolFilterAndere = False Then
    6. cmd.CommandText = "SELECT K.ID, K.IERLEDIGT, K.THEMA, K.CRDATE FROM KONTAKTE AS K WHERE K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) OR UPPER(K.THEMA) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%') OR UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) AND (K.ID_PROGRM=1 OR K.ID_PROGRM=2 OR K.ID_PROGRM=3) ORDER BY K.THEMA"
    7. ElseIf BoolFilterL1 = True And BoolFilterL2 = True And BoolFilterL3 = True And BoolFilterWinLOG = True And BoolFilterFiBU = False And BoolFilterAndere = False Then
    8. cmd.CommandText = "SELECT K.ID, K.IERLEDIGT, K.THEMA, K.CRDATE FROM KONTAKTE AS K WHERE K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) OR UPPER(K.THEMA) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%') OR UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) AND (K.ID_PROGRM=1 OR K.ID_PROGRM=2 OR K.ID_PROGRM=3 OR K.ID_PROGRM=4) ORDER BY K.THEMA"
    9. ElseIf BoolFilterL1 = True And BoolFilterL2 = True And BoolFilterL3 = True And BoolFilterWinLOG = True And BoolFilterFiBU = True And BoolFilterAndere = False Then
    10. cmd.CommandText = "SELECT K.ID, K.IERLEDIGT, K.THEMA, K.CRDATE FROM KONTAKTE AS K WHERE K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) OR UPPER(K.THEMA) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%') OR UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) AND (K.ID_PROGRM=1 OR K.ID_PROGRM=2 OR K.ID_PROGRM=3 OR K.ID_PROGRM=4 OR K.ID_PROGRM=5) ORDER BY K.THEMA"
    11. ElseIf BoolFilterL1 = True And BoolFilterL2 = True And BoolFilterL3 = True And BoolFilterWinLOG = True And BoolFilterFiBU = True And BoolFilterAndere = True Then
    12. cmd.CommandText = "SELECT K.ID, K.IERLEDIGT, K.THEMA, K.CRDATE FROM KONTAKTE AS K WHERE K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) OR UPPER(K.THEMA) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%') OR UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252 '%" & strSUCHTEXT_Uebergabe & "%')) AND (K.ID_PROGRM=1 OR K.ID_PROGRM=2 OR K.ID_PROGRM=3 OR K.ID_PROGRM=4 OR K.ID_PROGRM=5 OR K.ID_PROGRM=6) ORDER BY K.THEMA"


    @Erfinder des Rades: Danke, werd ich mir mal anschauen!
    Offensichtlich musst du wohl als erstes ein klein Datenmodell deiner Filterei erstellen.
    Die Datensätze müssen enthalten:
    Include (bool)
    AbschnittText (string)
    Param (Object)
    Etwa in die Richtung:

    VB.NET-Quellcode

    1. Private Sub ExecuteQuery()
    2. Dim queryData As New List(Of Tuple(Of Boolean, String, Object))
    3. queryData.Add(Tuple.Create(BoolFilterL1, "UPPER(TEXT) LIKE UPPER(_win1252 ", CObj(strSUCHTEXT_Uebergabe)))
    4. queryData.Add(Tuple.Create(BoolFilterL2, "K.ID IN (SELECT DISTINCT ID_KONTAKT FROM STICHWORT WHERE (UPPER(TEXT) LIKE UPPER(_win1252 ", CObj(strSUCHTEXT_Uebergabe)))
    5. queryData.Add(Tuple.Create(BoolFilterL3, "UPPER(K.BESCHREIBUNG) LIKE UPPER(_win1252", CObj(strSUCHTEXT_Uebergabe)))
    6. '...
    7. Dim sql = "Select BlaBla Where False"
    8. For Each tpl In queryData
    9. If tpl.Item1 Then ' Bedingung trifft zu, also dieses Tuple in den Where-Abschnitt integrieren
    10. sql &= " OR (" & tpl.Item2 & "?)"
    11. cmd.Parameters.Add(tpl.Item3)
    12. End If
    13. Next
    14. 'command abfahren, mit DbParametern
    15. End Sub

    ja, und das kann ziemlich kompliziert werden.
    Ich hab jetzt die systematik deines Szenarios überhaupt nicht kapiert. Aber dementsprechend solltest du evtl. auch ein intelligenteres Datenmodell entwerfen, als nur eine Tupel-Liste.

    Was ganz wichtig ist: Tipp & Trick: DbParameter
    Ist sicherer gegen Programmierfehler, aber vor allem: sonst Sql-Injection!
    Nach langer Recherche habe ich nun herausgefunden, dass sich das ganze via Linq2Firebird realisieren lässt.
    Jedoch habe ich das ganze noch nicht richtig zum laufen bekommen.

    in die App.Conf muss scheinbar Folgende Zeile eingefügt werden:

    XML-Quellcode

    1. <connectionStrings>
    2. <add name="MyDatabase" connectionString="DataSource=localhost;Database=C:\Users\Username\Documents\Visual Studio 2013\Projects\WIKI\WIKI\bin\Debug\LokalMode\Test.FDB;User Id=SYSDBA;Password=masterkey" providerName="Firebird" />
    3. </connectionStrings>


    Und wie folgt im Programm genutzt werden:

    VB.NET-Quellcode

    1. Using db = New MyDatabaseDB()
    2. Dim q = From c In db.Customersc
    3. For Each c As var In q
    4. Console.WriteLine(c.ContactName)
    5. Next
    6. End Using


    Jedoch sagt mir Visual Studio "Der Typ MyDatabaseDB ist nicht definiert". ?(