Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Report erstellen - wie Query gestalten (https://www.delphipraxis.net/172763-report-erstellen-wie-query-gestalten.html)

messie 21. Jan 2013 19:21

Datenbank: Firebird • Version: 2.5 • Zugriff über: Quickreport

Report erstellen - wie Query gestalten
 
Moin,

ich bin gerade dabei einen Quickreport auf Datenbank umzustellen. Dazu würde ich gerne die TQRDBText-Komponente benutzen. Die bietet als Property ein DataSet(meine Query), DataField und Mask (für die leidige Float-Formatierung).

Nun habe ich in meiner DB-Hierarchie den Fall, dass ich immer mehrere Ergebnisse gleicher Hierarchie bekomme.
Code:
SELECT
        Table1.ID, Table1.Param1, Table2.ID Table2.Param1, Table2.Param2, Table3.Param1, Table3.Param2
FROM
        Table1, Table2, Table3
WHERE
        Table1.UpIndex = 17
AND
        Table2.UpIndex = Table1.ID
AND
        Table3.UpIndex = Table2.ID
UpIndex ist der Index der jeweils höheren Hierarchie.
Mein Problem: Table3 enthält Messwerte in Param2, die aus verschiedenen Messungen (Table3.Param1) stammen. Damit sind die Felder nicht eindeutig und ich kann sie nicht direkt zuweisen.

Brauche ich für jede Ausgabekomponente eine eigene Query? Denn das wird zur Laufzeit erzeugt und kann theoretisch viele Queries bedeuten. Und die müssen ja so lange gefüllt bleiben, bis der Report ausgegeben wird.
Oder kann man das so verfeinern, dass ich für jedes Table3.Param1 ein eigenes Feld Table3.Param2 erzeugen kann?

Danke, Messie

Edit: SQL mit Code-Tags statt Quote-Tags versehen. Sieht beides nicht toll aus :wink:
Edit2: jetzt ist es lesbarer

messie 22. Jan 2013 12:36

AW: Report erstellen - wie Query gestalten
 
Ich möchte die Frage noch mal etwas verfeinern: kann ich in der Query temporäre Fields erzeugen, die ich dann nochmal mit einer Art eigenem Select füllen kann?

Ich habe nämlich festgestellt, dass unterschiedliche Queries in so einem Report auch ihre Fallstricke haben.

Grüße, Messie

Lemmy 22. Jan 2013 13:00

AW: Report erstellen - wie Query gestalten
 
hi,

Zitat:

Zitat von messie (Beitrag 1200073)
Ich möchte die Frage noch mal etwas verfeinern: kann ich in der Query temporäre Fields erzeugen, die ich dann nochmal mit einer Art eigenem Select füllen kann?

so was wäre doch eigentlich der perfekte EInsatzzweck einer Stored Procedure... Dann hast Du auf Clientseite weiterhin eine einfache Query

messie 22. Jan 2013 13:39

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von Lemmy (Beitrag 1200079)
hi,

Zitat:

Zitat von messie (Beitrag 1200073)
Ich möchte die Frage noch mal etwas verfeinern: kann ich in der Query temporäre Fields erzeugen, die ich dann nochmal mit einer Art eigenem Select füllen kann?

so was wäre doch eigentlich der perfekte EInsatzzweck einer Stored Procedure... Dann hast Du auf Clientseite weiterhin eine einfache Query

:oops::oops::oops:

ich probier' es mal....

p80286 22. Jan 2013 13:45

AW: Report erstellen - wie Query gestalten
 
Ich weiß jetzt nicht ob FB das kann:
Code:
select a.feld1,b.feld2
from tabelle a
     ,(select id,feld2 from tabellex) b
where a.id=b.id
Gruß
K-H

mkinzler 22. Jan 2013 14:07

AW: Report erstellen - wie Query gestalten
 
Kann FB ist aber nicht besonders performant. ( in anderen DBMS aber auch nicht)

jsheyer 22. Jan 2013 14:07

AW: Report erstellen - wie Query gestalten
 
so was ähnliches kann FB, wenn das Ergebnis eindeutig ist, z. B.

select a.field1, a.field2, (select field1 from b where b.field1=a.field3) as field3
from a
where a.field1='123'

Würde das innere select mehrere Datensätze liefern, kommt es zu einer Fehlermeldung.
man kann so aber auch mit den Aggregrat Funktionen arbeiten (sum, max, min, avg) oder andere Berechnungen anstellen.

select a.field1, a.field2, (select sum(field1) from b where b.field1=a.field3) as field3
from a
where a.field1='123'

Gruß
Jörg

Lemmy 22. Jan 2013 14:18

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von messie (Beitrag 1200085)
:oops::oops::oops:

ich probier' es mal....

wenn es nicht klapp, dann schick mir die Metadaten oder ein Backup der DB per PN, dann schraub ich dir die kurz zusammen.... Müsstest mir halt erklären wo die "berechneten Werte" herkommen...

p80286 22. Jan 2013 16:49

AW: Report erstellen - wie Query gestalten
 
[OT]
Zitat:

Zitat von mkinzler (Beitrag 1200092)
Kann FB ist aber nicht besonders performant. ( in anderen DBMS aber auch nicht)

Dann hab ich echt Glück, ich kann mich da nicht beschweren.

Gruß
K-H
[/OT]

jobo 22. Jan 2013 17:45

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von p80286 (Beitrag 1200087)
Ich weiß jetzt nicht ob FB das kann:
Code:
select a.feld1,b.feld2
from tabelle a
     ,(select id,feld2 from tabellex) b
where a.id=b.id

Das ist ein ganz normaler Join, oder?! Wo ist bitte der Unterschied zu
Code:
select a.feld1,b.feld2
from tabelle a
     ,tabellex b
where a.id=b.id
Zitat:

Zitat von mkinzler (Beitrag 1200092)
Kann FB ist aber nicht besonders performant. ( in anderen DBMS aber auch nicht)

Ich nutze FB nicht produktiv, aber das kann ich kaum glauben.


Und was hat das mit der Frage des TE zu tun?
Vielleicht habe ich die nicht verstanden.

mkinzler 22. Jan 2013 17:51

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von mkinzler:
Kann FB ist aber nicht besonders performant. ( in anderen DBMS aber auch nicht)
Ich nutze FB nicht produktiv, aber das kann ich kaum glauben.
Ich habe mich hier verguckt und geglaubt, dass es sich um Selects in der Feldliste handelt ( werden für jeden Datensatz aufgerufen -> unperformant). Hier handelt es sich aber um eine DERIVED TABLE, auf die gejoint wird.

messie 23. Jan 2013 14:03

AW: Report erstellen - wie Query gestalten
 
So, dank Lemmy habe ich jetzt eine stored proc hinbekommen. :thumb::thumb::thumb:

Im Flamerobin geht das wunderbar auch wenn es etwas dauert.
Jetzt habe ich das Problem dass der Report die Daten nicht anzeigt.

Ich habe testhalber mal eine einfache Query probiert "Select * from table where test_id = 17", das zur Entwurfszeit in die IDCQuery gespielt und den Preview zur Entwurfszeit ausgeführt. Alle zutreffenden Elemente (fortlaufende Seriennnummern) tauchen im Report auf.

Zur Laufzeit lade ich denselben String in dieselbe Query-Komponente, weise den Komponenten (QRDBText) die Query und die Felder zu und öffne die Query. Ergebnis: Gleiche Zeilenzahl aber immer die erste Seriennummer.

Was mache ich da falsch?

Grüße, Messie

Lemmy 23. Jan 2013 14:42

AW: Report erstellen - wie Query gestalten
 
Hi,

klatsch mal ein DBGrid auf dein Formular und schließ die Query an das Grid an. Kommen da die Daten?

Was genau meinst Du damit:
Zitat:

Ergebnis: Gleiche Zeilenzahl aber immer die erste Seriennummer.
Im Report?

messie 23. Jan 2013 14:59

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von Lemmy (Beitrag 1200261)
klatsch mal ein DBGrid auf dein Formular und schließ die Query an das Grid an. Kommen da die Daten?

Ja, ist alles da. Für das Grid musste ich noch eine IBCDataSource spendieren, hat das eine Bedeutung?
Was muss man anstellen um einen TDBNavigator zum Laufen zu bringen oder funzt der zur Entwurfszeit gar nicht?

Zitat:

Zitat von Lemmy (Beitrag 1200261)
Hi,
Was genau meinst Du damit:
Zitat:

Ergebnis: Gleiche Zeilenzahl aber immer die erste Seriennummer.
Im Report?

Ja. So als würde der Report zwar wissen, wieviele Einträge in der Query stecken, aber immer nur Zeile 1 ausgeben.

Leider bekomme ich die Query auf die stored proc nicht zur Entwurfszeit in die IBCquery. Vielleicht bin ich auch nur zu blöd :stupid:


Grüße, Messie

mkinzler 23. Jan 2013 16:19

AW: Report erstellen - wie Query gestalten
 
SQL-Code:
select
    <Feldliste>
from
    <SP-Name> ( :Param1, ...)
where
    <Bedingung>;

Lemmy 23. Jan 2013 19:36

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von messie (Beitrag 1200269)
Ja. So als würde der Report zwar wissen, wieviele Einträge in der Query stecken, aber immer nur Zeile 1 ausgeben.

Leider bekomme ich die Query auf die stored proc nicht zur Entwurfszeit in die IBCquery. Vielleicht bin ich auch nur zu blöd :stupid:

kann ja nicht anders sein ;-) Du hast doch XE2, damit auch FastReport. Kannst Du nicht den anstelle von QR nehmen?

