function TDmReport.DesignerSaveReport(Report: TfrxReport;
SaveAs: Boolean): Boolean;
var
Stream: TMemoryStream;
begin
Result := False;
if SaveAs then exit;
Stream := TMemoryStream.Create;
try
Report.SaveToStream(Stream);
Stream.Position := 0;
TBlobField(FActiveBlobField).LoadFromStream(Stream);
finally
Stream.Free;
end;
Result := True;
end;
procedure TDmReport.LoadFromBlobField(BlobFl: TBlobField);
var
Stream: TMemoryStream;
begin
try
FActiveBlobField := BlobFl;
Stream := TMemoryStream.Create;
try
TBlobField(BlobFl).SaveToStream(Stream);
Stream.Position := 0;
if Stream.Size >0 then
Report.LoadFromStream(Stream);
finally
Stream.Free;
end;
except end;
Report.Variables.Assign(FVariablesFr);
end;
Не удалось сохранить переменные в блобе.
Из приведенного примера не понятно, где используется AddReportVar(pName: string; Value: Variant) , которая, явно, для этого и нужна.
Или необходимо для переменных заводить доп. блоб-поле, где их и хранить?
Не удалось сохранить переменные в блобе.
Из приведенного примера не понятно, где используется AddReportVar(pName: string; Value: Variant) , которая, явно, для этого и нужна.
Или необходимо для переменных заводить доп. блоб-поле, где их и хранить?
Комментарии
Что тут сложного объясни??
unit UReport3;
interface
uses
SysUtils, Classes, DB,
Graphics, Controls, Forms, Dialogs,
frxVariables,
frxExportPDF, frxExportXLS, frxExportHTML,frxDMPClass,
frxExportTXT, frxClass, frxDesgn, frxDMPExport, frxGradient, frxChBox,
frxCross, frxRich, frxChart, frxDCtrl, frxFIBComponents, fs_iinterpreter;
type
type
TDmReport3 = class(TDataModule)
frxFIBComponents: TfrxFIBComponents;
frxDialogControls: TfrxDialogControls;
frxChartObject: TfrxChartObject;
frxRichObject: TfrxRichObject;
frxCrossObject: TfrxCrossObject;
frxCheckBoxObject: TfrxCheckBoxObject;
frxGradientObject: TfrxGradientObject;
frxDotMatrixExport: TfrxDotMatrixExport;
Designer: TfrxDesigner;
Report: TfrxReport;
frxTXTExport: TfrxTXTExport;
frxHTMLExport: TfrxHTMLExport;
frxXLSExport: TfrxXLSExport;
frxPDFExport: TfrxPDFExport;
fsScript: TfsScript;
function DesignerSaveReport(Report: TfrxReport;
SaveAs: Boolean): Boolean;
procedure DataModuleCreate(Sender: TObject);
private
FActiveBlobField: TBlobField;
FVariablesFr : TfrxVariables;
procedure LoadFromBlobField(BlobFl: TBlobField);
public
procedure DesignReportFromBlobField(BlobFl: TBlobField; Caption: String);
procedure ShowReportFromBlobField(BlobFl: TBlobField; Caption: String);
procedure AddReportVar(pName :string; Value :Variant);
end;
var
DmReport: TDmReport;
implementation
{$R *.dfm}
procedure TDmReport.DesignReportFromBlobField(BlobFl: TBlobField;
Caption: String);
begin
LoadFromBlobField(BlobFl);
Report.FileName := Caption;
Report.DesignReport;
end;
function TDmReport.DesignerSaveReport(Report: TfrxReport;
SaveAs: Boolean): Boolean;
var
Stream: TMemoryStream;
begin
Result := False;
if SaveAs then exit;
Stream := TMemoryStream.Create;
try
Report.SaveToStream(Stream);
Stream.Position := 0;
TBlobField(FActiveBlobField).LoadFromStream(Stream);
finally
Stream.Free;
end;
Result := True;
end;
procedure TDmReport.LoadFromBlobField(BlobFl: TBlobField);
var
Stream: TMemoryStream;
begin
try
FActiveBlobField := BlobFl;
Stream := TMemoryStream.Create;
try
TBlobField(BlobFl).SaveToStream(Stream);
Stream.Position := 0;
if Stream.Size >0 then
Report.LoadFromStream(Stream);
finally
Stream.Free;
end;
except end;
Report.Variables.Assign(FVariablesFr);
end;
procedure TDmReport.ShowReportFromBlobField(BlobFl: TBlobField;
Caption: String);
begin
LoadFromBlobField(BlobFl);
Report.FileName := Caption;
Report.ShowReport;
end;
procedure TDmReport.AddReportVar(pName: string; Value: Variant);
begin
FVariablesFr[pName] := Value;
end;
procedure TDmReport.DataModuleCreate(Sender: TObject);
begin
FVariablesFr := TfrxVariables.Create;
end;
Из приведенного примера не понятно, где используется AddReportVar(pName: string; Value: Variant) , которая, явно, для этого и нужна.
Или необходимо для переменных заводить доп. блоб-поле, где их и хранить?
var
s: TMemoryStream;
begin
Result := False;
try
frxReport.Clear;
s := TMemoryStream.Create;
try
TFIBBlobField(DataSet.FieldByName('Data')).SaveToStream(s);
s.Position := 0;
frxReport.LoadFromStream(s);
finally
s.Free;
end;
frxReport.ReportOptions.Name := DataSet.FieldByName('Title').AsString;
frxReport.FileName := DataSet.FieldByName('Title').AsString;
Result := True;
except
end;
end;
function SaveReportToDataSet(DataSet: TpFIBDataSet): Boolean;
var
s: TMemoryStream;
begin
Result := False;
try
DataSet.Edit;
s := TMemoryStream.Create;
try
frxReport.SaveToStream(s, True, True);
s.Position := 0;
TFIBBlobField(DataSet.FieldByName('Data')).LoadFromStream(s);
finally
s.Free;
end;
DataSet.Post;
Result := True;
except
DataSet.Cancel;
end;
end;
У меня так. И никаких проблем.