AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Filtern in einer Datenbank
Thema durchsuchen
Ansicht
Themen-Optionen

Filtern in einer Datenbank

Ein Thema von Surrounder · begonnen am 8. Feb 2006 · letzter Beitrag vom 9. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#1

Filtern in einer Datenbank

  Alt 8. Feb 2006, 16:19
Datenbank: FlashFiler • Version: 2.13 • Zugriff über: Datasource / Query
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?

Wie gesagt bin eigentlich DB Anfänger, also seid gnädig, bin dankbar über jeden Tip.
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Phistev
(Gast)

n/a Beiträge
 
#2

Re: Filtern in einer Datenbank

  Alt 8. Feb 2006, 16:47
Informier dich mal über die WHERE-Klausel, JOIN könnte auch nicht schaden
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Filtern in einer Datenbank

  Alt 8. Feb 2006, 17:16
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:
      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;
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
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Filtern in einer Datenbank

  Alt 8. Feb 2006, 18:02
Hallo.

Deine erste Query hast du ja schon hinbekommen:

SQL-Code:
select *
from WellenInformationen
where :filterexpr
order by :wsort
Wenn die zweite Query alle Lagerstellen der Wellen aus der ersten Query enthalten soll, dann müsste sie etwa so aussehen:

SQL-Code:
select *
from LagerStellen
where WLfdNr in (
  select lfdnr
  from WellenInformationen
  where :filterexpr )
order by :lsort
Der Parameter :filterexpr muss dann mindestens den Filter-Ausdruck enthalten, der auch für die erste Query verwendet wurde.

Grüße vom marabu
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Filtern in einer Datenbank

  Alt 8. Feb 2006, 18:48
Du hast irgendwelche Wellen und willst wissen wo die sind ?

select * from welle where welle.id_lager= :ID_lager Das listet dir auf, welche Wellen in einem bestimmten Lager sind. Wenn Du wissen willst, wo überall ein bestimmter Wellentyp im Lager ist :

select w.*, l.* from welle w, lager l where w.id_lager = l.id order by lager.nr Aber ohne Gewähr ! Probiere mal aus.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Filtern in einer Datenbank

  Alt 8. Feb 2006, 19:10
Da eine Welle wohl in einem Lager liegt, würde ich den Fremdschlüssel in die Wellen-Tabelle legen, und nicht umgekehrt.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Filtern in einer Datenbank

  Alt 9. Feb 2006, 00:20
Davon ging ich auch aus :

w.id_lager = l.id Jede Welle liegt irgendwo im Lager rum, aber wo ist sie nur ?

Bin hierbei von folgenden Datenstrukturen ausgegangen :

SQL-Code:
CREATE TABLE LAGER (
  ID integer,
  NR integer,
....

CREATE TABLE WELLE (
  ID integer,
  ID_LAGER integer, /* FK auf die ID des Lagerortes */
  NR integer,
...
Wie sehen denn die Tabellen bisher überhaupt aus ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Filtern in einer Datenbank

  Alt 9. Feb 2006, 07:56
Zitat von Jelly:
Da eine Welle wohl in einem Lager liegt, würde ich den Fremdschlüssel in die Wellen-Tabelle legen, und nicht umgekehrt.
Nein es ist genau umgekehrt, eine Welle ( z.B. Kurbelwelle ) besitzt mehrere Lagerstellen.

Zitat von Hansa:
Davon ging ich auch aus :

w.id_lager = l.id Jede Welle liegt irgendwo im Lager rum, aber wo ist sie nur ?

Bin hierbei von folgenden Datenstrukturen ausgegangen :

SQL-Code:
CREATE TABLE LAGER (
  ID integer,
  NR integer,
....

CREATE TABLE WELLE (
  ID integer,
  ID_LAGER integer, /* FK auf die ID des Lagerortes */
  NR integer,
...
Wie sehen denn die Tabellen bisher überhaupt aus ?
Ich hatte doch den Aufbau in meinem ersten Post beschrieben, ich wollte nicht alle Felder eintragen. Es ist genau anderst herum wie in deiner Datenstruktur

TABLE WellenInformation
ID AUTOINC
...

TABLE Lagerstellen
ID AUTOINC
WTypIdx Integer /* hier steht die ID der Welle zu der die Lagerstelle gehört
...
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Filtern in einer Datenbank

  Alt 9. Feb 2006, 08:30
Zitat von marabu:
Hallo.

Deine erste Query hast du ja schon hinbekommen:

SQL-Code:
select *
from WellenInformationen
where :filterexpr
order by :wsort
Wenn die zweite Query alle Lagerstellen der Wellen aus der ersten Query enthalten soll, dann müsste sie etwa so aussehen:

SQL-Code:
select *
from LagerStellen
where WLfdNr in (
  select lfdnr
  from WellenInformationen
  where :filterexpr )
order by :lsort
Der Parameter :filterexpr muss dann mindestens den Filter-Ausdruck enthalten, der auch für die erste Query verwendet wurde.

Grüße vom marabu
Danke für den Tip, das hat mir geholfen. Ich hab es jetzt in einem Query gemacht und ich denke das sollte klappen. Vielleicht könnt ihr mit einen Tip geben falls jemand daran etwas auffällt.

SQL-Code:

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

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
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Benutzerbild von Surrounder
Surrounder

Registriert seit: 26. Sep 2003
Ort: Stuttgart
177 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Filtern in einer Datenbank

  Alt 9. Feb 2006, 09:28
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
In C geschrieben und schön war zuletzt Franz Schuberts 9. Symphonie
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz