Skip to content

报表设计器 经验总结 ​

第59章 报表机器功能目标 ​

  1. 报表开发简单,维护人员、测试人员也可根据客户要求增加新报表
  2. 报表开发好后可重复使用
  3. 增加新报表不需要对EXE文件重新编译
  4. 所有报表(普通和复杂)都使用相同的控件
  5. 报表支持宏语言(SCRIPT),有很好的二次开发能力
  6. 报表定义过程既支持向导式傻瓜操作,也支持专业微调
  7. 报表可分级管理及定义权限
  8. 报表可自定义新纸张
  9. 所有报表保存在数据库中,根据调用窗口分类
  10. 支持云端报表模板的下载和使用
  11. 继续支持原来的一些插件

第60章 对报表机器的主要内核修改 ​

  1. 报表事件的宏语言采用新的解释器,全面模拟DELPHI
  2. 报表增加自定义纸张接口
  3. 报表增加默认变量接口
  4. 报表增加默认数据字段别名接口(解决英文字段不好用的问题)
  5. 报表增加默认使用数据集接口
  6. 报表增加简单向导功能
  7. 报表增加代码统一管理功能(模拟了VB的方案,方便查找和定位代码)
  8. 报表增加要保存的信息
  9. 简化给报表机器增加新函数的方法
  10. 修改了报表对个别打印机英文驱动的处理错误
  11. 对原有控件类型进行了扩充修改

新解释器主要修改:

  1. 支持报表机器专有变量和数据集字段别名
  2. 支持带引号的字符串常量
  3. 支持对象多级调用和未知对象,全面兼容Object Pascal语法
  4. 解释程序运行SQL命令出错后在C:\ERROR目录留下当前SQL命令的执行语句错误
  5. 修改了自动探测友元(Friend)窗口对象的算法
  6. 改正“QUERY参数定义有时不保存”的错误

第61章 报表统一调用函数说明 ​

将所有打印工作归纳为一个统一调用的函数,保存在_LIB.PAS中。

pascal
Procedure _Print_Report(
  Const ReportName : String;                    // 报表类别(必须非空)
  MainDataSet : TDataSet;                      // 简单报表使用的主要数据集合(可为空)
  const DisabledArray : array of String;       // 不可视数据集合
  const NeedArray : array of String;           // 默认使用集合(用于简单报表向导)
  const DefaultVariableArray : array of String;// 默认的报表机器变量
  Const SetDefaultVariableValue : String = ''; // 定义默认报表机器变量的值
  OnGetValue : TRMDetailEvent = nil            // 定义解释新报表机器变量的函数
);

实际例子:

pascal
_Print_Report('销售单',
  DATA_JXC.TABLE_DJT,
  ['Data_CX*','Form_Main*','Form_Qk_Xz*','Form_WAIT*','Form_XZTZ*','LOCATE_QUERY','QUERY_NEW','TABLE1'],
  ['DATA_JXC.TABLE_DJ','DATA_JXC.TABLE_DJT'],
  ['单据主表','单据明细表'],
  '单据主表=[DJ_JZ'+Inttostr(SYS_KJQ)+'] 单据明细表=[DJT_JZ'+Inttostr(SYS_KJQ)+']'
);

第62章 DBGrid打印准备函数 ​

将DBGrid中列头显示内容定义到DataSet中TField的Display属性,方便“简单报表向导”使用。

pascal
Procedure _Check_Table(Data : TDataSet; Grid : TDBGrid);
Procedure _Check_Table_DBGridEh(Data : TDataSet; GridEh : TDBGridEh);

第63章 使用统一的报表管理窗口 ​

所有报表数据保存在帐套数据库中:

image.png

第64章 支持报表模板 ​

方便快速定制化开发。

image.png

第65章 简单报表向导 ​

  1. 支持打印DBGRID和DBGRIDEH
  2. 使用方便、操作简单,可反复定义,全面模拟原来的老向导
  3. 支持打印页合计、总计和多级表头

第66章 设置新纸张类型 ​

支持用户自定义特殊纸张类型,并保存在数据库中。

image.png

如果希望报表每次自动打印到指定的打印机,就不要选择默认打印机,这样不会因为默认打印机的变化导致打印对象的变化。

第67章 类似DELPHI的宏代码开发 ​

