Снова датасеты в рантайме

отредактировано 06:42 Раздел: FastReport 3.0
Задача такая. При открытии отчета запрашиваются параметры (в режиме исполнения отчета, а не программы), например "показать детали типа 1", "показать детали типа 2". Но набор полей деталей одинаков - различаюся запросы на основании которых эти детали создаются. Даже это не суть важно, важно, что при создании набора данных из отчета в любой момент кроме как в главной части скрипта (begin end.) - отчет будет пустым. Я так понимаю, что сперва строится отчет, потом открывается диалог. Как заставить отчет перестроится?
Вот пример скрипта:
var
F012, F122: TfrxDataSet;
I: Integer;

procedure Page1OnBeforePrint(Sender: TfrxComponent);
begin
Header2.Visible := <ShowDetail>;
DetailData1.Visible := <ShowDetail>;
Footer1.Visible := <ShowDetail>;
Child3.Visible := <ShowDetail>;
Child2.Visible := <ShowDetail>;
Child1.Visible := <ShowDetail>;
end;

procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
if not <ShowDetail> then
begin
Memo8.Color := clNone;
Memo9.Color := clNone;
SysMemo1.Color := clNone;
Memo11.Color := clNone;
Memo12.Color := clNone;
Memo13.Color := clNone;
Memo14.Color := clNone;
Memo20.Color := clNone;
Memo57.Color := clNone;
Memo58.Color := clNone;
end;
end;

procedure DialogPage1OnShow(Sender: TfrxComponent);
begin
if <ShowDetail> then
CheckBox1.State := cbChecked
else
CheckBox1.State := cbUnChecked;

if <ShowSale> then
CheckBox2.State := cbChecked
else
CheckBox2.State := cbUnChecked;
end;

procedure SysMemo4OnAfterData(Sender: TfrxComponent);
begin
Report.Variables := Report.Variables + SysMemo4.Value;
end;

procedure GroupHeader2OnAfterPrint(Sender: TfrxComponent);
begin
Report.Variables := 0;
end;

procedure GroupHeader1OnAfterPrint(Sender: TfrxComponent);
begin
Report.Variables := 0;
end;

procedure OnStartReport(Sender: TfrxComponent);
begin
Report.Variables := 0;
end;

procedure Memo48OnAfterData(Sender: TfrxComponent);
begin
Report.Variables := Report.Variables + Report.Variables;
end;

procedure Memo51OnAfterData(Sender: TfrxComponent);
begin
Report.Variables := Report.Variables + Report.Variables;
end;

procedure OnStopReport(Sender: TfrxComponent);
begin
FreeDS(Report, 'F012');
FreeDS(Report, 'F122');
end;

procedure CheckBox1OnClick(Sender: TfrxComponent);
begin
if CheckBox1.State = cbChecked then
Report.Variables := True
else
Report.Variables := False;
CheckBox2.Visible := Report.Variables;
end;

procedure CheckBox2OnClick(Sender: TfrxComponent);
begin
if CheckBox2.State = cbChecked then
Report.Variables := True
else
Report.Variables := False;
end;

procedure OnRunDialogs(var Result: Boolean);
begin
Result := DialogPage1.ShowModal = mrOk;
if not Result then
exit;

