zoukankan      html  css  js  c++  java
  • 【水晶报表实战】不同的子报表对应不同的页眉[转]

    本文为: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



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

    下面是最终的显示效果。









    (版内使用,请勿推荐)
  • 相关阅读:
    常见局域网类别
    精确率,召回率,准确率
    create-react-app创建第一个react程序_windows8.1
    编码与解码
    深度学习---嵌套简记
    反向传播算法简记
    MarkDown语法简记
    Vscode中的配置文件的作用简述
    wireshark 更好的查看TCP协议的数据,跟踪tcp流程
    wireshark 基础,颜色规则,过滤条件使用与多条过滤
  • 原文地址:https://www.cnblogs.com/jjj250/p/2285750.html
Copyright © 2011-2022 走看看