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 自定义表如何实现主、从关系