Appearance
第59章 报表机器功能目标
- 报表开发简单,维护人员、测试人员也可根据客户要求增加新报表
- 报表开发好后可重复使用
- 增加新报表不需要对EXE文件重新编译
- 所有报表(普通和复杂)都使用相同的控件
- 报表支持宏语言(SCRIPT),有很好的二次开发能力
- 报表定义过程既支持向导式傻瓜操作,也支持专业微调
- 报表可分级管理及定义权限
- 报表可自定义新纸张
- 所有报表保存在数据库中,根据调用窗口分类
- 支持云端报表模板的下载和使用
- 继续支持原来的一些插件
第60章 对报表机器的主要内核修改
- 报表事件的宏语言采用新的解释器,全面模拟DELPHI
- 报表增加自定义纸张接口
- 报表增加默认变量接口
- 报表增加默认数据字段别名接口(解决英文字段不好用的问题)
- 报表增加默认使用数据集接口
- 报表增加简单向导功能
- 报表增加代码统一管理功能(模拟了VB的方案,方便查找和定位代码)
- 报表增加要保存的信息
- 简化给报表机器增加新函数的方法
- 修改了报表对个别打印机英文驱动的处理错误
- 对原有控件类型进行了扩充修改
新解释器主要修改:
- 支持报表机器专有变量和数据集字段别名
- 支持带引号的字符串常量
- 支持对象多级调用和未知对象,全面兼容Object Pascal语法
- 解释程序运行SQL命令出错后在
C:\ERROR目录留下当前SQL命令的执行语句错误 - 修改了自动探测友元(Friend)窗口对象的算法
- 改正“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章 使用统一的报表管理窗口
所有报表数据保存在帐套数据库中:

第64章 支持报表模板
方便快速定制化开发。

第65章 简单报表向导
- 支持打印DBGRID和DBGRIDEH
- 使用方便、操作简单,可反复定义,全面模拟原来的老向导
- 支持打印页合计、总计和多级表头
第66章 设置新纸张类型
支持用户自定义特殊纸张类型,并保存在数据库中。

如果希望报表每次自动打印到指定的打印机,就不要选择默认打印机,这样不会因为默认打印机的变化导致打印对象的变化。
第67章 类似DELPHI的宏代码开发
注意事项:
- 不支持指针操作
- 不支持动态数组
- 不支持数据字典变量嵌套
- 部分对象的部分动作不支持(如ASSIGN)
- 注意事件响应的先后次序
- 不支持代码执行自动优化和检查,不正确的代码可能造成死循环或溢出
- 没有完善的调试功能,只能靠SHOWMESSAGE函数
- 报表中定义的TABLE和QUERY不是日常使用的TTABLE和TQUERY,操作下级对象需用
Table1.Table.Filter - 所有PAGE的控件保存在同一个窗口上,不同PAGE上的控件名称不允许重复
- 支持局部变量和子函数(子过程)
- 新增加了大量的常用DELPHI函数

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

第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 设置这个属性即可

73.2 页小计和总计的实现
向导添加方式

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

请在上图中栏目注脚和总结区域里分别添加“插入汇总对话框”和“插入文本框”
在“插入文本框”中输入 -- 金额合计
在“汇总框”点击右键,将弹出下图

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

在统计类型里为汇总框设计统计类型,在统计Band中设计统计的对象
在统计条件里为汇总框设计统计条件等等。
在这里,我们统计的是主项数据,所以选择“Masterdatal(master data)”
设计好以后请点击“确认”就可以了
使用同样的方法,我们为“总结”区域里的汇总框设计统计条件。
设计好以上条件后,就完成了页小计和总计,点预览,我们将看到相应的汇总结果,如图

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