FreeDS(Report, 'F012');
FreeDS(Report, 'F122');
F012 := CreateDSWithSql(Report, 'F012',
'select F012_02,'
+ ' S08_03_1 as F012_02_S08_03_1,'
+ ' S08_10 as F012_02_S08_10,'
+ ' D.S13_03_1 as F012_02_S08_04_1_S13_03_1,'
+ ' SALE_17,'#13
+ ' S08_02 as F012_02_S08_02,'
+ ' A.S081_03_1 as F012_02_S08_02_S081_03_1,'#13
+ ' S08_02_1 as F012_02_S08_02_1,'
+ ' B.S081_03_1 as F012_02_S08_02_1_S081_03_1,'#13
+ ' S083_03_1 as F012_02_1_S083_03_1,'#13
+ ' F012_06,'
+ ' S12_03_1 as F012_06_S12_03_1,'#13
+ ' F012_04,'
+ ' S09_03_1 as F012_04_S09_03_1,'#13
+ ' C.S13_03_1 as F012_04_1_S13_03_1,'
+ ' factor,'
+ ' F012_04_2,'#13
+ ' min(F051_07) as F051_07, max(F051_08) as F051_08,'
+ ' sum(F012_04_5*case when(F012_04_3=0) then 1 else F012_04_4 end) as F012_04_5,'#13
+ ' sum(F012_05) as F012_05'#13
+ ' from ((((((((((((F012'
+ ' inner join F010 on F010_00=F012_01)'
+ ' inner join F051 on F010_03=F051_01 and F010_03_1= F051_01_1 and F010_07 between F051_07 and F051_08)'
+ ' left join S10 on F010_02=S10_01)'
+ ' left join S08 on F012_02=S08_01)'
+ ' left join S08_UNIT on prod=F012_02 and unit=F012_04_1)'
+ ' left join S081 A on S08_02=A.S081_01 and A.S081_01_1=0)'
+ ' left join S081 B on S08_02=B.S081_01 and S08_02_1=B.S081_01_1)'
+ ' left join S083 on F012_02_1=S083_01)'
+ ' left join S12 on F012_06=S12_01)'
+ ' left join S09 on F012_04=S09_01)'
+ ' left join S13 C on F012_04_1=C.S13_01)'
+ ' left join S13 D on S08_04_1=D.S13_01)'
+ ' left join P12_SALE(F012.F012_06, 7, F051.F051_07) on SALE_16_1=7'
+ ' where F010_NCP = '' C '' and F051_NCP <> '' P'' and F012_NCP = '' C '''
+ ' and S10_02 like :F010_02_S10_02'
+ ' and (F010_03 = coalesce(:F010_03, F010_03) or (:F010_03 = 0))'
+ ' and (F010_03_1 = coalesce(:F010_03_1, F010_03_1) or (:F010_03_1 = 0))'
+ ' and (F010_04 = coalesce(:F010_04, F010_04) or (:F010_04 = 0))'
+ ' and F051_07 >= coalesce(:F010_07_Calc, F051_07)'
+ ' and F051_08 <= coalesce(:F010_08_Calc, F051_08)'
+ ' group by S08_02, A.S081_03_1, S08_02_1, B.S081_03_1, F012_02, S08_03_1, S08_10, D.S13_03_1, sale_17, S083_03_1, F012_06, S12_03_1, F012_04, S09_03_1, F012_04_1, C.S13_03_1, factor, F012_04_2'
+ ' order by S08_02, S08_02_1, S08_03_1, S08_10, F012_06, sale_17',
'F010', nil, -1);
F012.Open;
MasterData1.DataSet := F012;

if <ShowDetail> then
begin
if <ShowSale> then
F122 := CreateDSWithSql(Report, 'F122',
'select S11_03_1 as F122_02_S11_03_1,'
+ ' S13_03_1 as F122_02_S11_04_1_S13_03_1,'
+ ' F122_05, F113_17 as F122_02_F113_17'
+ ' from (((F122'
+ ' left join S11 on F122_02=S11_01)'
+ ' left join S13 on S11_04_1=S13_01)'
+ ' left join S12_SALE(:F012_06, 7, :F051_07, :F051_08) on sale_16_1=7)'
+ ' left join F113 on F122_02=F113_01 and (F113_07 between sale_07 and sale_08'
+ ' or F113_08 between sale_07 and sale_08)'
+ ' where F122_NCP <> '' P'' and F113_NCP <> '' P'''
+ ' and F122_01=:F012_06'
+ ' and sale_17=:sale_17'
+ ' order by S11_03_1',
'', F012)
else
F122 := CreateDSWithSql(Report, 'F122',
'select S11_03_1 as F122_02_S11_03_1,'
+ ' S13_03_1 as F122_02_S11_04_1_S13_03_1,'
+ ' F122_05, 0 as F122_02_F113_17'
+ ' from ((F122'
+ ' left join S11 on F122_02=S11_01)'
+ ' left join S13 on S11_04_1=S13_01)'
+ ' where F122_NCP <> '' P'''
+ ' and F122_01=:F012_06'
+ ' order by S11_03_1',
'', F012);
DetailData1.DataSet := F122;
end
else
DetailData1.DataSet := nil;
end;

begin
end.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.