AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fast Report - dataset does not exist

Ein Thema von RedOne · begonnen am 24. Jan 2013 · letzter Beitrag vom 1. Feb 2013
Antwort Antwort
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#1

Fast Report - dataset does not exist

  Alt 24. Jan 2013, 12:16
Hallo zusammen

Ich scheitere gerade an Fast Report. Und zwar können mehrere Reports gleichzeitig in verschiedenen Fastreportinstanzen geöffnet sein. Die Felder auf dem Reports greiffen alle auf das Dataset "reportdataset" zu. Dies wird aber erst zur Laufzeit erstellt und dem Report angehängt.

Delphi-Quellcode:
//TReporter ist eine abgeleitete Klasse von frxReport
constructor TReporter.Create(_owner: TComponent);
begin
  Inherited;
  FDBDataset:= TfrxDBDataset.Create(Self); //Ich erstelle hier das frxDBDataset, dem ich später ein "echtes" Dataset anhänge.
  FDBDataset.Parent:= Self;
  FDBDataset.Name:= 'reportdataset';
  FDBDataset.UserName:= 'reportdataset';
  Self.DataSet:= FDBDataset;
  DataSets.Add( FDBDataset );
  EnabledDataSets.Add( FDBDataset );
end;

procedure TReporter.ShowReport(_clearLastReport: Boolean);
begin
  InternalPrepareReport;
  Inherited ShowReport( _clearLastReport ); //Nun erscheint der Fehler
end;

procedure TReporter.InternalPrepareReport;
var
  ds: TDataSet;
begin
  //Wird ausgeführt wenn der Report geladen wurde und ShowReport oder PrepareReport aufgerufen wurde
  if Assigned( FDBDataset.DataSet ) then begin
    //Falls das Dataset existiert, wird es freigegeben
    FDBDataset.DataSet.Free;
    FDBDataset.DataSet:= nil;
  end;
  FDBDataset.DataSet:= TEDB.Instance.CreateDataset( FSQL ); //Hier wird ein TEDBDataset (ElevateDB) erstellt und zurückgegeben (Rückgabe ist vom Typ TDataSet). Das Dataset ist geöffnet und funktioniert.

end;
Wird jetzt ShowReport aufgerufen, wird im InternalPrepareReport das Dataset erstellt und dem bereits erstellten frxDBDataset zugewiesen. Dann erscheint aber der Fehler, dass das dataset "reportdataset" nicht existiert.
Wird im Create beim erstellen des frxDBDataSet kein Owner angegeben, funktioniert es. Allerdings gibt es später Probleme weil das Dataset irgendwie Global ist und nun verschiedene Datasets mit dem gleichen Namen existieren.

Hat da jemand eine Idee?

Herzlichen Dank!
RedOne
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Fast Report - dataset does not exist

  Alt 24. Jan 2013, 14:20
//TReporter ist eine abgeleitete Klasse von frxReport
Ich würde dies anderst lösen.
Statt von frxReport abzuleiten wurde ich eine eigene Klasse erstellen, die ein frxReport-Objekt benützt.
Dies hat viele Vorteile.
Insbesondere brauchst du die Komponente TReporter nicht zu installieren und kannst ganz normal frxReports zur Entwicklungszeit designen.
So vermeidet man auch übermässig tiefe Klassenhierarchieen und hat mehr Freiheiten.
Delphi-Quellcode:
TReportPrintJob = class(TObject)
private
  FReport : TFrxReport;
public
  procedure Setup;
  procedure Print;
  procedure Preview; // oder ShowReport

  property Report: TFrxReport;

  // eventuell Dataset als Property übergeben
  property Dataset:TDataset read GetDatset write SetDataset;
end;
Natürlich wirft diese Vorgehensweise deinen ganzen bisherigen Ansatz über den Haufen aber längerfristig ist es der bessere Weg.
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Fast Report - dataset does not exist

  Alt 26. Jan 2013, 13:10
Herzlichen Dank für Deine Antwort

