Werte innerhalb Toleranz/Suchkreis suchen

Repeatz

Benutzer
Beiträge
7
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
 
Werbung:
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.
 
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.

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.
 
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.
 
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.

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
 
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?
 
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?
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?
 
Aber es spricht nichts gegen eine Select-Abfrage mit über 50 Parametern außer der Befehlslänge oder?

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.
 
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.
 
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
 
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.
 
Werbung:
Zurück
Oben