Catch All für parametisierte Abfrage

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von MaThoPa1973.

    Catch All für parametisierte Abfrage

    Hallo Leute,
    ich hätte da mal ein Problem und hoffe hier einen Hinweis zu erhalten.

    Ich suche für eine Parameterabfrage einen "Catch All", heißt, dass wenn für einen Parameter nichts, bzw. der "Catch All" angegeben wird, die Abfrage, im Bezug auf diesen Parameter alle Ergebnisse anzeigt - also dieses Feld quasi nicht mehr in der Abfrage als Kriterium berücksichtigt.

    Hintergrund ist, dass ich für eine Reportfunktion vielzählige Abfragen durchführen muss. Und für jede einzelene Kombinationsmöglichkeit eine Abfrage im DataSet zu erstellen finde ich da ein wenig umständlich.

    Gibt es da eine solche Funktion bzw eine Zeichenkombination die man diesbezüglich anwenden kann? Unabhängig ob z.B. ein Boolean-Wert, ein String oder ein Date/Time nicht als Kriterium berücksichtigt wird? Ich habe jetzt schon versucht und gesucht - bin jedoch leider nicht fündig geworden.

    Danke vielmals für Eure Hilfe.
    Gruß
    Markus
    wüsstenich, dass das geht.

    in DBExtensions hat man die Möglichkeit, Where oder InnerJoin - Abschnitte wieder dynamisch zu formulieren, ohne deshalb in Stringgefrickel absinken zu müssen.

    Aber tatsächlich zweifel ich, obs wirklich nötig ist. Kannst du mal ein paar Sql-Beispiele bringen, die die erforderliche Variationsbreite andeuten?
    Vlt. kann man gucken, ob man das unter einen Hut kriegt.
    Hallo ErfinderDesRades,
    also, ich habe im typisierten Dataset eine Abfrage erstellt, in der ich quasie für fast alle Felder einen Parameter angeben muss. Mein Ziel ist es diese Abfrage so oft wie möglich zu nutzen in dem ich dann z.B. für bestimmte Felder nur einen Parameter angebe und die übrigen Felder dann nicht mehr gefilter werden sondern alle Werte einbeziehen und anzeigen.

    Beispiel:
    Projektnummer (alle die mit P beginnen)
    Zeit Eingang (alle deren Eingang nach dem 01.03.2012 aber vor dem 15.03.2012 waren, bei einer anderen Abfrage andere Zeiten)
    Status (alle die noch offen sind ein anderes mal alle die in Bearbeitung oder erledigt sind)
    1. Versuch
    2. Versuch
    3. Versuch
    Bearbeitet durch (Anwender um auszuwerten wer wie viele gemacht hat)

    Und so weiter.

    Je nach Abfragetyp sind andere Parameter erforderlich, aber bei der Vielzahl an Abfragetypen und Kombinationsmöglichkeiten würde das eine emense Menge an Abfragen sein die ich erstellen müsste. Schöner wäre es da einen "Catch All" (oder wie auch immer man den nennen will) einsetzen könnte. Man bräuchte immer nur ein und die selbe Abfrage und könnte individuell die Parame´ter angeben.

    Ich hoffe, mein Problem ist verständlich rüber gekommen.

    Andere Alternative wäre, wenn man die Daten komplett in ein DGV lädt und dann dort filter jedoch bekomme ich das mit dem Filtern mit dem Datum (Nach bestimmten Datum und vor bestimmten Datum nicht hin). Den Filter auf ein Feld zu setzen und z.B. alle Datensätze anzeigen lassen deren Projektnummer mit P anfängt zu Filtern wäre nicht das Problem. Dazu nutze ich folgenden Code.

    VB.NET-Quellcode

    1. Private Sub txt_Linie_TextChanged(sender As System.Object, e As System.EventArgs) Handles txt_Linie.TextChanged
    2. Dim Linie = From Namen In Me.ATAS_DBDataSet1.ATAS_CB.AsEnumerable() _Where Namen.Field(Of String)("PROJEKT_ID").ToString.Contains(Me.txt_Linie.Text) _Select Namen
    3. dgv_CB.DataSource = Linie.AsDataView()
    4. End Sub

    Aber wie kann ich hier dann mehrere Felder einbeziehen und wie zum Henker mache ich das mit dem Datum um nur die Datensätze für einen bestimmten Zeitraum zu erhalten?

    Danke für die Hilfe.
    Gruß
    Markus
    jo, du willst also tatsächlich die eierlegende Wollmilchsau.

    also alle Parameter abfragen, aber auch weniger, und jeden Parameter kann man ja auch verschieden abfragen, mit =, <, >, Like, Between und was einem sonst noch für Operatoren einfallen.

    Geht natürlich mit generierten TableAdaptern nicht.

    ABer mir scheint, du fragst nach 2 verschiedenen Dingen: Einmal nach einem Filter über eine DataTAble, zum andern nach der WollmilchSau-Query an die Datenbank.

    Entscheide dich bitte für eine Frage.

    Und bezüglich der Datumse: Ist in deiner DB das Datum ühaupt als Date hinterlegt, oder isses dort als Text gespeichert (dann hätteste zunächstmal ein Design-problem zu lösen)?
    Hallo,
    also das Datum ist in der Datenbank ganz klar als Date/Time hinterlegt - so wie es sich gehört.

    Und nein, ich rede hier von ein und dem selben Problem - vielleicht unglücklich formuliert.
    Am liebsten wäre mir eine Abfrage im DataSet die Parameter erfordert, ich aber eine Möglichkeit finde, dass wenn für ein Feld kein Parameter (oder eben eine Catch All-Funktion) eingebe, dieses Feld als Kriteirum nicht berücksichtigt wird.

    Das mit dem Filtern eines Datagridviews erscheint mir, da es offensichtlich keine Catch All-Möglichkeit für TableAdapter gibt, als einzige Möglichkeit die Vielzahl der Abfragen die erforderlich sind halbwegs gescheit umzusetzen und mit Select Case, If und For Next Prozeduren in einen halbwegs übersichtlichen Code zu verpacken.

    Was jedoch das Filtern eines DataGridViews betrifft kommt eben das Problem auf, dass bei oben dargestellten Verfahren es nicht möglich ist die Datumsgrenzen entsprechend zu setzen - zumindest hat sich mir der Weg dahin noch nicht erschlossen.

    Generiere ich eine Abfrage im TableAdapter und setze dort in den Feldern entsprechend ein = > oder < (<= ?, >= ?, = ?) ein ist eine Parameterangabe erforderlich. Und da suche ich eben nach einem Catch All.

    MaThoPa1973 schrieb:

    Was jedoch das Filtern eines DataGridViews betrifft kommt eben das Problem auf, dass bei oben dargestellten Verfahren es nicht möglich ist die Datumsgrenzen entsprechend zu setzen - zumindest hat sich mir der Weg dahin noch nicht erschlossen.

    Versteh ich nicht.

    VB.NET-Quellcode

    1. myBindingSource.Filter = string.Concat("Datum >= ", datum1, " AND Datum <=", datum2)
    Also manmuss gugge, dass man die Datumse mit InvariantCulture nach String konvertiert, aber wirklichn Prob sehe ich da nicht.

    Aber bitte klare Begriffe: "Abfrage im Dataset" gibts nicht, und "DatagridView filtern" auch nicht.. Man kann Datenbanken abfragen, oder man kann BindingSources filtern - alles annere ist Wirrsal.

    Auch "Catch All" ist sprachlich daneben, das erinnert ans TryCatch-Problem - dabei hats nix damit zu tun. Du meinst eine "Match All" - Formulierung für Filter- oder Abfrage-Parameter, aber da gibts keine allgemeingültige Patentlösung.

    MatchAll - kommt ja immer auf den Operator an, bei Integer und '<' ist ein MatchAll-Parameter einfach: nimm Integer.MinValue. Aber mit Like und schon mit '=' isses nichmehr so trivial.

    Aber man kann sich Hilfsmethoden basteln, die einem das abnehmen. Heraus käme sowas wie:

    VB.NET-Quellcode

    1. myBindingSource.Filter("Datum >= ? AND Datum <= ?", datum1, datum2)
    So eine Extension-Methode würde die String-Frickeleien generisch ein für allemal abhandeln, und du kannst dann lesbaren Code schreiben.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo Erfinder,
    habe jetzt in der Zwischenzeit auch die Lösung mit den Hilfsmethoden gebastelt und es funktioniert wunderbar. Anstatt das DGV zu filtern (siehe Quellcose meines ersten Posts zu diesem Thema) habe ich mich dann auch entschieden die Filtereigenschaft der Bindingsource mir zu nutze zu machen. Und die Möglichkeit dieses mit den Hilfsmethoden durchzuführen gibt einem dann auch eine recht gute Übersicht.

    Dennoch Danke vielmals für Deine Bemühungen.

    Gruß
    Markus