注意事项:

  1. 不支持指针操作
  2. 不支持动态数组
  3. 不支持数据字典变量嵌套
  4. 部分对象的部分动作不支持(如ASSIGN)
  5. 注意事件响应的先后次序
  6. 不支持代码执行自动优化和检查,不正确的代码可能造成死循环或溢出
  7. 没有完善的调试功能,只能靠SHOWMESSAGE函数
  8. 报表中定义的TABLE和QUERY不是日常使用的TTABLE和TQUERY,操作下级对象需用Table1.Table.Filter​
  9. 所有PAGE的控件保存在同一个窗口上,不同PAGE上的控件名称不允许重复
  10. 支持局部变量和子函数(子过程)
  11. 新增加了大量的常用DELPHI函数

image.png

第68章 代码管理 ​

因为报表机器太灵活了,可以在很多地方定义事件,因此为了避免其他开发人员找不到代码的情况出现,必须有一个窗口,可以查看到当前PAGE里面的全面宏代码。​

image.png

第69章 设置表字段别名 ​

一般通过调用函数自动定义,也可通过数据字典手工定义,结果保存在报表文件(报表数据)中。

第70章 设置默认变量及处理 ​

一般通过调用函数自动定义,也可通过数据字典手工定义,结果保存在报表文件(报表数据)中。

第71章 保存报表文件及设置报表信息 ​

定义好的报表应保存特定信息,方便多次使用。

第72章 给报表机器增加新函数 ​

1. 定义新函数类型:

pascal
TMSTARFunction = class(TRMFunction)
public
  procedure DoFunction(p1, p2, p3: Variant; var val: Variant;
    Const FunctionName : String = ''); override;
end;

2. 增加新函数:

pascal
RegisterRMFunction(TMSTARFunction,'选择商品','返回你选择的某商品的编号.','', RMftOther);
RegisterRMFunction(TMSTARFunction,'选择分类标准','返回你选择是那种分类标准(1-5).','', RMftOther);
RegisterRMFunction(TMSTARFunction,'选择仓库','返回你选择的某仓库的编号.','', RMftOther);

3. 函数的具体实现:

pascal
procedure TMSTARFunction.DoFunction(p1, p2, p3: Variant;
  var val: Variant; Const FunctionName : String = '');
begin
  val := 0;
  IF FunctionName = '选择商品' Then
    val := DATA_JXC.get_spbh;
  IF FunctionName = '选择分类标准' Then
    val := Form_ReportManage.Select_FLBZ;
  IF FunctionName = '选择日期' Then
    val := Formatdatetime('yyyy/MM/dd', _GET_DATE_DATE(Now));
  // ... ...
end;

第73章 小技巧 ​

73.1 自动补空行 ​

Band 设置这个属性即可

image.png

73.2 页小计和总计的实现 ​

向导添加方式

image.png

手工添加方式

首先请用报表向导制作一个报表并将“栏目注脚”区域里的所有对象删除,再加一个“总结”边条,你将看到下图

image.png

请在上图中栏目注脚和总结区域里分别添加“插入汇总对话框”和“插入文本框”

image.png

在“插入文本框”中输入 -- 金额合计

在“汇总框”点击右键,将弹出下图

image.png

我们选择“统计类型”,将弹出对话框

image.png

在统计类型里为汇总框设计统计类型,在统计Band中设计统计的对象

在统计条件里为汇总框设计统计条件等等。

在这里,我们统计的是主项数据,所以选择“Masterdatal(master data)”

设计好以后请点击“确认”就可以了

使用同样的方法,我们为“总结”区域里的汇总框设计统计条件。

设计好以上条件后,就完成了页小计和总计,点预览,我们将看到相应的汇总结果,如图

image.png

73.3 强迫换页 ​

73.4 控制报表的打印行数 ​

以每页打印10行为例子

方法有3种:
(1)通过不断调整页脚的高度,再结合预览逐步调整到10行换页即可。
(2)你点 主项数据BAND 按F11 点 NEWPAGECONDITION 条件里面输入
[LineThrough#] MOD 10 = 0
(3)在主项数据的 onbeforeprint 宏代码中写

pascal
begin
  if [LINE#] mod 10=0 then
    Report.newpage;
end

73.5 自定义表如何实现主、从关系 ​