![]() |
Datenbank: FlashFiler • Version: 2.13 • Zugriff über: Datasource / Query
Filtern in einer Datenbank
Hallo Forum,
ich denke ich hab da ein Anfängerproblem, hab schon viel gelesen weiss aber nicht recht nach was ich suchen soll um eine Lösung zu finden, vielleicht gibt es ja auch keine... Ich habe zwei Tabellen, eine mit Welleninformationen und eine mit den zugehörigen Lagerstellen zu den Wellen. Bei den Welleninformationen stehen so Dinge wie Datum und Uhrzeit usw. der Primärschlüssel ist ein AutoInc Wert den ich in eine Spalte der Lagerstellen schreibe damit ich die Beziehung herstellen kann. So weit klappt das auch, wenn ich ein Grid habe in dem ich die Welleninformationen anzeige dann kann ich ein zweites Grid setzen indem ich dann automatisch die zugehörigen Lagerstellen der selektierten Welle angezeigt bekomme. So weit so gut. Jetzt würde ich gerne Filtern. Was ich dabei tun möchte ist z.B. mit alle Wellen von einem bestimmten Datum an zu zeigen, oder die eben ein bestimmtes anderes Kriterium erfüllen das ich bei den Welleninformationen gespeichert habe. Nur wie bekomme ich jetzt die zugehörigen Lagerstellen heraus? Ich hatte das bisher so gelöst, ich habe mir eine MemTabel erzeugt und der die gleichen Spalten wie der Wellentabelle gegeben. Dann habe ich Programmtechnisch alle Einträge im Grid mit den Welleninformationen durchsteppt und jeweils die Lager dann in diese MemTabel kopiert. Ziel ist es eben alle Lagerstellen dann zu haben, und dort dann wieder Filtern zu können, z.B. nach Lagerstelle 2 oder nach dem Durchmesser etc. Das funktioniert auch, ist aber langsam, sehr langsam. Deshalb dachte ich, ich versuche das mal mit SQL, und hab mir eine Query gesetzt, was auch wesentlich schneller ist wenn ich viele Datensätzte habe ( zumindest ohne Filterung ), nur weiss ich nicht wie ich das machen soll wenn ich jetzt den Filter will Also z.B. Ich möchte alle Wellen haben die vom 07.02.2006 sind, dann setze ich in der Tabelle mit den Welleninformationen den Filter auf das Datum, nur wie bekomme ich jetzt die zugehörigen Lagerstellen? Ich müsste ja jetzt hergehen und von allen Welleninformationen den AutoIndex Wert ermitteln, und nach allen die ich ermittelt habe wieder die Lagerstellen durchsuchen!? Kann mir jemand auf die Sprünge helfen, mach ich da einen Denkfehler oder geht das wirklich nicht oder nichtt anderst? :wiejetzt: Wie gesagt bin eigentlich DB Anfänger, also seid gnädig, bin dankbar über jeden Tip. |
Re: Filtern in einer Datenbank
Informier dich mal über die WHERE-Klausel, JOIN könnte auch nicht schaden
|
Re: Filtern in einer Datenbank
Ok, danke das hab ich versucht, aber villeicht hab ich nicht weit genug gedacht. Wenn ich jetzt z.B. auf alle Wellen vom 07.02.2006 gefiltert habe ( im cxGrid von devExpress ) dann habe ich von 10000 Wellen noch 300 im Gird. Jede dieser Wellen hat jetzt z.B. 15 Lagerstellen. Diese Lagerstellen würde ich jetzt gerne alle in einem weitere Grid anzeigen, um darin wieder zu Filtern, z.B nach Lagerstelle 2
Nur das ist mir mit WHERE und JOIN auch nicht ganz klar. Ich könnte jetzt sagen
Delphi-Quellcode:
nur das klappt so nicht weil ich wohl keine Query in eine FROM Zeile nehmen kann / darf. Ich bin mir aber auch nicht sicher ob da überhaupt das rauskommen würde was ich möchte, denn wenn ich wie hier jetzte 300 Wellen habe, dann habe ich ja 300 verschiedene LfdNr. LfdNr ist bei mir der AutoInx Wert der in der WellenInformation steht und den ich in die Lagerinformationen schreibe, anhand dem ich dann die Bezeiehung herstelle
with DM1.ffQuery2 do begin
Close(); with SQL do begin Clear; Add( 'SELECT * FROM WellenInformation ' ); s := 'WHERE ' + cxGrid1DBTableView1.DataController.Filter.FilterText; Add( s ); end; Open(); end; with DM1.ffQuery1 do begin Close(); with SQL do begin Clear; Add( 'SELECT * FROM LagerStellen, ffQuery2 '); s := 'WHERE MessDatLager.WLfdNr = ffQuery2.LfdNr'; Add( s ); end; Open(); end; |
Re: Filtern in einer Datenbank
Hallo.
Deine erste Query hast du ja schon hinbekommen:
SQL-Code:
Wenn die zweite Query alle Lagerstellen der Wellen aus der ersten Query enthalten soll, dann müsste sie etwa so aussehen:
select *
from WellenInformationen where :filterexpr order by :wsort
SQL-Code:
Der Parameter :filterexpr muss dann mindestens den Filter-Ausdruck enthalten, der auch für die erste Query verwendet wurde.
select *
from LagerStellen where WLfdNr in ( select lfdnr from WellenInformationen where :filterexpr ) order by :lsort Grüße vom marabu |
Re: Filtern in einer Datenbank
Du hast irgendwelche Wellen und willst wissen wo die sind ?
SQL-Code:
Das listet dir auf, welche Wellen in einem bestimmten Lager sind. Wenn Du wissen willst, wo überall ein bestimmter Wellentyp im Lager ist :
select * from welle where welle.id_lager= :ID_lager
SQL-Code:
Aber ohne Gewähr ! Probiere mal aus. :mrgreen:
select w.*, l.* from welle w, lager l where w.id_lager = l.id order by lager.nr
|
Re: Filtern in einer Datenbank
Da eine Welle wohl in einem Lager liegt, würde ich den Fremdschlüssel in die Wellen-Tabelle legen, und nicht umgekehrt.
|
Re: Filtern in einer Datenbank
Davon ging ich auch aus :
SQL-Code:
Jede Welle liegt irgendwo im Lager rum, aber wo ist sie nur ? :mrgreen:
w.id_lager = l.id
Bin hierbei von folgenden Datenstrukturen ausgegangen :
SQL-Code:
Wie sehen denn die Tabellen bisher überhaupt aus ? :shock:
CREATE TABLE LAGER (
ID integer, NR integer, .... CREATE TABLE WELLE ( ID integer, ID_LAGER integer, /* FK auf die ID des Lagerortes */ NR integer, ... |
Re: Filtern in einer Datenbank
Zitat:
Zitat:
TABLE WellenInformation ID AUTOINC ... TABLE Lagerstellen ID AUTOINC WTypIdx Integer /* hier steht die ID der Welle zu der die Lagerstelle gehört ... |
Re: Filtern in einer Datenbank
Zitat:
SQL-Code:
Die erste Query brauche ich glaub gar nicht weil das cxgrid mir das ja direkt anzeigt, die müsste ich wohl nur selber machen wenn ich das Grid in den GridMode schalten würde.with DM1.ffQuery2 do begin Close(); with SQL do begin Clear; Add( 'SELECT * FROM WellenInformationen, Lagerdaten ' ); s := 'WHERE WellenInformationen.Idx = Lagerdaten.WiIdx'; if cxGrid1DBTableView1.DataController.Filter.FilterText <> '' then begin s := s + ' AND ' + cxGrid1DBTableView1.DataController.Filter.FilterText; end; Add( s ); end; Open(); end; Ein Problem habe ich noch. Ich lass mir ja den FilterText von meinem cxGrid direkt zurück geben, den ich dann direkt als SQL Statement einfüge. Das geht bei allen Feldern außer bei meinem Datumsfeld. Das Feld ist vom Typ "SysTools Date", muss ich da was beachten? Ich bekomme als Meldung immer einen Type mismatch. Beim Feld "SysTools Time" funktionierts ohen Probleme |
Re: Filtern in einer Datenbank
kann es sein dass das an meinem Datumsformat liegt? Ich gebe im SQL Statement als Datumsformat '09.02.2006' an, so sehe ich das Datum eigentlich auch in der Tabelle aber trotzdem kommt es zur Exception
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz