Net有道

紫冠道人的求道历程

导航

2009年6月16日 #

FastReport的一些另类用法

前二天机缘巧合,在四五年后重新用起了fastreport,不得不感叹其强大之处,定制能力实在是太强了,今天把一些以前写的放在大富翁论坛的东西翻出来,如果现在还有用这个东西的,如果你也有一些另类的运用,可以有所帮助。

这里有一个FR报表简繁体转化的解决方案,只做一份报表,即可在简繁体下用。

报表运行时可编辑,这并不是什么用法,只是一个当时解决问题跟踪FR源码时的所得,以前在delphi下开发跟踪跟踪人家的源码受益匪浅。

数据集行列转换不是什么新鲜事,关于SQL的用法网上随便搜搜即有,这里有不用改变数据集,在FR里直接行列转换输出的例子,这样在就不用在表单层专门为报表重新生成一个数据集。

这里的很多技巧其实是因为不想为了报表显示重新用SQL生成全新的数据集,下面这个对帐单式的交错复合报表即是。

上面是以前做的,前二天做报表时,又遇到了新情况,报表的分组页码显示,这个其实简单得很,只是好久没用FR报表了所以觉得有搞,其实象那种在分组头显示合计之类的都是用类似技巧实现的。

posted @ 2009-06-16 20:48 lichdr 阅读(1111) 评论(0) 编辑

FastReport分组页码

这里的情况适用于FastReport2.53版本。

报表页码一般情况下就象在Word里一样不用费什么脑筋,FastReport里直接从系统变量可以得到。但特殊情况下就无法轻松得到了。

这里谈的是分组页码的问题,就是在报表分组的情况下。首先是每个分组强制分页,然后页码重新计数。比如5页分为二组,一组占了2页,另一组占3页。平常显示只要

1/5 2/5 3/5 4/5 5/5

这时要变成

1/2 2/2 1/3 2/3 3/3

 

第几页这是很容易算出来的,用个变量来表示页码,分组结束后重新算页码就行了,难点就在分组的页数,基本思路就是利用两遍报表,第一次得到各个分组的总页数,第二次再显示之。

 

首先定义三个变量,GPage用来表示页码初始值为1PageList用来存放分组的页码数初始值为{0}GIndex用来计算分组的索引初始值为0FGIndex用来第二次遍历时计算分组索引,其实这个与GIndex可以共用一个,但为了清晰起见分开用。

 

PageFooterBeforePrint里写

GPage := GPage + 1;

GroupFooterBeforePrint里写

if FinalPass then //二次遍历时增加分组索引

FGIndex := FGIndex + 1

else

begin

setLength(PageList,GIndex + 1);

PageList[GIndex] := Gpage; //存放分组的总页数

GIndex := GIndex + 1;

end;

GPage := 0;

 

这样所有的东西都有了,在显示页码的Memo里填[GPage]

在显示页数的Memo下面脚本段里写

if not FinalPass then exit;

MemoPageCount.Lines[0] := PageList[FGIndex];

MemoPageCount 是这个Memo的名字)

 

这样就达到上述的分组页码的要求了。

 

 

posted @ 2009-06-16 20:19 lichdr 阅读(1053) 评论(0) 编辑