messie 23. Jan 2013 20:10

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von Lemmy (Beitrag 1200320)
Zitat:

Zitat von messie (Beitrag 1200269)
Ja. So als würde der Report zwar wissen, wieviele Einträge in der Query stecken, aber immer nur Zeile 1 ausgeben.

Leider bekomme ich die Query auf die stored proc nicht zur Entwurfszeit in die IBCquery. Vielleicht bin ich auch nur zu blöd :stupid:

kann ja nicht anders sein ;-) Du hast doch XE2, damit auch FastReport. Kannst Du nicht den anstelle von QR nehmen?

Nö, dazu reicht die Zeit nicht mehr :cry:

Jetzt muss gezaubert werden :stupid:


Zitat:

Zitat von mkinzler (Beitrag 1200277)
SQL-Code:
select
    <Feldliste>
from
    <SP-Name> ( :Param1, ...)
where
    <Bedingung>;

Öhm, was ist die Feldliste? :oops::oops:

Grüße, Messie

mkinzler 23. Jan 2013 20:37

AW: Report erstellen - wie Query gestalten
 
Die Felder, die man abfragen will

Hansa 23. Jan 2013 21:07

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von messie (Beitrag 1200269)
...Ja. So als würde der Report zwar wissen, wieviele Einträge in der Query stecken, aber immer nur Zeile 1 ausgeben.

