Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Reportproblem (https://www.delphipraxis.net/136919-reportproblem.html)

manfred_h 10. Jul 2009 10:48

Datenbank: Firebird • Version: 2.1 • Zugriff über: Fibplus

Reportproblem
 
Hallo zusammen

in einem Report möchte ich eine zusammenfassung div. Tabellen darstellen.
Das Problem ist das die Details immer leer sprich 0 sind.

Delphi-Quellcode:
procedure TDM_member.print_camps_dist_ov(Sender: TObject);
begin
  with DM_reports.camps do
  begin
    close;
    SelectSQL.Clear;
    SelectSQL.Text :=('SELECT * FROM CAMPS ORDER BY C_NO');
    Open;
  end;
  with DM_reports.Default_OV do
  begin
    close;
    SelectSQL.Clear;
    SelectSQL.Add
      ('SELECT '+
       '(SELECT COUNT( NAME ) FROM HOTEL WHERE (C_NO = ?C_NO)) AS COUNT_OF_HOTEL, '+
       '(SELECT COUNT( NAME ) FROM CHURCH WHERE (C_NO = ?C_NO)) AS COUNT_OF_CHURCH, '+
       '(SELECT COUNT( NAME ) FROM DOCTOR WHERE (C_NO = ?C_NO)) AS COUNT_OF_DOCTOR, '+
       '(SELECT COUNT( NAME ) FROM SCHOOL WHERE (C_NO = ?C_NO)) AS COUNT_OF_SCHOOL, '+
       '(SELECT COUNT( NAME ) FROM NURSING_H WHERE (C_NO = ?C_NO)) AS COUNT_OF_NURSING_H, '+
       '(SELECT COUNT( NAME ) FROM LAWYER WHERE (C_NO = ?C_NO)) AS COUNT_OF_LAWYER, '+
       '(SELECT COUNT( NAME ) FROM HOSPITAL WHERE (C_NO = ?C_NO)) AS COUNT_OF_HOSPITAL, '+
       '(SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = ''10'' and C_NO = ?C_NO) AS COUNT_OF_MILITARY, '+
       '(SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = ''20'' and C_NO = ?C_NO) AS COUNT_OF_FIRE_BRIGADE, '+
       '(SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = ''30'' and C_NO = ?C_NO) AS COUNT_OF_POLICE, '+
       '(SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = ''40'' and C_NO = ?C_NO) AS COUNT_OF_PRISON, '+
       '(SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = ''50'' and C_NO = ?C_NO) AS COUNT_OF_REFUGEE_CAMP '+
       'FROM CAMPS '+
       'WHERE C_NO = ?C_NO;');
    Open;
  end;
// FibPLus Dataset setup end:
  with DM_reports.frxReport do
  begin
    Variables.LoadFromFile(report_dir+'/report_var.fd3');
    LoadFromFile(report_dir+'/report_camp_dist_ov.fr3');
    DM_reports.set_variables(Sender);
    PrepareReport;
    ShowPreparedReport;
  end;
end;
Wenn ich die abfrage mit IBExport ausführe ist der Datensatz ok:
SQL-Code:
SELECT
    C_NO, REG_NO, ZONE_NO, AREA_NO, CITY, COUNTRY, LANG,
    (SELECT COUNT( NAME ) FROM HOTEL WHERE (C_NO = 'I47705')) AS COUNT_OF_HOTEL,
    (SELECT COUNT( NAME ) FROM CHURCH WHERE (C_NO = 'I47705')) AS COUNT_OF_CHURCH,
    (SELECT COUNT( NAME ) FROM DOCTOR WHERE (C_NO = 'I47705')) AS COUNT_OF_DOCTOR,
    (SELECT COUNT( NAME ) FROM SCHOOL WHERE (C_NO = 'I47705')) AS COUNT_OF_SCHOOL,
    (SELECT COUNT( NAME ) FROM NURSING_H WHERE (C_NO = 'I47705')) AS COUNT_OF_NURSING_H,
    (SELECT COUNT( NAME ) FROM LAWYER WHERE (C_NO = 'I47705')) AS COUNT_OF_LAWYER,
    (SELECT COUNT( NAME ) FROM HOSPITAL WHERE (C_NO = 'I47705')) AS COUNT_OF_HOSPITAL,
    (SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = '10' and C_NO = 'I47705') AS COUNT_OF_MILITARY,
    (SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = '20' and C_NO = 'I47705') AS COUNT_OF_FIRE_BRIGADE,
    (SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = '30' and C_NO = 'I47705') AS COUNT_OF_POLICE,
    (SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = '40' and C_NO = 'I47705') AS COUNT_OF_PRISON,
    (SELECT COUNT( NAME ) FROM PUB_S WHERE KIND = '50' and C_NO = 'I47705') AS COUNT_OF_REFUGEE_CAMP
FROM CAMPS WHERE (C_NO = 'I47705')
Danke schonmal für Eure Hilfe
Manfred

GHorn 10. Jul 2009 11:03

Re: Reportproblem
 
Schon mal im Quellcode die hart codierte Variante
des IBExpert, d.h. ohne Variablen abgesetzt?

Gruß
Gerald

mkinzler 10. Jul 2009 11:06

Re: Reportproblem
 
Hallo Manfred,

-Warum die Abfrage über CAMPS? Du liest ja nichts von dieser Tabelle.
Was für einen Typ hat PUB_S.KIND? ( Quotes erscheinen mir überflüssig)
Zudem wäre es u.U. zu überlegen, die Tabellen zu verschmelzen (wenn die Struktir gleich/ähnlich). Dann könnte man das ganze in einer normalen Abfrage mit IIFs händeln.
Oder eine Execution Block unter Verwendung von PL zu verwenden

manfred_h 10. Jul 2009 11:20

Re: Reportproblem
 
Zitat:

Zitat von GHorn
Schon mal im Quellcode die hart codierte Variante
des IBExpert, d.h. ohne Variablen abgesetzt?

Da erhalte ich bei allen Details den gleichen Wert.

Zitat:

Zitat von mkinzler
-Warum die Abfrage über CAMPS? Du liest ja nichts von dieser Tabelle.

Im Report wird Camp als Master Eintrag dargestellt.

Zitat:

Zitat von mkinzler
Was für einen Typ hat PUB_S.KIND? ( Quotes erscheinen mir überflüssig)

Der Typ ist VARCHAR.

Zitat:

Zitat von mkinzler
Zudem wäre es u.U. zu überlegen, die Tabellen zu verschmelzen (wenn die Struktir gleich/ähnlich). Dann könnte man das ganze in einer normalen Abfrage mit IIFs händeln.

Werde das mal versuchen.

Zitat:

Zitat von mkinzler
Oder eine Execution Block unter Verwendung von PL zu verwenden

Sorry, kannst Du das ein wenig erklären?

Danke
Manfred

mkinzler 10. Jul 2009 11:33

Re: Reportproblem
 
Zitat:

Der Typ ist VARCHAR.
Da hier aber Zahlen verwendet werden erscheint mir die Verwendung von Integern besser geeignet.
Zitat:

Im Report wird Camp als Master Eintrag dargestellt.
Aber nicht die Tabelle sondern das DataSet (Ergebnis)
Zitat:

Sorry, kannst Du das ein wenig erklären?
Entweder als Stored Procedure oder als Code block
SQL-Code:
EXECUTE BLOCK ( C_NO INTEGER = :C_NO)
RETURNS ( REG_NO INTEGER, ZONE_NO INTEGER, AREA_NO INTEGER, CITY VARCHAR(32), COUNTRY .., LANG .., COUNT_OF_HOTEL INTEGER, ... )
AS
BEGIN
    select REG_NO, ZONE_NO, AREA_NO, CITY, COUNTRY, LANG from camps into :REG_NO, :ZONE_NO, :AREA_NO, :CITY, :COUNTRY, :LANG;
    SELECT COUNT( NAME ) FROM HOTEL WHERE C_NO = :C_NO into :COUNT_OF_HOTEL;
    ...
    SUSPEND;
END;

manfred_h 10. Jul 2009 17:59

Re: Reportproblem
 
Zitat:

Zitat von mkinzler
Zudem wäre es u.U. zu überlegen, die Tabellen zu verschmelzen (wenn die Struktir gleich/ähnlich). Dann könnte man das ganze in einer normalen Abfrage mit IIFs händeln.

Bin schon eine weile am rumtesten aber irgendwie noch nicht auf dem richtigen Weg.
Habe auch schon hier im Forum die Suche bemüht. Aber wie das über mehrere Tabellen mit where geht ist mir nicht ganz klar.
SQL-Code:
SELECT
    C_NO, REG_NO, ZONE_NO, AREA_NO, CITY, COUNTRY, LANG,
    count (IIF (HOTEL.NAME is not null,1,0  WHERE (C_NO = 'I47705')) AS COUNT_OF_HOTEL,
FROM CAMPS WHERE (C_NO = 'I47705')
Könntest Du mir ein kleines Bsp. geben?

Shalom
Manfred

mkinzler 10. Jul 2009 18:27

Re: Reportproblem
 
Ich meinte die mehrere Tabellen durch eine ersetzen. Diese dann um ein Art-Feld erweitern. Dies könnte man auch in einer Union-Abfrage temporär erledigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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 by Thomas Breitkreuz