报表知识库
我要提问

比参数更灵活的宏

报表参数毫无疑问是所有报表工具都应当提供功能,否则我们就要为每一张报表实例制作模板,这也就是自动化的报表工具与电子表格类产品(如EXCEL)的根本区别之一。比如,有一张报表每月都要出,格式一样,但每月引用的数据是当月的。这时就可以做一张以月份为参数的报表,该参数在某些报表表达式中被引用,如在本例会在取出数据的SQL语句中写上类似WHERE 月份=arg的表达式。这样,只需绘制一遍报表模板后,报表运算器即可根据不同参数运算出不同月份的报表,而不必为每个月专门绘制报表。 然而,还有些我们需要的变化情况是用目前的参数机制解决不了的,举两例:1:我们可以用参数把取数条件从“=3月“改成“=5月”,但我们不能把“=3改成“>5月”;2:两张格式相同的报表,其数据分别来自两张数据结构类似的不同数据表(这种现象在信息系统中很常见,如教育系统中本科生和研究生数据结构大体一致,但一般会为了效率和处理方便设计成两个数据表),而我们不能用参数去改变SQL语句中FROM后面的部分; 为解决上述问题,润乾报表除了提供可应用于数据源(如SQL语句)和报表格间运算中的参数外,还提供了更为灵活的宏!宏可以被理解为一种特殊的参数,应用宏能使报表有更多灵活的变化。与一般意义的参数不同,宏没有数据类型,可用于替换报表表达式的任何部分。如将SQL语句中的整个WHERE子句作为一个宏,可以写类似SELECT … FROM … WHERE macro的句子,在报表运算前将macro替换成传入的表达式(宏值)即可继续计算下去;同样地,FROM后面的表名也可以作为宏来传递。当然,宏在带来方便的同时,也有其缺点,写进了宏的表达式在报表设计期间无法进行语法检查,只能在解析后才能查出错误,使用时必须很小心;另外,宏的解析很复杂,会影响表达式的处理速度(C编译器有相当多时间用于解析宏,PASCAL没这问题速度能快很多),对于表达式很多且性能要求很高的情况尽量不要采用宏。 润乾报表与水晶报表曾有个相关的竞争案例。用户有一张报表希望以某个字段排序输出,需要有正序和逆序两种形式。出于某些设计方面的原因,必须采用数据库的排序运算,即用SQLORDER BY子句控制,但该排序字段又不是数值型量,只能用ASCDESC控制,但排序方向在水晶报表中不可作为参数传递,结果只能制作两张报表(如果是数值型量可通过乘1-1控制,不必改变排序方向,即可用参数传递了),维护其一致性非常麻烦;而采用润乾报表特有的宏,只要把排序方向作为宏传入就可以轻松解决。