Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Rein "Informative" Spalte in DBGrid einfügen (https://www.delphipraxis.net/183879-rein-informative-spalte-dbgrid-einfuegen.html)

Headbucket 11. Feb 2015 12:29

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:
DBGrid.Columns.Add;
DBGrid.Columns[DBGrid.Columns.Count - 1].FieldName := 'Anzahl';
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:
Code:
SELECT Count(fID) as 'Anzahl' FROM tFiles WHERE fExtID = '23'
Mit dieser Abfrage erhalte ich die Anzahl der Dateien für den Protokolleintrag mit der ID "23".
Meine Abfrage für die Protokolleinträge:
Code:
SELECT fDies, fUnd, fDas FROM tProtokoll WHERE tProtokoll.fOffen = '1'
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.

Ich habe bereits folgendes versucht:
Code:
SELECT fDies, fUnd, fDas, Count(fID) as 'Anzahl' FROM tProtokoll WHERE tProtokoll.fOffen = '1'
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"

Grüße und schonmal besten Dank
Headbucket

DeddyH 11. Feb 2015 12:36

AW: Rein "Informative" Spalte in DBGrid einfügen
 
Kannst Du mal die Tabellenstruktur näher erläutern samt Fremdschlüssel?

Headbucket 11. Feb 2015 12:52

AW: Rein "Informative" Spalte in DBGrid einfügen
 
Ich hoffe jetzt wird es anschaulicher:

Sitzungstabelle: (Primärschlüssel ist fID)
fIDfDatum
A10.02.2015
B11.02.2015
C12.02.2015

Protokolltabelle: (Primärschlüssel ist fID, Fremdschlüssel ist fSitzung für Sitzungstabelle)
fIDfSitzungfInhalt
P1APlanung
P2AHausbau
P3BPferdezucht

Dateitabelle: (Primärschlüssel ist fID, Fremdschlüssel ist fExtID für Protokolltabelle)
fIDfExtIDfDatei
F1P20x356GZGZg768345HGJH
F2P20x356GZGZg768345HGJH
F3P20x356GZGZg768345HGJH
F4P30x356GZGZg768345HGJH

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.
InhaltAnzahl der Dateien
Planung0
Hausbau3

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

mkinzler 11. Feb 2015 12:57

AW: Rein "Informative" Spalte in DBGrid einfügen
 
Z.B. so:

SQL-Code:
select
  p.fInhalt,
  (SELECT Count(d.fID) FROM tFiles d WHERE d.fExtID = p.fID ) as 'Anzahl'
from
  tProtokoll p;
(getippt und nicht gestestet)

Headbucket 11. Feb 2015 13:14

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.

Dejan Vu 12. Feb 2015 06:44

AW: Rein "Informative" Spalte in DBGrid einfügen
 
Alternativ noch

SQL-Code:
select
  p.fInhalt,
  count (*) as 'Anzahl'
from
  tProtokoll p
  left join tFiles d on d.fExtID = p.fID
Welches Du nimmst, ist Geschmackssache, obwohl diese Version schneller sein könnte.

DeddyH 12. Feb 2015 06:59

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