Datebank nach einer Zahl >= der eingegebenen Zahl durchsuchen

Belmond

Newbie
Registriert
Dez. 2019
Beiträge
6
Hallo,

ich bin neu ihr in dem Forum und hoffe hier kann mir jemand helfen. Ich programmiere hobbymäsig Selbs Computerprogramme. Jetzt will ich eins realisieren wo ich was berechnen muss wo ich aber einen Zahlenwert aus einer Datenbank auslesen muss der aber nicht unbedingt einem Wert in der Datenbank entspricht, wes halb ich dann den nächst größere Wert annehmen muss. Das heißt das ich eine >= Durchsuchung durchführen muss. Ausgegeben soll dann der Wert der im Spaltenkopf und Zeilenanfang steht. Die Durchsuchung soll immer Spalte für Spalte erfolgen. Datenbanken so durchsuchen ist ja nicht schwer aber ich bekomme das mit dieser >= Suche nicht hin. Finde aber auch nix was mir wirklich weiterhilft.

Danke schon mal für eure Hilfe.

Unten im Bild seht ihr mal ein Beispiel.

Gesucht wird die 12
Die Durchsuchung soll Spalte für Spalte durchgeführt werden.
Die 12 ist in der dritten Spalte zu finden ausgegeben wird dann die 22x1 und die 1,6 in die Entsprechenden Edit Felder

Unbenannt.png

Würde jetzt z.B. die 1 Gesucht werden
Muss dann die 2 genommen werden und dann als Ausgabe 15x1 und 1,0 ausgegeben werden.

Programmieren tu ich mit Delphi XE10.3
Die Datenbank erstelle ich mit dem DB Browser (SQLite)
 
Mit Delphi hatte ich zuletzt in meiner Schulzeit zu tun und du solltest darüber nachdenken zu einer moderneren Programmiersprache wie Python zu wechseln. Die Anbindung an Datenbanken wie SQLite ist exzellent.
 
Wenn ich das richtig verstanden habe, soll ja die Zeile ausgewählt werden, die den nächstgrößeren Wert enthält, abgefragt werden. Dann müsste man @Bagbag's Beitrag noch um ein "ORDER BY comission ASC" am Ende ergänzen. So enthält die erste Zeile im Ergebnis den Datensatz mit dem nächstgrößeren Wert. Ohne diesen Zusatz, würde einfach eine Liste aus allen Datensätzen mit >= zurückgegeben werden, beliebig unsortiert.
 
Nein es soll die Spalte ausgewählt werden die den nächst größeren Wert hat.
Das Bild ist nur ein Ausschnit um ein Beispiel zu geben. Die Differenzen zu den Zahlen werden noch größer je höher die Werte werden.
 
Zuletzt bearbeitet:
Und was ist, wenn die 11 gesucht wird? Die ist sowohl in der 3. als auch der 4. Spalte (die erste Spalte ohne Überschrift ist doch trotzdem eine, oder nicht? - irgendwo müssen ja die Werte herkommen).
Oder die 4, die kommt überall vor.

Da mir das wie deine eigene GUI aussieht: Hast du die ganze Tabelle eh schon im Programm eingelesen und kann/soll entsprechend dort verarbeitet werden oder soll das per SQL gefunden werden?
 
Wenn die 11 ausgegeben werden soll, soll sie aus der ersten Spalte genommenwerden in der sie auftauch.

Die erste Spalte ist mit den Ausgabewerten gefüllt.

Ich hatte das in meinen ersten Versuchen in ein Stringgrid geladen und wollte es da raus suchen lassen. Wenn die genaue zahl drinnen istgeht das ja auch. Jetzt will ich die direkt in der Datenbank suchen lassen.
Da her das Bild.

Die Werte selber stammen aus der TRGI2018
Und das wird nicht die einzige sein. Das sind ca. 15 solche Tabelln die ich eingeben will, da mit man sie nicht ablesen muss. Pro Tabelle 8 Spalten und 20 Zeilen. Habe sie nicht digital da bzw muss sie einscannen wenn ihr sie sehen wollt .
 
Gehts dir nur um die Lösung des von dir beschriebenen technischen Problems oder soll das Programm produktiv einen Mehrwert liefern?

Wenn zweiteres, dann würde ich vorschlagen du normalisierst dein Datenmodell. Ich finde es irritierend, dass du die Spaltennamen sozusagen dynamisch auslesen möchtest. Ich würde hier mit mindestens einer zusätzlichen Tabelle arbeiten und dann den Spaltennamen von hier über einen FK reinjoinen. Kann auch sein, dass ich es nicht 100% verstanden habe.
 
  • Gefällt mir
Reaktionen: Raijin
Wenn das innerhalb der Datenbank gelöst werden soll, ändere das Design. Sonst wird das unschön.
Die Tabelle mit all den Werten:
  • Spalte für den "Wert"
  • Spalte mit der Info aus der ersten Spalte
  • Spalte mit der Info aus den aktuellen Spaltenbeschriftungen (würde ich auf jeden Fall in eine separate Tabelle auslagern und dann eine Art Priorisierung verpassen)

