1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Werte innerhalb Toleranz/Suchkreis suchen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Repeatz, 6 Juni 2019.

  1. Repeatz

    Repeatz Benutzer

    Hallo,

    ich hätte eine Frage bezüglich Mysql mit Vb.net.

    Ich schreibe derzeit eine Desktop-Anwendung mit VB.Net welche mehrere Datagridview-Elemente enthält. In diesen Datagridviews kann ich derzeit die Datensätze aus der mysql Datenbank anzeigen lassen bzw. löschen und auch neue hinzufügen via den Mysql-Connector/Adapter.


    Die Datensätze enthalten Parameter für ein CAD-Programm mit verschiedenen Maßangaben von Bauteilen.

    Nun soll jedoch kontrolliert werden ob so ein ähnliches Bauteil schon vorhanden ist. Als Beispiel, ein Körper mit 30 x 30 x 30mm hätte in der Datenbank 3 Spalten(Höhe, Breite, Länge). Wenn jedoch jetzt ein Körper mit 29,2 x 31 x 30mm eingefügt wird, soll die Datenbanktabelle nach ähnlichen Datensätzen innerhalb eines eingestellten Suchkreises durchsucht werden. Jedoch wäre wünschenswert dass jede Spalte einen eigenen Suchkreis/Toleranz hat, so dass z.B. in "Höhe" innerhalb +- 1mm sucht und bei Breite innerhalb +-2mm.

    Vorher hatte ich so ein System schon in Excel mit VBA umgesetzt. Hierfür habe ich in der obersten Zeile die Toleranzwerte eingegeben. Per Button wurde dann in der ersten Spalte angefangen, der aktuelle Zellenwert + Toleranz und zugleich - Toleranz gerechnet. Dann wurden alle Zeilennummern "gemerkt" welche innerhalb der beiden Ergebnisse liegen. Das ganze wurde dann Spalte für Spalte und Zeile für Zeile mit 2 Loops abgearbeitet. Wenn die Letzte Spalte bzw. letzte Zeile erreicht wurde, wurden die noch übrig gebliebenen ähnlichen Zeilennumern in einer MsgBox ausgegeben. Wurde vorher der Loop abgebrochen, weil keine Ergebnisse mehr zwischen den beiden Werten lagen, wurde die Suche abgebrochen.

    Nun bin ich am Versuchen, so ein ähnliches System mit einer VB Anwendung mit Mysql umzusetzen.

    Nur leider weiß ich nicht so direkt, wie ich dass mit Mysql/Vb umsetzen kann. Alternativ als Lösung hab ich mir gedacht eine Exceltabelle mit der Datenbank zu verbinden und via Vb.Net die Tabelle im Hintergrund zu öffnen, die Datensätze einzutragen und anschließend das VBA-Makro über VB.Net zu starten. Jedoch erscheint mir diese Lösung mit Excel irgendwie nicht ganz "sauber" bzw. vielleicht später für den kommerziellen Gebrauch nicht ordentlich genug.


    Ich hoffe ich habt eventuell eine Idee und könnt mir helfen!

    Vielen lieben Dank im voraus.

    mit freundlichen Grüßen,

    Tobias
     
  2. ukulele

    ukulele Datenbank-Guru

    Du versuchst zu nutzen was du kennst (geht mir auch immer so) aber zu VB.net kann ich nichts sagen. Meine Frage wäre wann genau du nach diesen "ähnlichen" Objekten suchst, während der Eingabe oder am Ende einer Eingabe aller Daten? Bei letzterem könnte man die Eingegebenen Werte doch prima als Variable in einem Select an die Datenbank übergeben und eine Abfrage starten.
    Code:
    SELECT *
    FROM tabelle
    WHERE spalte_hoehe BETWEEN @hoehe - 1mm AND @hoehe +1mm AND spalte_breite BETWEEN @breite -2mm AND @breite +2mm
    ORDER BY abs(spalte_hoehe - @hoehe) + abs(spalte_breite - @breite) *2 DESC
    LIMIT 1
    Damit würdest du dann auch das nähst mögliche Ersatzobjekt definieren und auswählen können.

    PS: Bitte keine Loops wenn nicht nötig, weder in VB.net noch in SQL.
     
    Repeatz gefällt das.
  3. Repeatz

    Repeatz Benutzer

    Hallo ukulele,

    vielen Dank für deine hilfreiche Antwort! Mit so einen "kurzen" Code bzw. Befehl hätte ich jetzt nicht gerechnet! Hab ihn grad eingebaut und es funktioniert alles tadellos! So einfach und so hilfreich! Danke.
     
  4. Repeatz

    Repeatz Benutzer

    ps.

    Überprüft wird sobald ein neuer Datensatz von den Eingabefeldern in die Datenbank geschrieben wird.
     
  5. ukulele

    ukulele Datenbank-Guru

    Wenn du immer alle Variablen hast kannst du sehr gut mit einer Abfrage alternative Einträge finden, natürlich auch mehr als einen und komplett nach deinen Bewertungskriterien und Gewichtung. Welcher Eintrag dann genommen wird willst du vielleicht noch dem Anwender überlassen.
     
    Repeatz gefällt das.
  6. Repeatz

    Repeatz Benutzer

    Ich hab immer alle Variablen des neuen "Produkts" in den Eingabefenstern des Gui's der Desktopanwendung. Es muss lediglich lediglich der Wert der einzelnen Eingabefeldern in deinen geschriebenen select-Befehl übergeben werden, was auch super funktioniert! Nur das Limit habe ich entfernt, da der Konstrukteur wie du schon vermutet hast, selber entscheiden soll, ob ein neues Produkt erstellt werden soll oder ob eben ein bereits vorhandenes Produkt verwendet werden kann. Muss nun nur noch schauen, wie ich das ganze für die Realität übernehme, da ich insgesamt 58 Parameter habe und somit der Befehl ewig lang wird.

    Außerdem hab ich die Toleranzen wie z.B. 1mm bzw 2mm auch in einen Settings-Gui abgefragt ;) So kann der Konstrukteur selber entscheiden, wie wichtig welche Abmessungen sind.

    Vg
     
  7. ukulele

    ukulele Datenbank-Guru

    Ansich ist das einfach eine Suchabfrage mit vielen Parametern. Hast du für jeden Parameter eine eigene Spalte oder eher EAV a la ObjektID - Parametername - Parameterwert, also mehrere Zeilen in einer Tabelle zu einem Datensatz?
     
    Repeatz gefällt das.
  8. Repeatz

    Repeatz Benutzer

    nene, ganz normal pro spalte 1 parameter :) und jede Zeile entspricht ein "Produkt"

    Aber es spricht nichts gegen eine Select-Abfrage mit über 50 Parametern außer der Befehlslänge oder?
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Durchaus. MySQL kann je Query und Tabelle nur ein Index nutzen. Mit anderen Worten: wenn Deine Tabelle irgendwann signifikant mehr als ein paar Dutzen Rows enthält wird es vermutlich schnachlahm. Andere DB's können mehrere Indexe, und können auch Index-basierte Umkreissuche, Stichwort KNN. Mit MySQL bist Du da eher auf der Verliererseite.
     
    Repeatz gefällt das.
  10. ukulele

    ukulele Datenbank-Guru

    Nunja, kalkuliert man jedes mal mit einem full table scan und reicht das aus könnte es in kleinerem Maßstab gut laufen. Verzichte am besten auf LIKE oder irgendwelche Textsuchen sondern nutze nur mathematische Operationen.
     
    Repeatz gefällt das.
  11. Repeatz

    Repeatz Benutzer

    okay okay jetzt wirds für mich langsam zu kompliziert. Ich habe pro Spalte einen Parameter, jedoch insgesamt über 50 Spalten also auch über 50 Parameter. Jede Zeile ist ein neues "Produkt".

    Viele Grüße
     
  12. ukulele

    ukulele Datenbank-Guru

    Nun du wirst ein langes Query bauen müssen und gucken wie sich die Performance so macht. Oder du wechselst das DBMS was du vermutlich nicht willst/kannst.
     
  13. Repeatz

    Repeatz Benutzer

    okay, dann probier ich es erstmal so mit mysql :) aber auf jeden Fall nochmals vielen Dank!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden