BindingSource.Filter for Varchar Values

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    BindingSource.Filter for Varchar Values

    Hallo an alle! :)

    Habe zur Zeit ein kleines Problem bezüglich das Filter von einem DataSet nach PLZ. D.h. anzeigen Entries von PLZ "X" bis PLZ "Y".
    Die Spalte in der DB ist VarChar und dadurch kann ich nicht (oder weiss ncht wie) mittel BindingSource.Filter so was machen:

    VB.NET-Quellcode

    1. AdrKommBindingSource.Filter = $"Plz>='{dialog.VonPlz}' AND Plz<='{dialog.BisPlz}'"


    Das wäre das komplette Filter-Code zur Zeit:

    VB.NET-Quellcode

    1. Dim dialog As New FrmSelectFilterPLZ()
    2. Dim result As DialogResult = dialog.ShowDialog(Me)
    3. If result = DialogResult.OK Then
    4. If dialog.FilterType = True Then
    5. 'TODO: FIX & Test----Nur richtig wenn PLZ nur Nummern beinhaltet
    6. AdrKommBindingSource.Filter = $"Plz>={Math.Abs(dialog.VonPlz)} AND Plz<={Math.Abs(dialog.BisPlz)}"
    7. Else
    8. AdrKommBindingSource.Filter = $"Plz='{dialog.VonPlz}'"
    9. End If
    10. UpdateStatusAnzAdressen()
    11. End If


    Ich kriege dann so einen Fehler:
    System.Data.EvaluateException: "Die Operation '>=' kann nicht an System.String und System.Int32 durchgeführt werden."

    Was auch selbst verständlich ist....

    Geht das iwie oder solange die Spalte "Plz" in der DB vom Typ VarChar ist geht das nicht? Da in der DB Plz von der ganzen Welt gespeichert werden, kann ich nicht die Spalte als Int machen, da viele Länder Buchstaben auch darin haben .

    Ich hoffe jemanden kann mir kurz einen Tipp geben, da ich mich jetzt in Kries drehe und egal was ich ausprobiere kriegs nicht hin und mittlerweile blicke nicht mehr durch.

    Danke im Voraus und schönen Abend! :)
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.

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

    Sofern du wirklich alle PLZs in der Tabelle speichern willst, hast du das Problem, dass eine Überprüfung anders als erwartet gehandelt wird.
    Es wäre eine Möglichkeit, deiner Tabelle eine weitere Spalte hinzuzufügen (bzw. gleich eine neue Zuordnungstabelle) in der du die PLZ auf die Länder mappst, dadurch kannst du per

    Quellcode

    1. where country_id = <id>
    alle Daten holen, die auf jeden Fall nur aus Zahlen bestehen.

    Für die Abfragen der Buchstaben-PLZ im Range, gute Frage, müsstest du überprüfen wie dein Sql-Server reagiert, ich denke da wird alles alphabetisch verglichen.

    So in der Art würde ich das Problem lösen/umgehen.

    Ob es die optimale Lösung ist, sei einmal dahingestellt.


    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    @rgomez: Was erwartest Du denn bei AdrKommBindingSource.Filter = $"Plz>={Math.Abs(dialog.VonPlz)} AND Plz<={Math.Abs(dialog.BisPlz)} für ein Ergebnis, wenn Buchstaben drin sind? Der Betrag eines Textes ist doch Mus. btw: Wozu überhaupt den Betrag einer PLZ nutzen? Gibt es in Deiner PLZ-Sammlung ne negative PLZ? Reiner Textvergleich der DB-Inhalte.ToString() reicht doch, oder?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Danke erstmal für ihre Antworten :)
    @Acr0most
    das Problem ist, ich kann die DB nicht verändern...werde troztdem über eine ähnliche Alternative denken.

    @VaporiZed das war nur ein Versuch. Mein original Code hat keine Math.Abs Funktion. Also sieht so aus:

    VB.NET-Quellcode

    1. AdrKommBindingSource.Filter=$"Plz>={dialog.VonPlz} AND Plz<={dialog.BisPlz}"


    Die Variablen VonPlz und BisPlz (beide Ints) werden vom User eingegeben und da kommen nur Zahlen, denn das Filter soll nur für PLZ in DE, CH und AU gelten.
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.
    Nun, wenn der Filter dann doch nur für Zahlen gilt, würde ich wohl als ersten Schritt nen Textvergleich machen. Also dialog.VonPlz und BisPlz als String angeben oder eben ne andere String-Variable als Vergleich im Filter hernehmen. Als welch ein Datentyp kommt denn Deine VarChar im DataSet an? Object?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @xtts02 das werde ich mir mal grade anschauen.
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.

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

    rgomez schrieb:

    Die Spalte in der DB ist VarChar...
    Wieso denn nicht, bzw was passiert denn, wenn du es trotzdem machst?
    Der Datentyp inne Db ist auch irrelevant, wichtig ist der Datentyp der Dataset-Spalte, und wenn der String ist, dann finde ich dein code aus post#1 sieht garnet so verkehrt aus (also das 1. Snippet, das mit dem ...ABS(xy)... wäre bei Strings natürlich Unfug).