![]() |
Datenbank: MSSQL • Version: 12.0.2000.8 • Zugriff über: Delphi (ADO)
Rein "Informative" Spalte in DBGrid einfügen
Hallo,
auf die Gefahr hin, dass ich mich mit der Frage total zum Deppen mache, muss ich sie nun trotzdem stellen. Bis vor einer Woche hatte ich jedoch noch nie etwas mit Datenbanken zu tun. Um mein Problem zu erklären folgendes Beispiel: Ich habe zwei Tabellen. Eine Protokolltabelle und eine Dateitabelle. In der Dateitabelle befinden sich Dateien, welche stets einem Eintrag in der Protokolltabelle zugewiesen werden können. Es können auch mehrere Dateien einem Protokolleintrag zugeordnet werden. Nun habe ich ein DBGrid, welches mit einer TDataSource verbunden ist, welche wiederrum mit einem TADOQuery verbunden ist. Soweit - sogut. Mit dem Query rufe ich nun einige Spalten der Protokolltabelle über SELECT auf. Nun möchte ich jedoch auch in einer zusätzlichen Spalte anzeigen, wieviel Dateien dieser Protokolleintrag enthält. Diese Spalte ist natürlich rein informativ und darf auch nicht editiert werden, wobei die anderen Zelle natürlich editiert werden dürfen. Eine weitere Spalte kann ich natürlich problemlos mit
Delphi-Quellcode:
hinzufügen. Ich weiß nun aber leider nicht, wie ich die Anzahl in die Spalte "Anzahl" bekomme. Eine separate Abfrage ist ja auch kein Problem:
DBGrid.Columns.Add;
DBGrid.Columns[DBGrid.Columns.Count - 1].FieldName := 'Anzahl';
Code:
Mit dieser Abfrage erhalte ich die Anzahl der Dateien für den Protokolleintrag mit der ID "23".
SELECT Count(fID) as 'Anzahl' FROM tFiles WHERE fExtID = '23'
Meine Abfrage für die Protokolleinträge:
Code:
Meine Hoffnung war, dass ich diese beiden Abfragen nun irgendwie zusammenpacken kann. Wenn es aber einen Weg gibt, die Anzahl manuell in die Spalten zu schreiben, dass wäre das auch eine Lösung für mich.
SELECT fDies, fUnd, fDas FROM tProtokoll WHERE tProtokoll.fOffen = '1'
Ich habe bereits folgendes versucht:
Code:
Jedoch kann ich für das "Count(fID)" ja dann keinen Filter festlegen. Das geht ja irgendwie nicht. Wenn ich keinen Filter festlege (was ja aber auch unsinnig ist) erhalte ich außerdem folgende Fehlermeldung: "Die tProtokoll.fID-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist"
SELECT fDies, fUnd, fDas, Count(fID) as 'Anzahl' FROM tProtokoll WHERE tProtokoll.fOffen = '1'
Grüße und schonmal besten Dank Headbucket |
AW: Rein "Informative" Spalte in DBGrid einfügen
Kannst Du mal die Tabellenstruktur näher erläutern samt Fremdschlüssel?
|
AW: Rein "Informative" Spalte in DBGrid einfügen
Ich hoffe jetzt wird es anschaulicher:
Sitzungstabelle: (Primärschlüssel ist fID)
Protokolltabelle: (Primärschlüssel ist fID, Fremdschlüssel ist fSitzung für Sitzungstabelle)
Dateitabelle: (Primärschlüssel ist fID, Fremdschlüssel ist fExtID für Protokolltabelle)
Ich möchte nun z.B. von der Sitzung A das Protokoll sehen und als zusätzliche Spalte soll mir angezeigt werden, wieviel Dateien der jeweilige Protokolleintrag enthält.
Klingt eigentlich recht simpel, wenn man es mal so aufschreibt. Aber ich bekomme es leider nicht hin. Das Problem ist halt die Verknüpfung mit dem DBGrid... . Man soll nach Möglichkeit dann "Planung" und "Hausbau" auch editieren können. Es macht aber natürlich keinen Sinn die zweite Spalte mit der Anzahl der Dateien zu bearbeiten. Die ist rein informativ. Grüße |
AW: Rein "Informative" Spalte in DBGrid einfügen
Z.B. so:
SQL-Code:
(getippt und nicht gestestet)
select
p.fInhalt, (SELECT Count(d.fID) FROM tFiles d WHERE d.fExtID = p.fID ) as 'Anzahl' from tProtokoll p; |
AW: Rein "Informative" Spalte in DBGrid einfügen
Ich wusste, dass es eine Deppenfrage war >.<
Ich hatte bereits nach "Unterabfragen" gesucht, jedoch sind diese dort stets nur ganz am Ende bei der Filterung erklärt (nach WHERE). Das man auch zwischen SELECT und FROM Unterabfragen einbauen kann, wusste ich nicht. Vielen Dank! Es funktioniert bestens. |
AW: Rein "Informative" Spalte in DBGrid einfügen
Alternativ noch
SQL-Code:
Welches Du nimmst, ist Geschmackssache, obwohl diese Version schneller sein könnte.
select
p.fInhalt, count (*) as 'Anzahl' from tProtokoll p left join tFiles d on d.fExtID = p.fID |
AW: Rein "Informative" Spalte in DBGrid einfügen
Fehlt da nicht noch die Gruppierung nach p.fInhalt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 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-2025 by Thomas Breitkreuz