Das ist doch klar. Der Report muss das DataSet kennen. Also so etwas :

Delphi-Quellcode:
qrDruck.DataSet := DS; // DS aus DataModule, im FormCreate/Show
Dann muss der BandType noch auf rbDetail eingetsellt sein. Ansonsten kommt nur ein DS Zurück.

messie 24. Jan 2013 09:23

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von Hansa (Beitrag 1200342)
Zitat:

Zitat von messie (Beitrag 1200269)
...Ja. So als würde der Report zwar wissen, wieviele Einträge in der Query stecken, aber immer nur Zeile 1 ausgeben.

Das ist doch klar. Der Report muss das DataSet kennen. Also so etwas :

Delphi-Quellcode:
qrDruck.DataSet := DS; // DS aus DataModule, im FormCreate/Show
Dann muss der BandType noch auf rbDetail eingetsellt sein. Ansonsten kommt nur ein DS Zurück.

Code:
  DM.ReportQuery.SQL.Clear;
        //s := 'SELECT * FROM AUSWERTUNG(17)';
        s := 'SELECT * FROM TABLE WHERE ITEM_ID = 17';
        DM.ReportQuery.SQL.Add(s);
        DM.ReportQuery.open;



        DBReport.QRDBText5.DataSet := DM.ReportQuery;
        DBReport.QRDBText5.DataField := 'SERIAL';
        DBReport.QRDBText1.DataSet := DM.ReportQuery;
        DBReport.QRDBText1.DataField := 'ID';

        DBReport.DataReport.Prepare;
        DBReport.DataReport.Preview;
So sieht das bei mir aus - auch das Band ist ein Detailband. Heute bekomme ich auch nur noch die erste Zeile :shock:

Übergebe ich exakt diese Query zur Entwurfszeit an die IBCQuery und öffne den Preview des Reports ist alles da :roll:

Wenn ich den Report ohne eine Änderung öffne klappt es auch. Sobald ich die Zuweisung an die QRDBText-Felder einsetze klappt es nicht mehr.
Hängen da noch Nebenbedingunen dran?

Danke, Messie

Lemmy 24. Jan 2013 10:22

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von messie (Beitrag 1200407)

Übergebe ich exakt diese Query zur Entwurfszeit an die IBCQuery und öffne den Preview des Reports ist alles da :roll:

Wenn ich den Report ohne eine Änderung öffne klappt es auch. Sobald ich die Zuweisung an die QRDBText-Felder einsetze klappt es nicht mehr.

Warum machst Du dann die Zuweisung? Insbesondere erst zur Laufzeit?

messie 24. Jan 2013 10:43

AW: Report erstellen - wie Query gestalten
 
Zitat:

Zitat von Lemmy (Beitrag 1200419)
Zitat:

Zitat von messie (Beitrag 1200407)

Übergebe ich exakt diese Query zur Entwurfszeit an die IBCQuery und öffne den Preview des Reports ist alles da :roll:

Wenn ich den Report ohne eine Änderung öffne klappt es auch. Sobald ich die Zuweisung an die QRDBText-Felder einsetze klappt es nicht mehr.

Warum machst Du dann die Zuweisung? Insbesondere erst zur Laufzeit?

Weil ich ja eine unterschiedliche Anzahl Felder brauche (1..10). Daher kann ich die Felder erst zur Laufzeit erzeugen und ihnen die Query zuweisen.

Grüße, Messie

Lemmy 24. Jan 2013 10:45

AW: Report erstellen - wie Query gestalten
 
mach das anders rum: Erzeug alle Felder schon zur Entwurfszeit und zur Laufzeit schaltest Du die unnötigen auf Visible=false. Ist weniger Aufwand....

Grüße

messie 25. Jan 2013 18:41

AW: Report erstellen - wie Query gestalten
 
So, mittlerweile läuft der Report einigermaßen.
Das klappt vor allem dann besser wenn man die richtige Datenbankdatei verwendet - Danke, Lemmy

Die Komponenten bleiben aber etwas anfällig. So verlieren sie mit jeder neuen Query scheinbar komplett ihre Bezüge. Klar können die sich mit einer neuen Query auch komplett ändern. Aber die Bezüge komplett aufzulösen? Na ja.

Danke an alle für die Unterstützung, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 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