Сохранение в базу данных отчета FastReport в формате PDF
1. сформировать отчет в FastReport;
2. экспортировать отчет в файл PDF-формата и сохранить его в базе данных;
3. возвратить идентификатор сохраненного в базе данных файла.
Предположим, что исходная структура таблицы для хранения файла в базе данных была такая (MS SQLServer 2000):
CREATE TABLE X.FILES (
ID BIGINT IDENTITY NOT NULL,
FILE_BODY IMAGE NULL,
CONSTRAINT PK_FILES PRIMARY KEY (ID)),
где FILE_BODY – это поле, в которое сохраняется файл, а ID – идентификатор файла.
Для начала я создал процедуру, которая будет вставлять файл в базу данных и возвращать идентификатор вставленного файла.
CREATE PROCEDURE X.InsertFile
@FILE image,
@ID bigint OUTPUT
AS
INSERT INTO X.FILES(FILE_BODY) VALUES(@FILE)
SET @ID = SCOPE_IDENTITY()
GO
…
db: TSDDatabase; // база данных SQLDirect
spInsertFile: TSDStoredProc; // вызов X.InsertFile
frxReport: TfrxReport;
frxPDFExport: TfrxPDFExport;
…
Function GetDoc(const sDotName: String; …): Integer;
begin
Result := -1;
// загружаем шаблон отчета
If frxReport.LoadFromFile(sDotName)
then begin
// устанавливаем параметры отчета
…
If frxReport.PrepareReport
then try
// получаем имя временного файла
frxPDFExport.FileName := GetTempFileName;
Try
// экспортируем отчет во временный файл
frxReport.Export(frxPDFExport);
// загружаем PDF-файл в параметр процедуры
// из временного файла
spInsertFile.Params[1].LoadFromFile(frxPDFExport.FileName, ftBlob);
Except
on E: Exception do
WriteErrorMessage(E.Message);
End;
// сохраняем PDF-файл в базу данных
Try
db.StartTransaction;
spInsertFile.ExecProc;
db.Commit;
Result := spInsertFile.Params[2].AsInteger;
Except
on E: ESDEngineError do
begin
db.Rollback;
WriteErrorMessage(E.Message);
end;
End;
Finally
// удаляем временный файл
DeleteFile(frxPDFExport.FileName)
End
else WriteErrorMessage(‘Ошибка подготовки отчета’)
end
else WriteErrorMessage(‘Файл шаблона не найден’)
end;
Function GetDoc(const sDotName: String; …): Integer;
begin
Result := -1;
// загружаем шаблон отчета
If frxReport.LoadFromFile(sDotName)
then begin
// устанавливаем параметры отчета
…
If frxReport.PrepareReport
then begin
Try
Try
// создаём поток в памяти
frxPDFExport.Stream := TMemoryStream.Create;
// экспортируем отчет в поток
frxReport.Export(frxPDFExport);
// загружаем PDF-файл в параметр процедуры
// из потока в памяти
spInsertFile.Params[1].LoadFromStream(frxPDFExport.Stream, ftBlob);
Except
on E: Exception do
WriteErrorMessage(E.Message);
End;
Finally
frxPDFExport.Stream.Free;
End;
// сохраняем PDF-файл в базу данных
Try
db.StartTransaction;
spInsertFile.ExecProc;
db.Commit;
Result := spInsertFile.Params[2].AsInteger;
Except
on E: ESDEngineError do
begin
db.Rollback;
WriteErrorMessage(E.Message);
end;
End;
end
else WriteErrorMessage(‘Ошибка подготовки отчета’)
end
else WriteErrorMessage(‘Файл шаблона не найден’)
end;