Deine Suche ist dann trivial, so ganz grob:
Code:
SELECT TOP 1 t.ErsteSpalte, ü.Bezeichnung
FROM Tabelle t
JOIN Überschriften ü ON t.Überschrift = ü.Überschrift
WHERE t.Wert >= {Parameter}
ORDER BY t.Wert, ü.Rangfolge

Da 20 Zeilen pro Tabelle ziemlich wenig (und somit performanceunkritisch) sind, kannst du alternativ auch alles ins Programm laden lassen und dort bequem darin suchen, sofern du die Datenbank nicht ändern kannst/möchtest.
 
Hier habt ihr mal einen Scan von einer Orginal Tabelle die in eine Datenbank umgewandelt werden soll.
Unbenannt 2.png


Mir geht es ja nur da rum das ich das Ablesen ersparen kann. Da her erschien mir die Datenbanklösung am einfachsten. Bin auch für Alternativlösungen offen ,ich bestehe nicht auf die Datenbank Lösung.

Noch mal zum besseren Verständnis wenn was nicht ganz verstanden wurde.
  • In das erste Edit wird ein Wert ein gegeben.
  • Die Tabelle soll, dann Spalte für Spalte durchsucht werden nach einem >= Wert.
  • Wenn der Wert gefunden wurde soll die erste Zelle (Überschrift) in ein Edit ausgegeben werden und die erste Zelle von der Zeile in ein anderes Edit
Und das war es auch schon mehr muss da nicht erfolgen, da ich dann mit diesem wert weiter rechne.

Danke schon mal für die Lösungsvorschläge, kamm jetzt aber noch nicht zum Testen. Das will ich jetzt die Tage erledigen.
 
Eine Datenbank brauchst du dafür ganz und gar nicht. Ein Array zur Aufnahme der Daten sowie zwei Schleifen zur Iteration durch die Zeilen und Spalten genügen vollkommen.
 
Ich würde es nur über eine Tabelle lösen (bei der geringen Anzahl von Datensätzen halte ich es für überflüssig, die Daten zu normalisieren). Beispielsweise würde ich die Tabelle "nennweiten" so in der Datenbank speichern:

nrq
150.83
151.04
151.25
.........
200.46
200.68
200.89
201.011
.........

Die Abfrage würde dann lauten:

SELECT n, r, q
FROM nennweiten
WHERE q>={Parameter}
ORDER BY q ASC, n ASC
LIMIT 1;

Erklärung:
Du fragst alle Werte von q ab, die größer oder gleich dem gesuchten Wert "Eingabe" sind. Diese sortierst Du aufsteigend nach der Größe und der Nennweite. Der erste Wert bei dieser Sortierung ist der gesuchte Wert ...
 
Zuletzt bearbeitet: (Abfrage vereinfacht)
  • Gefällt mir
Reaktionen: mambokurt und new Account()
KuestenNebel schrieb:
Eine Datenbank brauchst du dafür ganz und gar nicht. Ein Array zur Aufnahme der Daten sowie zwei Schleifen zur Iteration durch die Zeilen und Spalten genügen vollkommen.

Ich habe noch nict mit Array gearbeitet. Habe mir das mal jetzt angeschaut . Jetzt ist meine Frage kann ich immer auf die erstellte zugreifen oder muss ich immer an dem Punkt, wo ich was brauche eine neue erstellte. habe nur noch keine Idee wie ich es am besten erstelle.
Habe mir hier ein Beispiel angeschaut.
 
Andreas_ schrieb:
Ich würde es nur über eine Tabelle lösen (bei der geringen Anzahl von Datensätzen halte ich es für überflüssig, die Daten zu normalisieren). Beispielsweise würde ich die Tabelle "nennweiten" so in der Datenbank speichern:

nrq
150.83
151.04
151.25
.........
200.46
200.68
200.89
201.011
.........

Die Abfrage würde dann lauten:

SELECT n, r, q
FROM nennweiten
WHERE q>={Parameter}
ORDER BY q ASC, n ASC
LIMIT 1;

Erklärung:
Du fragst alle Werte von q ab, die größer oder gleich dem gesuchten Wert "Eingabe" sind. Diese sortierst Du aufsteigend nach der Größe und der Nennweite. Der erste Wert bei dieser Sortierung ist der gesuchte Wert ...

Absolut beste Lösung imho!
 
  • Gefällt mir
Reaktionen: new Account()
Hi

habe mir die letzten Tage mal eure Lösungsvorschläge angeschaut und habe mich für die Tabellen Lösung entschlossen.

Danke für die vielen Vorschläge und eure Hilfe, auch da für das ihr mir neue Sachen gezeigt habt von denen ich noch nix wuste.
 
Zurück
Oben