Einzelnen Beitrag anzeigen

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