Entwickler-Ecke

Datenbanken - Quickreport mit Group by


TimHa - Di 14.03.06 21:41
Titel: Quickreport mit Group by
Hallo!

Ich habe einen Bericht, der auf ein Query mit folgendem SQL Code zugreift:


Quelltext
1:
2:
3:
select *
from artikel
order by hersteller, artikelnr;


Ich hätte die Abfrage aber lieber so:


Quelltext
1:
2:
3:
4:
select *
from artikel
group by hersteller
order by artikelnr;


In meinen Quickreport habe ich eine Gruppenkopfzeile eingefügt. In diese Zeile habe ich ein QRDBText Feld gelegt. Wenn ich dort das DataField auswählen will kommt folgende Fehlermeldung:
Wenn ein Group By existiert, muss sich jedes einfache Feld in den Projektoren im group by befinden.

Kann mir jemand bitte kurz erklären, wie ich eine Group By Anweisung in meinen Bericht bekomme?

Danke. :)

Tim


afk - Di 14.03.06 22:11

Den "group by" bekommst Du in der Form gar nicht in Deinen Bericht.

In SQL verwendet man einen "group by" im Zusammenhang mit Aggregatfunktionen (SUM, COUNT, MAX, MIN, ...), um die Ergebnisse dieser Funktionen nach zusätzlichen (nicht Aggregat-) Feldern zu Gruppieren. So wie Du ihn einsetzen willst ist es nicht SQL-konform.

Die Fehlermeldung kommt also nicht von dem Quickreport, sondern von der TQuery-Komponente mit der Abfrage.

Ich bin mir nicht ganz sicher, aber wenn ich mich richtig erinnere, dann brauchst Du für einen gruppierten Report zwei TQuery-Komponenten (Master/Detail).


Gruß Axel


TimHa - Di 14.03.06 22:20

Ah gut. Das hat mir auch schon etwas weiter geholfen. Danke! :) Habe meinen SQL Code abgeändert und bin jetzt einen Schritt weiter.

Der Bericht soll Artikel anzeigen. Ich möchte aber, dass der Name des Herstellers nur 1x als Überschrift angezeigt wird. Weiß nicht genau, wie ich es ausdrücken soll...

Hersteller Artikelbezeichnung
Hersteller Artikelbezeichnung
Hersteller Artikelbezeichnung

So nicht, sondern so:

Hersteller
...........Artikelbezeichnung
...........Artikelbezeichnung
...........Artikelbezeichnung

soll der Bericht aussehen. :)

Ich habe dazu das Hersteller Feld in den Bereich Gruppenkopfzeile des Berichts gelegt. Die Artikelbezeichnung steht im Detailbereich. Das funktioniert aber nicht ganz. Es wird nur der 1. Hersteller angezeigt und dann alle Artikelbezeichnungen von allen Herstellern.

Muss doch irgendwie funktionieren?

Tim


raiguen - Mi 15.03.06 11:44

Moin :-)

Jo, das wird auch funktionieren ...

Komponenten im Report:
QuickRep1 : der Report als solcher
QRGroup1: Gruppenkopfzeile
QRSubDetail1: Detailband
Query1: Abfrage Artikel/Hersteller


im Objektinspektor für QuickRep1
Dataset -> keine Zuweisung

im Objektinspektor für QRGroup1
Dataset -> Query1
Expression -> Query1.hersteller
Master -> QRSubDetail1

im Objektinspektor für QRSubDetail1:
DataSet -> Query1
HeaderBand -> keine Zuweisung

Die Angabe für QRGroup1.Expression bedeutet nichts anderes, als dass der Gruppenkopf jedesmal dann gedrukt wird, wenn sich der Ausdruck ändert, in Deinem Fall der Hersteller.

Viel Erfolg :-)

Gruß


TimHa - Mi 15.03.06 20:31

Ich habe versucht alles was du geschrieben hast umzusetzen.

Mein Bericht hat jetzt folgende Bereiche:
Kopfzeile
Titel
Gruppenkopfzeile
Unterdetail
Zusammenfassung
Fußzeile

Ich habe die Eigenschaften der Gruppenkopfzeile + Unterdetail so belegt wie du geschrieben hast.

Dann wollte ich ein QRDBText-Feld in die Gruppenkopfzeile hinzufügen. Wenn ich dann die DataSet Eigenschaft auf Hersteller festlegen will kommt wieder die Fehlermeldung:
Wenn ein Group By existiert, muss sich jedes einfache Feld in den Projektoren im group by befinden.
Was mache ich falsch? :(

Tim


raiguen - Mi 15.03.06 21:50

Moin :-)

Als erstes ändere das SQL-Statement:

SQL-Anweisung
1:
2:
3:
select *
from artikel
order by hersteller, artikelnr;


Ist auch schon mal gesagt worden, dass das GROUP BY hier keinen Sinn macht.

Die Gruppierung nach Hersteller, so wie du es gerne haben möchtest, erfolgt im Report.

Probiers noch mal so...

Gruß

Moderiert von user profile iconraziel: Delphi- durch Sql-Tags ersetzt


TimHa - Do 16.03.06 16:24

Ahhh, jetzt macht alles Sinn und es hat auch funktioniert! Juhu!! :)

user profile iconraiguen hat folgendes geschrieben:

im Objektinspektor für QRGroup1
Dataset -> Query1
Expression -> Query1.hersteller
Master -> QRSubDetail1


Eine Frage noch: Was bedeutet die letzte Zeile? Master Eigenschaft QRSubDetail. Also was legt man damit fest?

Tim


raiguen - Fr 17.03.06 15:53

Moin :-)

Der Gruppenkopf (QRGroup1) muss ja wissen, wann er gedruckt werden darf; in Deinem Report also dann, wenn ein anderer Hersteller in der SQL-Abfrage auftaucht. Und diese Information steht halt im DataSet des QRSubDetail1-Bandes, somit 'steuert' das Detailband den Gruppenkopf, ist also sozusagen der Master ;-)

Gruß


TimHa - Fr 17.03.06 20:22

Wunderbar. Danke für deine Hilfe (und Geduld)! :)

Tim


raiguen - Sa 18.03.06 18:33

Moin :-)

Bitte, gern geschehen :-)