Entwickler-Ecke

Datenbanken - DBGrid: Nur EIN Eintrag pro Person...!?


Killi - Di 01.07.03 12:41
Titel: DBGrid: Nur EIN Eintrag pro Person...!?
Hi!

Mein DBGrid verweist auf ne SQL-Query - die hat ne Abfrage wann ein Kunde zuletzt dagewesen ist (ich prüfe per Zeitintervall, also "where termin < DATUM), da will ich dann den LETZTEN Termin anzeigen - aber er zeigt mir 3 Termine an, ist ja klar - weil alle kleiner als das DATUM sind....wie kann ich das denn überbrücken?
Kann ich es irgendwie machen dass die DBGrid nur EINMAL diese Person anzeigt?


kiwicht - Di 01.07.03 12:45

where termin < DATUM AND kunde = "kunde" ?

oder, wenn deine Datenbank ein eindeutiges Feld enthält, z.B. ein AutoInc-Wert:

zuerst

Quelltext
1:
SELET * FROM dbank WHERE where termin < DATUM                    

dann

Quelltext
1:
Query.Last (also zum letzten Datensatz)                    

und dann

Quelltext
1:
SELECT * FROM dbank WHERE id = query.FieldByName('id')                    

Prinzip verstanden?

mfG

Moderiert von user profile iconTino: Code-Tags hinzugefügt.


Killi - Di 01.07.03 13:06

geht wohl net so einfach - hier mal der Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
     QRecall.Active:= False;
     QRecall.SQl.CLear;
     QRecall.SQl.Add('Select * from kunden, termine where (kunden.Recall = ''True'') and (termine.KID = kunden.KID) and (Erledigt = ''True'')');

     QRecall.SQL.Add(' and (((kunden.RecallZeit = ''1'') and (termine.Datum < ''' + DateToStr(Jahr1) + '''))');
     QRecall.SQl.Add(' or ((kunden.RecallZeit = ''2'') and (termine.Datum < ''' + DateToStr(Jahr2) + '''))) order by kunden.Nachname ASC, kunden.Vorname ASC, termine.Datum DESC');

     QRecall.Active:= True;

     // Wenn gefunden
     if QRecall.RecordCount <> 0 then
     begin
          DBgrid1.Visible:= True;
     end
     else
     begin
          DBgrid1.Visible:= False;
     end;

Ich hab also 1mal ne Kunden-DB und einmal ne DB mit Terminen - where Kunde = Kunde hab ich ja....deshalb werden auch immer soviele gleich angezeigt - weil sie mehr Termine haben...


UGrohne - Di 01.07.03 13:12

Versuch mal hinter den SQL-Code noch LIMIT 1,1 dahinterzuhängen, ich kenn die genau Syntax nimmer, aber mit LIMIT müsste es gehen.... wenns so net geht, einfach mal in SQL-Referenz schauen....


Killi - Mi 02.07.03 12:13

Hab nachgeschaut - ich versteh dass so, dass wenn ich Limit 1,1 dazuschreibe dann nur der 1.Eintrag aus der DB kommt....1.Frage: EGAL wo ich es hinschreibe, es wird nicht angenommen in meiner Abfrage (die seht ihr ja weiter oben)! 2. Frage: der 1.Eintrag also....hm....überprüft er dann nicht nur den 1. Eintrag? Wenn ja ist das ja eh Schwachsinn...


DaDoc - Mi 02.07.03 12:25

...auch wenns ein wenig "wild" aussieht:
Schnappe Dir mal den DBExplorer und probier mal folgendes aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
select K.Nachname, K.Vorname, Max(T.Datum) as LastDatum from Kunden K join Termine T
on (T.KID = K.KID)
where (K.Recall = True) and (Erledigt = True) and
(((K.RecallZeit = 1) and (Datum < '30.06.2003')) or
((K.RecallZeit = 2) and (Datum < '25.06.2003')))
group by K.Nachname, K.Vorname
order by K.Nachname, K.Vorname

Die beiden Datumsangaben muß Du natürlich mit Deinen eigenen Angaben ersetzen... :wink:


Killi - Mi 02.07.03 14:26

Ja des funktioniert ja wunderbarschdens!!!! DANKE!!!!!!!!!!!
Aber wozu sollte ich da n DBExplorer nehmen? 1. hab ich den anscheinend nicht und 2. nehm ich immernoch n DBGrid zum anzeigen...


DaDoc - Mi 02.07.03 14:38

Killi hat folgendes geschrieben:
...Aber wozu sollte ich da n DBExplorer nehmen? 1. hab ich den anscheinend nicht und ...

Hmm...sollte eigentlich im "Bin"-Verzeichnis von Delphi sein (dbexplor.exe). Den nehm ich meistens für "den-mal-eben-SQL-schnell-test-auf-meine-Daten"...


Killi - Mi 09.07.03 11:10

Hi!

Hab jetzt alles wunderbar benutzt - aber jetzt kamen noch Felder dazu (ein Memo-Feld, heißt in der Datenbank recallText.Text)....hier der Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
     QDruck.SQl.Add('Select kunden.Karteikarten_nr, kunden.Nachname, kunden.Vorname, kunden.Straße, kunden.Nummer, kunden.PLZ, kunden.Ort,');
     QDruck.SQL.Add(' recallText.Anrede, recallText.Text,');
     QDruck.SQl.Add(' Max(termine.Datum) as MaxTermin from kunden, termine, recallText where (kunden.Recall = ''True'') and (termine.KID = kunden.KID) and (Erledigt = ''True'')');
     QDruck.SQl.Add(' and (Kunden.RID = recallText.RID)');
....
     QDruck.SQl.Add(' group by kunden.Karteikarten_nr, kunden.Nachname, kunden.Vorname, kunden.Straße, kunden.Nummer, kunden.PLZ, kunden.Ort, ');
     QDruck.SQl.Add(' recallText.Anrede, recallText.Text order by kunden.Nachname ASC, kunden.Vorname ASC, termine.MaxTermin DESC');


Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
jetzt sagt er mir dass in group by keine BLOB Memos drinstehen dürfen....nehm ichs raus, meint er ich solls reinamchen weil ers braucht...TOLL! Ich brauch das Feld aber unbedingt!!!