Ich habe mir dies auch überlegt, mich dann aber dagegen entschieden. Ich gebe dem abgeleiteten frxReport einen "eigenen", internen Report mit. In diesem Report ist das SQL wie auch der Designreport vorhanden. Wenn ich nun die Print-Funktion meines abgeleiteten frxReports aufrufen, kann ich vor dem Drucken noch das SQL-Script ausführen und das Dataset generieren.
Auf Deine Art müsste ich die Print-Funktion auf dem TReportPrintJob ausführen und nicht direkt auf der Membervariable frxReport. Irgendwann würde ich dies vergessen und mich wundern wiesos nicht funktioniert

Aber so oder so, dies ändert doch nichts am Problem mit den Datasets, oder?

Alles Gute
RedOne
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#4

AW: Fast Report - dataset does not exist

  Alt 26. Jan 2013, 15:21
Auf Deine Art müsste ich die Print-Funktion auf dem TReportPrintJob ausführen und nicht direkt auf der Membervariable frxReport. Irgendwann würde ich dies vergessen und mich wundern wiesos nicht funktioniert
Kann ich mir nicht vorstellen, denn die Membervariable frxReport ist privat bzw. sollte sie das sein.

Bezüglich deiner Idee würde ich dem Rat von sx2008 folgen. Ich kann mir vorstellen, das das hantieren mit den Datasets den Report durcheinanderbringt.

Wenn Du ein TDataModule verwendest, dann funktioniert ja alles. Also: Tipp von mir: Verwende ein TDatamodule oder die Idee von sx2008.
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Fast Report - dataset does not exist

  Alt 30. Jan 2013, 19:28
Hallo zusammen

Ich habs nun soweit geändert wie vorgeschlagen, aber immer noch die selben Probleme:
Initialisiere ich das frxDBDataset mit dem Report als Parent, wird kein Dataset gefunden. Initialisiere ich es mit Nil, sind auf dem Report 3 Datasets mit gleichem Namen.

Das Problem ist immer noch: Ich designe die Reports zur Laufzeit und gebe ein Dataset mit. Diesem Dataset habe ich einen Namen vergeben. Alle so generierten Reports greifen auf das Dataset mit diesem Namen zu. Wird ein Report ausgeführt, generiere ich den frxReport sowie das Dataset zur Laufzeit und weise es dem frxReport zu. Und damit mehrere Reports gleichzeitig ausgeführt werden können und jeder Report nur auf sein Dataset zugreifen kann, soll das Dataset nicht Global sein (wird es aber sobald man es mit Nil initialisiert).

Irgendwo habe ich einen Denkfehler... Das ist doch ein übliches Szenario? Eine Software, verschiedene Reports, auf allen Reports den gleichen Datasetname, das Dataset zur Laufzeit generieren (das SQL-Statement wird zusammen mit dem Report in einem eigenen Dateiformat gespeichert)...

Delphi-Quellcode:
(*
  Zur Erklärung:
  DBReport = Eigenes Reportformat (Zip) aus der Datenbank. In diesem ist ein Fastreport (fr3) sowie ein SQL-Statement enthalten
  frxDataset = "Datasetcontainer". Das "richtige" Dataset wird beim Ausführen generiert und dem frxDataset zugewiesen.
*)


unit tsReporterNew;

interface

uses
  frxClass, frxBarcode, frxDBSet, tsDB, DB, Classes;

type
  TReportController = class
  private
    FfrxReport: TfrxReport;
    FfrxDataSet: TfrxDBDataset;
    FDBReport: TReport;
    FSQL: string;
    procedure InternalPrepareReport;
  public
    property SQL: string read FSQL write FSQL;
    procedure AddDBReport( _rep: TReport );
    function GetDBReport: TReport;
    procedure ShowReport( _clearLastReport: Boolean = true );
    procedure DesignReport;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

uses
  tsHelpers;

{ TReportController }

