Idee für Dynamisches Filter-Element

koppelschoof

Mitglied
Hallo zusammen,

ich würde gerne für eine Kundenverwaltung eine Dynamische Suchmaschine basteln. Mein problem ist nicht die dynamische Abfolge der Such-Parameter sondern eher die grafische Umsetzung.

Ich wollte das in etwa so machen wie bei Opera's Email-Filterung: KLICK MICH

Hat jemand eine Idee wie man das unkompliziert erstellen und steuern kann?

Ich brauch keine Code-Beispiele sondern nur eine gewisse Grundidee.

(Falls es hilft - ich nutze .NET )
 
Worauf basiert denn die Kundenverwaltung? SQL?

Dann könntest du ja die verschiedenen Spalten einer Tabelle in der ersten Combobox anzeigen, dann für verschiedene LIKEs so Sachen wie "beginnt mit", "beinhaltet", "endet mit", und dann dahinter noch eine TextBox mit einer Benutzereingabe. Daraus kannst du dann ja relativ leicht eine Abfrage basteln, die du an den SQL-Server schickst.

EDIT: Oh, da bin ich ja etwas am Ziel vorbeigeschossen...
Wie wäre es mit einer Klasse, in der du Spaltenname, das Mittlere und die Eingabe speicherst und dann ToString() überschreibst, um für die ListBox eine schöne Ausgabe zu bekommen?
 
ja da hängt ne SQL Datenbank hinter

aber ich mache das nicht mit zusammgesetzten SQL-Statements sondern mit dem .NET LINQ

also wie gesagt, das "Backend" also die reine Datenabfrage habe, ich wills nur vom gestalterischen ähnlich haben wie beim Opera-Filter

habe es jetzt mal mit nem DataGridView ausprobiert - aber kann noch nicht sagen ob das so optimal ist.
 
Also, ich hab hier mal meine GUI die so ganz gut Funktioniert

KLICK

Dort ist zu sehen, dass ich versuche, durch Verschachtelung eine Suchabfrage zu machen.

Dabei gehe ich so vor, dass ich pro SuchFilter-Zeile ein SQL-SELECT mache und das dann mit UNION("Oder") bzw. INTERSECT("Und") mit dem nächsten verbinde (also ganz normale Mengenlehre) Sodass sowas in etwa diesem Schema entspricht:

(Select0) INTERSECT ((Select1) UNION (Select2)) INTERSECT (Select3) INTERSECT (Select4)

Die Klammerung von Select1 und 2 soll durch die Begriff "[Ebene runter]" bzw "[Ebene hoch]" geschehen.

Das klappt auch bisher - jedoch nur das "[Ebene runter]" - also das zurückgehen in die höhere Ebene gelingt mir nicht. Anstatt des Schemas weiter oben kommt folgendes:

(Select0) INTERSECT ((Select1) UNION (Select2) INTERSECT (Select3) INTERSECT (Select4))

Die Klammerung geschieht also mit allen Nachfolgenden.

Hier ist mein Code für die Funktion (in VB.NET - denke mal, das ist kein Prob. für euch ;) )

Code:
 Private Function filterSearch(ByVal index As Int16, Optional ByVal level As String = "same")
        'index gibt die aktuelle Zeile in der Tabelle an
        'level gibt weiter ob eine Verschachtelung beginnt (oder endet(?))

        Dim sql As String = ""
        'Aktuelle Zeile wird durch index aus der Tabelle/DataGridView dgvSearchEditor aufgerufen
        Dim searchParam As DataGridViewRow = dgvSearchEditor.Rows.Item(index)
        'Logische Verknüpfung (Und/Oder)
        Dim logic = searchParam.Cells.Item(0).Value
        'Eigenheit des DataGridView eine neue Zeile zu erstellen wird abgefangen
        Dim nextRowNew = dgvSearchEditor.Rows.Item(index + 1).IsNewRow

        If searchParam.IsNewRow Then
            Return ""
        Else
            Select Case searchParam.Cells.Item(1).Value
                Case "Tags"
                    sql = "Tags " & index
                Case "Postleitzahl"
                    sql = "Plz " & index
                Case "Seminare-Tags"
                    sql = "S-Tags " & index
                Case "[Ebene runter]"
                    sql = filterSearch(index + 1, "down")
                Case "[Ebene hoch]"
                    sql = filterSearch(index + 1)
                    level = "up"
                Case Else
            End Select
            Select Case level
                Case "same"
                    Select Case logic
                        Case "Und"
                            If nextRowNew Then
                                Return " INTERSECT (" & sql & ")"
                            Else
                                Return " INTERSECT (" & sql & ")" & vbCrLf & filterSearch(index + 1)
                            End If
                        Case "Oder"
                            If nextRowNew Then
                                Return " UNION (" & sql & ")"
                            Else
                                Return " UNION (" & sql & ")" & vbCrLf & filterSearch(index + 1)
                            End If

                        Case Else
                            Return ""
                            Throw New ApplicationException("Keine logische Verknüpfung in Filter in Zeile " & index + 1)
                    End Select
                Case "down"
                    If nextRowNew Then
                        Return "(" & sql & ")"
                    Else
                        Return "(" & sql & ")" & filterSearch(index + 1)
                    End If
                Case "up"

                    Return ""

            End Select
        End If
    End Function
 
Zurück