Добавление одного отчета к другому
Добрый день.
Есть большой отчет MAINREPORT, в который в циклах добавляются другие отчеты.
Первый цикл (внешний) добавляет страницы разделители TITLEREPORT.
ЭТО РАБОТАЕТ.
Второй цикл (i), сначала должен аналогичным способом сформировать страницу PAGEREPORT
из 3-х небольших отчетов, шаблоны которых выбираются по условию <УСЛОВИЕ>.
Подготовленная таким способом страница PAGEREPORT тоже добавляется в основной отчет MAINREPORT.
ЭТО ТОЖЕ РАБОТАЕТ.
Т.е. страницы TITLEREPORT и PAGEREPORT правильно добавляются в основной отчет.
НЕ ВЕРНО формируется страница PAGEREPORT. На ней виден всегда только ОДИН ПОСЛЕДНИЙ отчет (vFrame), а должно быть три друг за другом.
Где я не верно делаю?
<!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->// ЭТИ КОМПОНЕНТЫ НА ФОРМЕ
MAINREPORT : TfrxReport;
TITLEREPORT : TfrxReport;
PAGEREPORT : TfrxReport;
FRAME1 : TfrxReport;
FRAME2 : TfrxReport;
// ДАЛЕЕ ПРОЦЕДУРА
procedure TMyClass.ПРОЦЕДУРА
var
r, i : Integer;
vFrame : TfrxReport;
vPage : TfrxReportPage;
begin
// есть цикл, программно формирующий отчет
for r := 1 to 100 do
begin
// здесь формируем страницу-разделитель (заголовок)
TITLEREPORT.PrepareReport(true);
// здесь добавляем ТИТУЛ в основной отчет
// на первом шаге с очисткой основного отчета, затем - просто добавление в конец
Add2Composite(MAINREPORT, TITLEREPORT, r = 1);
// в этом цикле на отдельную страницу PAGEREPORT сначала собираем 3 небольших отчета
// шаблон добавляемого отчета выбирается по какому-то условию <УСЛОВИЕ> (FRAME1 или FRAME2)
for i := 1 to 3 do
begin
// создаем компонент для 'небольшого' отчета
vFrame := TfrxReport.Create(nil);
try
// тут выбираем 'небольшой' отчет
if <УСЛОВИЕ> then
Add2Composite(vFrame, FRAME1, true)
else
Add2Composite(vFrame, FRAME2, true);
// тут устанавливаем значение свойства PrintOnPreviousPage
vPage := vFrame.FindObject('repPage') as TfrxReportPage;
vPage.PrintOnPreviousPage := i <> 1;
// формируем 'небольшой' отчет
vFrame.PrepareReport(true);
// тут добавляем 'небольшой' отчет на страницу-контейнер
if i = 1 then
Add2Composite(PAGEREPORT, vFrame, true)
else
Add2Composite(PAGEREPORT, vFrame, false);
finally
vFrame.Free;
end;
end;
// тут добавляем страницу-контейнер в основной отчет
PAGEREPORT.PrepareReport(true);
Add2Composite(MAINREPORT, PAGEREPORT, false);
end;
// тут формируем основной отчет
MAINREPORT.PrepareReport(true);
MAINREPORT.ShowPreparedReport;
end;
function TMyClass.Add2Composite(const xDstReport, xSrcReport : TfrxReport; const xDstClear : Boolean) : Boolean;
var
vStream : TMemoryStream;
begin
// результат по умолчанию - копирование не выполнено
Result := false;
// если объекты-отчеты не созданы, копирование не выполнять
if (not Assigned(xDstReport)) or (not Assigned(xSrcReport)) then
Exit;
// очистить отчет-приемник
if xDstClear then
xDstReport.Clear;
// создать поток для копирования
vStream := TMemoryStream.Create;
try
try
// выполнить копирование подготовленного отчета
xSrcReport.SaveToStream(vStream);
vStream.Position := 0;
xDstReport.LoadFromStream(vStream);
xDstReport.PrepareReport(xDstClear);
// установить результат копирования
Result := true;
except
end;
finally
if Assigned(vStream) then
vStream.Free;
end;
end;<!--fontc--></span><!--/fontc-->
Спасибо.
Есть большой отчет MAINREPORT, в который в циклах добавляются другие отчеты.
Первый цикл (внешний) добавляет страницы разделители TITLEREPORT.
ЭТО РАБОТАЕТ.
Второй цикл (i), сначала должен аналогичным способом сформировать страницу PAGEREPORT
из 3-х небольших отчетов, шаблоны которых выбираются по условию <УСЛОВИЕ>.
Подготовленная таким способом страница PAGEREPORT тоже добавляется в основной отчет MAINREPORT.
ЭТО ТОЖЕ РАБОТАЕТ.
Т.е. страницы TITLEREPORT и PAGEREPORT правильно добавляются в основной отчет.
НЕ ВЕРНО формируется страница PAGEREPORT. На ней виден всегда только ОДИН ПОСЛЕДНИЙ отчет (vFrame), а должно быть три друг за другом.
Где я не верно делаю?
<!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto-->// ЭТИ КОМПОНЕНТЫ НА ФОРМЕ
MAINREPORT : TfrxReport;
TITLEREPORT : TfrxReport;
PAGEREPORT : TfrxReport;
FRAME1 : TfrxReport;
FRAME2 : TfrxReport;
// ДАЛЕЕ ПРОЦЕДУРА
procedure TMyClass.ПРОЦЕДУРА
var
r, i : Integer;
vFrame : TfrxReport;
vPage : TfrxReportPage;
begin
// есть цикл, программно формирующий отчет
for r := 1 to 100 do
begin
// здесь формируем страницу-разделитель (заголовок)
TITLEREPORT.PrepareReport(true);
// здесь добавляем ТИТУЛ в основной отчет
// на первом шаге с очисткой основного отчета, затем - просто добавление в конец
Add2Composite(MAINREPORT, TITLEREPORT, r = 1);
// в этом цикле на отдельную страницу PAGEREPORT сначала собираем 3 небольших отчета
// шаблон добавляемого отчета выбирается по какому-то условию <УСЛОВИЕ> (FRAME1 или FRAME2)
for i := 1 to 3 do
begin
// создаем компонент для 'небольшого' отчета
vFrame := TfrxReport.Create(nil);
try
// тут выбираем 'небольшой' отчет
if <УСЛОВИЕ> then
Add2Composite(vFrame, FRAME1, true)
else
Add2Composite(vFrame, FRAME2, true);
// тут устанавливаем значение свойства PrintOnPreviousPage
vPage := vFrame.FindObject('repPage') as TfrxReportPage;
vPage.PrintOnPreviousPage := i <> 1;
// формируем 'небольшой' отчет
vFrame.PrepareReport(true);
// тут добавляем 'небольшой' отчет на страницу-контейнер
if i = 1 then
Add2Composite(PAGEREPORT, vFrame, true)
else
Add2Composite(PAGEREPORT, vFrame, false);
finally
vFrame.Free;
end;
end;
// тут добавляем страницу-контейнер в основной отчет
PAGEREPORT.PrepareReport(true);
Add2Composite(MAINREPORT, PAGEREPORT, false);
end;
// тут формируем основной отчет
MAINREPORT.PrepareReport(true);
MAINREPORT.ShowPreparedReport;
end;
function TMyClass.Add2Composite(const xDstReport, xSrcReport : TfrxReport; const xDstClear : Boolean) : Boolean;
var
vStream : TMemoryStream;
begin
// результат по умолчанию - копирование не выполнено
Result := false;
// если объекты-отчеты не созданы, копирование не выполнять
if (not Assigned(xDstReport)) or (not Assigned(xSrcReport)) then
Exit;
// очистить отчет-приемник
if xDstClear then
xDstReport.Clear;
// создать поток для копирования
vStream := TMemoryStream.Create;
try
try
// выполнить копирование подготовленного отчета
xSrcReport.SaveToStream(vStream);
vStream.Position := 0;
xDstReport.LoadFromStream(vStream);
xDstReport.PrepareReport(xDstClear);
// установить результат копирования
Result := true;
except
end;
finally
if Assigned(vStream) then
vStream.Free;
end;
end;<!--fontc--></span><!--/fontc-->
Спасибо.