procedure TReportController.AddDBReport(_rep: TReport);
begin
  FDBReport:= _rep;
  FSQL:= FDBReport.SQL;
  FfrxReport.LoadFromStream( FDBReport.Report );
// FfrxDataSet.DataSet:= nil;
  FfrxReport.ReportOptions.Name:= FDBReport.Name;
  FfrxReport.PrintOptions.Printer:= FDBReport.Printer;
end;

constructor TReportController.Create;
begin
  FfrxReport:= TfrxReport.Create( nil );
  FfrxDataSet:= TfrxDBDataset.Create( FfrxReport );
// FfrxDataSet.Parent:= FfrxReport;
  FfrxDataSet.Name:= 'reportdataset';
  FfrxDataSet.DataSet:= nil;
  FfrxDataSet.UserName:= 'reportdataset';
  FfrxReport.DataSets.Add( FfrxDataSet );
// FfrxReport.DataSet:= FfrxDataSet;
end;

procedure TReportController.DesignReport;
begin
  InternalPrepareReport;
  FfrxReport.PrepareReport( true );
  FfrxReport.DesignReport( true );
end;

destructor TReportController.Destroy;
begin
  if Assigned( FfrxDataSet.DataSet ) then
    FfrxDataSet.DataSet.Free;
  FfrxDataSet.Free;
  FfrxReport.Free;
  inherited;
end;

function TReportController.GetDBReport: TReport;
begin
  FDBReport.Report.Clear;
  FfrxReport.SaveToStream( FDBReport.Report );
  FDBReport.Report.Position:= 0;
  Result:= FDBReport;
end;

procedure TReportController.InternalPrepareReport;
var
  ds: TDataSet;
begin
  if Assigned( FfrxDataSet.DataSet ) then begin
    FfrxDataSet.DataSet.Free;
    FfrxDataSet.DataSet:= nil;
  end;
  FfrxDataSet.DataSet:= TEDB.Instance.CreateDataset( TSQLPatcher.ReplaceConstants( FSQL )); //Erstellt das Dataset (TDataset)
// DataSets.Add( FDBDataset );
end;

procedure TReportController.ShowReport(_clearLastReport: Boolean);
begin
  InternalPrepareReport;
  FfrxReport.ShowReport( _clearLastReport );
end;

end.
  Mit Zitat antworten Zitat
RedOne

Registriert seit: 2. Jun 2008
71 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Fast Report - dataset does not exist

  Alt 1. Feb 2013, 14:36
Der Vollständigkeit halber - Folgende Lösung für das Problem:
Beim Erstellen des frxReports muss UseGlobalDatasetList auf False gestellt werden:

FfrxReport.EngineOptions.UseGlobalDataSetList := False;

Danach kann das frxDBDataset dem Report hinzugefügt werden

FfrxReport.EnabledDataSets.Add(FfrxDataSet);

Und danach den Report mit LoadFromStream/LoadFromFile laden und vor dem Ausführen FfrxDataSet.Dataset füllen.

Oder komplett
Delphi-Quellcode:
procedure TReportController.Create;
begin
  FfrxReport:= TfrxReport.Create( nil );
  FfrxReport.EngineOptions.UseGlobalDatasetList := False;

  FfrxDataSet:= TfrxDBDataset.Create( nil );
  FfrxDataSet.UserName:= 'reportdataset';
  FfrxReport.EnabledDataSets.Add( FfrxDataSet );
  //Weitere Aktionen
  FfrxReport.LoadFromFile( AReportPath );
end;

procedure TReportController.DesignReport;
begin
  if Assigned( FfrxDataSet.DataSet ) then begin
    FfrxDataSet.DataSet.Free;
    FfrxDataSet.DataSet:= nil;
  end;

  FfrxDataSet.DataSet:= TDataBase.CreateDataset( FSQL );
  FfrxReport.PrepareReport;
  FfrxReport.DesignReport;
end;
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Fast Report - dataset does not exist

  Alt 1. Feb 2013, 14:53
Danke für den Hinweis!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 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