Größenvergleich bzw. = vergleich als string

  • VB.NET
  • .NET 4.5

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

    Größenvergleich bzw. = vergleich als string

    Hallo Community,

    aktuell möchte ich eine aufgabe automatisieren, hier geht es darum verschiedene spalten zu vergleichen.
    Es können Spalten '=' '>' '<' sein. Da ich aber gefühlte 1'000'000 möglichkeiten gibt will ich das programmieren und die positiven vergleichoperatoren im string speichern.

    Als bsp.

    "(Spalte1 -2) <= (Spalte2)" wenn das zutrifft soll eine prozedur ausgeführt werden.
    den string zu erstellen habe ich keine probleme, jedoch habe ich probleme dabei die vergleichsoperatoren(ich hoffe das ist richtig) in eine If abfrage zu bekommen.

    Also wie bekomme ich es hin, aus einem string eine If Abfrage zu machen.

    das
    String = "(Spalte1 -2) <= (Spalte2)"


    zu das:

    VB.NET-Quellcode

    1. if cdbl(selectedrow("Spalte1")) - 2 <= cdbl(selctedrow("Spalte2")) then
    2. end if



    Gruß
    In welchem CE bist Du gedanklich gerade? Einem DGV? Mach mal bitte ein paar Beispiele, damit wir wissen, womit wir es zu tun haben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich arbeite in einer Datarow, SQL in Datatable etc. Die spaltenafrage ist kein problem, aber mit dem '>=' habe ich ein problem. Da select nicht geht!!! ich habe nur die Datarow.
    Ich möchte einen string auslesen. den ich splitte(wenn ihr bessere Ideen habt, gerne geben), und einen Spalten vergleich mache. Aber der Spaltenvergleich kann '>' '<' '=' '<=' kannn so sein, und hier habe ich mein problem.

    wie kann ich eine abfrage so gestallten.

    String = "('Spalte1 -2') (Operator '<=') ('Spalte2')"

    VB.NET-Quellcode

    1. if cdbl(selectedrow("Spalte1")) - 2 [operator] cdbl(selctedrow("Spalte2")) then
    2. end sub
    Dein Post verlangt ja nicht nur, einen String-Abschnitt in einen VergleichsOperator zu übersetzen, sondern einen anderen Abschnitt übersetzst du auch in eine Subtraktion.
    Da mach bitte lieber erst eine belastbare Anforderung, eh wir hier weiterdiskutieren.
    weil sonst kommen 2 Posts weiter noch Addition hinzu, dann Punkt-Rechnung, dann zusammengesetzte Ausdrücke, und man ist bei einem hübschen kleinen Mathe-Parser.

    Wie dem auch sei.
    Soo viel sind die Möglichkeiten von <, >, = nu auch nicht, es sind halt die von dir genannten 5 Optionen.
    Das kann man sogar mit einer einzigen Methode abfrühstücken, nämlich mit IComparable.Compare()
    < entspricht a.Compare(b)<0
    <= entspricht a.Compare(b)<=0
    > entspricht a.Compare(b)>0
    >= entspricht a.Compare(b)>=0
    = entspricht a.Compare(b)=0

    Such IComparable.Compare() im ObjectBrower und mit Google.
    @ErfinderDesRades Jou.
    @Rattenfänger Du musst hier unbedingt den Datentyp beachten.
    Einen String oder einen numerischen Ganzzahltyp zu vergleichen ist immer eindeutig.
    Bei Gleitkommazahlen besteht die Möglichkeit, dass da Unterschiede im Bereich 10^-17 oder so auftreten, je nach History der betreffenden Werte, da kann es sein, dass Du mit einem Epsilon vergleichen musst, um korrekte Aussagen zu bekommen:

    VB.NET-Quellcode

    1. If (Math.Abs(a - b) < EPSILON) Then MessageBox("Werte sind gleich")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    Rattenfänger schrieb:


    Ich arbeite in einer Datarow, SQL in Datatable etc...
    ...Da select nicht geht!!!


    Hi,
    wenn wir davon ausgehen, dass du mit "select nicht geht", eine Query auf die Datenbank meinst, dann würden Deine Vergleiche doch besser in der Query selbst aufgehoben sein, das geht ganz sicher.
    Ohne weitere Infos ist das hier mehr ein Ratespiel :) .

    Neu

    Hallo @simpelSoft die aktuelle Datarow muss geprüft werden. Ob als bsp. "Spalte1 > Spalte2", die abfrage könnte auch "Spalte1 <= Spalte2". Die abfrage kann aber Variieren. Bei der Datarow kann es "<" sein, Bei der anderen sind es andere Spalten. Die zuordnung wie die Spaltenabfrage kombi ist würde ich in einer anderen Tabelle speichern.

    als bsp.:
    für DataRows aus Tabelle1 gilt : "Spalte1 >= Spalte2" und "(Spalte7 + 2) <= Spalte1"
    für DataRows aus Tabelle2 gilt : "Spalte7 > (Spalte2 - 5)" und "Spalte80 >= Spalte25"

    Denn String aufbau würde ich mir noch überlegen. Jedoch sieht es so aus das ich für jeden Operator eine eigene If Schleife schreiben muss. Wie @ErfinderDesRades schon meinte währen das ja nur 5. Ich dachte nur ich könnte einen kpl. string als abfrage gestallten.

    Neu

    Rattenfänger schrieb:

    ich dachte nur ich könnte einen kpl. string als abfrage gestallten.


    Genau das stand doch in meiner letzten Antwort :) .
    Du musst nicht immer wieder die Beispiele bringen, wie du es außerhalb der Query machen würdest, sondern eher die Query selbst zeigen, dann kann Dir auch geholfen werden.
    Am besten die ganze Methode, die die Daten aus der DB holt. Und am besten auch noch einen depersonalisierten Auszug der Daten als SQL-Dump (nur ein paar Datensätze reichen).

    Neu

    Und genau das ist ja mein Problem. Ich habe eine Query Theoretisch um Datarows zu Filtern in einer tabelle. Aber habe keine Tabelle zur hand sondern nur eine Datarow und die will ich auf die bestimmten werte prüfen.
    Hier habe ich mal eine Abfrage aufgeschrieben wie das mit den Werten aussehen kann.
    Aktuell mache ich das manuell, möchte das aber automatisieren, da die werte variabel sind, und es wird gefühlte 1'000'000 Abfrage kombinationen geben.

    VB.NET-Quellcode

    1. If CDbl(SelectedRow("RSIOpenASK_56")) >= 31.25 And CDbl(SelectedRow("OpenCloseASK")) > -4 And CDbl(SelectedRow("OpenCloseASK")) <= 8.5 And CDbl(SelectedRow("HighCloseBid")) < 5 And CStr(SelectedRow("ASKDirection")).Trim <> "Short" Then 'Dies ist eine kleine abfrage, hier kann es 1000 verschiedene kombinationen geben und wie gesagt, die zahlen können auch anders sein!
    2. If PivotCheckInPoint_001(Oldrow(0), "Pivot_Point_ASK_S1") Then 'Das sind die Fixen Funktionen die nochmal abgefragt werden müssen.
    3. If PIPMoveCheck(SelectedRow, Direction) Then
    4. ReturningBoolean = True
    5. End If
    6. ElseIf PivotCheckInPoint_001(Oldrow(0), "Pivot_Point_ASK_S2") Then
    7. ReturningBoolean = True
    8. ElseIf PivotCheckInPoint_001(Oldrow(0), "Pivot_Point_ASK_S3") Then
    9. ReturningBoolean = True
    10. End If
    11. End If


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rattenfänger“ ()

    Neu

    Dieses Vorhaben scheint mit hanebüchen. Selbst wenn Du alles möglich mteinander kombinieren könntest: Wie willst Du dann noch irgendeine Entscheidung mit auszuführenden Prozeduren treffen können? Es wird ja wohl nicht so sein, dass, egal, welche Kombi aus Rowwerten, Operatoren und Vergleichswerten vorliegt, immer dieselben Prozeduren ausgeführt werden sollen. Denn wenn es so wäre, bräuchtest Du ja überhaupt keine Vergleiche.
    Werd doch mal bitte ganz konkret: Nenn mal vielleicht 2 oder 3 Beispiele mit Zahlenwerten, was auftreten kann. Und beschreib doch mal konkret mit Worten, was Dein tatsächliches Ziel ist. Das Problem an sich. Also nicht den Weg dorthin. Denn die volatile Verwendung von Operatoren ist ja nur ein Weg, um ein Problem zu lösen. Aber bisher kennen wir ja noch nicht mal das tatsächlich vorliegende Problem, welches Du versuchst zu lösen. Also, ich zumindest nicht. Zumindest kann ich nicht aufgrund der Variablen-, Prozedur- und Spaltennamen auf ein konkretes Problem schlussfolgern.

    btw: Der Unterschied zwischen And und AndAlso/Or und OrElse
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    @VaporiZed das du damit nicht wirklich was anfangen kannst ist verständlich, da es auch nichts mit dem normalen abarbeiten von DatenbankInformationen (Buchhaltung, PDM etc) zu tun hat.
    Es geht mehr darum herausfiltern, wann er die Funktion nicht ausführen soll! Ich will wie Aschenbrödel "Die Guten ins Töpfchen, die Schlechten ins Kröpfchen" :-). In dem Bild siehst du auch wie weit ich grad bin. Die Pfeile sind signale wo eine Funktion ausgeführt werden soll(habe ich mit Gut markiert). Jedoch habe ich noch fehlsignale, die negativ sind(habe ich mit schlecht markiert), da möchte ich die Funktion nicht ausführen. Und genau dies Informationen stehen die werte :-). da ich jetzt aber keinen bock habe Millionen von Datenzeilen auszuwerten will ich das automatisieren :-). Diese Codezeile hat die Fehlerfrequenz um 7% gesenkt.

    VB.NET-Quellcode

    1. If CDbl(SelectedRow("RSIOpenASK_56")) >= 31.25 And CDbl(SelectedRow("OpenCloseASK")) > -4 And CDbl(SelectedRow("OpenCloseASK")) <= 8.5 And CDbl(SelectedRow("HighCloseBid")) < 5 And CStr(SelectedRow("ASKDirection")).Trim <> "Short" Then


    Jedoch habe ich mit händischer Filterung knapp 5 std. dafür gebraucht :-(. Ausserdem ist es nicht flexibel und erweiterbar. Und die Flexibilität ist hier das wichtigste. Klar würde hier ein neuronales Netzwerk evtl. mehr helfen, jedoch habe ich da nicht alles verstanden, einen guten Code habe ich mir rausgesucht und zu 10% verstanden(Grundprinzip) aber es fehlt da doch noch sehr viel um was anständiges zum laufen zu bringen.

    Also muss ich es noch Filtern. Im zweiten Bild siehst du ein bsp. was ich rausfiltern will. Die rotenzeilen sind fehlsignale und eine fehlerquote von über 60-70% in dem bestimmten zahlenbereich muss entfernt werden. Das ich nicht 100% filtern kann ist mir klar, aber mit jedem Filter wird das System besser. Aber wie gesagt, zu diesem Zahlenbereich passt eine andere spalte, warum es ein Fehlsignal gibt, nur zu sagen Spaltex wert 15.6 - 15.7 auslassen ist zu einfach und nicht korrekt.
    Bilder
    • Testbild.PNG

      66,56 kB, 1.571×812, 17 mal angesehen
    • TestBild2.PNG

      112,16 kB, 1.701×804, 18 mal angesehen

    Neu

    ich hab nicht alles verstanden, aber sieht mir aus, als wollest du Bedingungen für DataRows aufstellen - also jeweils eine Spalte mit einem Wert vergleichen.
    Und es sollen auch mehrere Bedingungen möglich sein, die dann mit Und verknüpft werden.
    Da lässt sich eine Oberfläche für denken, wo du Spalten aussuchen kannst, und ihnen eine Bedingung zuordnen.
    braucht man halt ein Datenmodell für, und dann kann man auch die Verarbeitung proggen.

    Schwierig wirds, wenn die Einzelbedingungen auch anders als ver-Unded werden sollen. Dann muss man Klammer-Regeln einführen, und weiss ich gar keine Oberfläche für ausser vlt. ein TextEditor mit Intellisense und angeschlossenem Parser - also in 5 Jahren sprechen wir uns wieder ;)

    Also wichtigste Frage, ob die Aufgabenstellung so richtig und endgültig beschrieben ist:
    • Spalten wählen, und dafür einen Vergleich gegen eine Konstante bestimmen
    • mehrere SpaltenVergleiche nur mit Und verknüpfen - nicht optional auch mal mit Oder

    Neu

    Richtig, aber der Vergleich ist nicht das Problem, das werde ich Programmieren. Ich habe das Problem mit den gesammelten Daten. Ich stelle mir vor die Ergebnisse in einer Liste aus String's zu speichern, da ich ja verschiedene ergebnisse bekomme.

    Ich muss dann den String wieder in eine Abfrage quetschen. Und hier ist das Problem. Wie mache ich aus dem String eine Abfrage?

    Weil eine Select Anweisung ist auch ein string. und der wird zu einer IF abfrage. Und daraufhin bekommst du eine sammlung von Datarows.

    VB.NET-Quellcode

    1. dim FoundRow() as Datarow = Datatable.Select("IdentNr >= '00010' AND IdentNr <= '00020'")


    und theoretisch führt Select das aus.

    VB.NET-Quellcode

    1. dim ReturnDatarow() as Datarow
    2. For Each Dtrow as Datarow in Table
    3. if Dtrow(IdentNr) >= "00010" AND Dtrow(IdentNr) <= "00020" Then
    4. ReturnDatarow(i) = Datarow
    5. end if
    6. next
    7. return ReturnDatarow


    Nur wie macht die select anweisung aus einem string eine If abfrage? Gibt es eine Umwandlungsfunktion?

    Neu

    VB.NET-Quellcode

    1. dim FoundRow() as Datarow = Datatable.Select("IdentNr >= '00010' AND IdentNr <= '00020'")
    Diese Anforderung ist zu kompliziert. Finde ich.

    Also wenns geht, versuch mit so einer Anforderung hinzukommen:

    VB.NET-Quellcode

    1. dim FoundRow() as Datarow = Datatable.Select("IdentNr >= '00010'", "IdentNr <= '00020'")
    Das sind kleine Einheiten zu parsen, jeweils nach wenigen Regeln - problemlos.

    Oder sowas:

    VB.NET-Quellcode

    1. dim conditions = {"IdentNr >= '00010'", "IdentNr <= '00020'"} ' beliebig viele weitere...
    2. dim FoundRows = Datatable.Select(conditions)


    ---

    Ach, ich glaub ich hab dich nicht verstanden.

    Rattenfänger schrieb:

    Ich habe das Problem mit den gesammelten Daten. Ich stelle mir vor die Ergebnisse in einer Liste aus String's zu speichern, da ich ja verschiedene ergebnisse bekomme.
    Ich denk, du hast DataRows als Ergebnisse?
    Das wäre verheerend, daraus Strings zu machen - Strings sind definitiv deutlich schlechter auswertbar.

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