本文为:http://topic.csdn.net/u/20100726/15/83a97e4a-1e17-4d0d-be69-529f85644191.html所作。

整理命题如下:

页面内容比较复杂,需要来源于多个静态页面及多个动态数据页面
使用子报表进行数据组合,每页要显示一个 【第N页,共M页】的标记
而且不同的子报表,页眉内容也不同。
但是因为水晶报表本身的问题,子报表中的第N页,共M页的计数是错误的
(单独以子报表的分页进行了处理)
另外因为子报表本身没有页眉和页脚,也存在一些处理上的问题。

本文的思路是,因为子报表延用主报表的页眉。而主报表的分页是正确的
那么我们可以使用主报表的页眉来模拟子报表的页眉。
这样【第N页,共M页】就没问题了,主要的问题是解决不同的子报表对应到不同页眉的问题。

本文技术难度0,主要是逻辑思维,呵呵。

首先我们建立如图的示例样板,3个页眉,对应3个不同的子报表。
注意各节的设置,页眉保留,子报表放在“报表页脚”节。
其他节不放内容,各数据和内容区块分别放在不同的子报表。


为了便于区别,子报表和对应的页眉设置了相同的底色色.
三个子报表设置不同的底色,这样检验的时候,只要保证页眉和内容颜色一致,且没有其他杂色即可,比较直观。

下面开始

首先我们来分析

在第1个子报表显示的时候,第2个页眉和第3个页眉要抑制显示掉。
在第2个子报表显示的时候,第1个页眉和第3个页眉要抑制显示掉。
在第3个子报表显示的时候,第1个页眉和第2个页眉要抑制显示掉。

那么如何抑制显示呢,我们要知道每个子报表是什么时候结束的。
这个是比较容易做到的。报表数据的执行结束,是在报表页脚。
所以我们设置一个标志位,让他在报表页脚时执行。
(此处执行的概念,就是把标志位放在这个位置即可)

那么问题来了,我们在子报表设置的这个标志位,怎么传递给主报表呢。
方法是有的,水晶报表中,可以通过Share前缀进行变量在主报表和子报表共享。
(这个与全局变量Global不同)

因为报表是顺序执行的,只能在子报表的后面的位置,得到这个子报表已经执行完的这个标志位。


1:首先,我们设置了3个标志位,分别是Page1End,Page2End,Page3End。这里设置了Number型
分别放在3个子报表的报表页脚,都设置为1。
那么除非已经执行到这个位置,否则在其他的时候,它们的值都是0

2:返回到主报表上。
当开始执行时,我们的第1个报表刚开始执行,还没有结束。
那么Page1End=0,Page2End=0,Page3End=0
此时要显示页眉1,隐藏页眉2和页眉3。

当执行完子报表1时,Page1End被设置为1。
此时会有两种情况,如果设置了子报表的格式中,将对象保持在一起的属性。

如下图





那么此时就会分页,子报表2会在新的一个页面上显示
没有设置的话,则子报表2会紧接着子报表1显示。
(设置与否,并不影响最终结果,这里只是说明一下)

无论是否延续显示,在Page1End的位置,也就是子报表的最后一页上,还是显示页眉1

主要是看下一个页面。
下一个页面,开始显示子报表2。
此时,Page1End=1,Page2End=0,Page3End=0


同理,如果到了子报表3的时候,Page1End=1,Page2End=1,Page3End=0

现在我们把上面的几种情况一列,思路就清晰了

进入节专家,来控制各节的显示情况即可。

下面说一下具体实现,首先来设置标志位。

在子报表1中,新建一个公式x1End

C# code
Shared Numbervar Page1End;
Page1End:
=1;



拖到子报表的报表页脚

同理子报表2和3,分别是
C# code
Shared Numbervar Page2End;
Page2End:
=1;



(实际上,如果是最后一个子报表的话,公式是不需要的,因为他已经没有后续页~~)
C# code
Shared Numbervar Page3End;
Page3End:
=1;



前台来接受这几个值,并控制页眉

节专家,点中页眉1,勾选抑制显示,编辑后面的公式为:
C# code
//只要Page1End=1了,就抑制显示
Shared numbervar Page1End;
Page1End
=1



页眉2稍微不同
C# code
//当Page2End=1时抑制显示,并且需要在Page1End=0(子报表1显示时)时也抑制显示
Shared Numbervar Page1End;
Shared Numbervar Page2End;

Page2End
=1 or Page1End=0



页眉3稍微不同
C# code

//当Page2End=3时抑制显示,并且需要在子报表1显示时或子报表2显示时时也抑制显示
Shared Numbervar Page1End;
Shared Numbervar Page2End;
Shared Numbervar Page3End;

Page3End
=1 or Page1End=0 or Page2End=0



注意上面公式中,用到哪个变量,都要进行声明。

下面是最终的显示效果。









(版内使用,请勿推荐)
posted on 2011-12-13 10:56  懒懒的呐喊  阅读(973)  评论(0编辑  收藏  举报