有个客户提出个需求:
同一张数据表,需要根据条件生成并打印不同格式的报表。我这边通过一个订单来演示一下。
Step 1:
准备数据生成Json,导入康虎云报表打印设计器,并生成第一张报表
Step 2:
另外创建四个新报表,Page2、Page3、Page4、Page5,为节省时间,我把Page1的格式复制到后四个Page中,并在报表标题后增加 下划线+数字 来区分,以便预览时可以看清效果。
Step 3: 在每个报表页的主数据栏(MasterData)右上角的“sale_order”上双击,输入过滤条件。
Page1只显示订单号为 S00009 的内容,则过滤条件是 <sale_order.name>='S00013',其他类推:
Page2过滤条件为 <sale_order.name>='S00015';
Page3过滤条件为 <sale_order.name>='S00020';
Page4过滤条件为 <sale_order.name>='S00021';
Page5过滤条件为 <sale_order.name>='S00022';
下面是Page2的设置截图,其他Page一样操作
Step 4:
在左侧报表报表对象窗口,滚动条拉到最上面,找到report对象,点击选中report,然后在左下侧事件中,找到“OnStartReport”事件,在后面空格中双击,切换到代码编辑窗口:
然后在代码编辑窗口的OnStartReport事件函数内部编写代码:
procedure OnStartReport(Sender: TfrxComponent);
begin
{手写代码从这里开始}
//获取报表主数据栏(MasterData)对应的数据表(DataSet)
DS := TfrxDBDataSet(Report.GetDataset('sale_order')).DataSet;
if DS <> nil then begin
//按Page1里的过滤条件对数据表进行过滤,如果过滤后数据指针到结果,则表示无数据而隐藏Page1
DS.Filtered := False;
DS.Filter := 'name=''S00013''';
DS.Filtered := True;
if DS.Eof then Page1.Visible := False;
//按Page2里的过滤条件对数据表进行过滤,如果过滤后数据指针到结果,则表示无数据而隐藏Page2
DS.Filtered := false;
DS.Filter := 'name=''S00095'''; //这里故意设置一个不存在的订单号,以验证是否能隐藏Page2
DS.Filtered := true;
if DS.Eof then Page2.Visible := False;
//按Page3里的过滤条件对数据表进行过滤,如果过滤后数据指针到结果,则表示无数据而隐藏Page3
DS.Filtered := false;
DS.Filter := 'name=''S00020''';
DS.Filtered := true;
if DS.Eof then Page3.Visible := False;
//按Page4里的过滤条件对数据表进行过滤,如果过滤后数据指针到结果,则表示无数据而隐藏Page4
DS.Filtered := false;
DS.Filter := 'name=''S00021''';
DS.Filtered := true;
if DS.Eof then Page4.Visible := False;
//按Page5里的过滤条件对数据表进行过滤,如果过滤后数据指针到结果,则表示无数据而隐藏Page5
DS.Filtered := false;
DS.Filter := 'name=''S00022''';
DS.Filtered := true;
if DS.Eof then Page5.Visible := False;
//最后取消加上的过滤条件
DS.Filtered := false;
DS.Filter := '';
DS.Filtered := true;
end;
{手写代码到这里结束}
end;
截图如下:
Step 5:
再预览一下效果:
我们再把Page2的过滤条件改一下,改成数据集中不存在订单号,比如: S00095,预览后发现销售订单_2隐藏不见了: