zoukankan      html  css  js  c++  java
  • 报表引擎 -扩展模型

    介绍

    本文档是参考润乾报表模型,继《报表应用思路》的进一步分析,说明平台报表中涉及的多个相关模型,为后续报表开发提供概念以及总体设计支持

    术语

    名称

    说明

    单元格

    报表由行列整齐的格子组成,这些格子我们称为单元格,所有的单元格组成了报表。

    主格和附属格

    主格和附属格是互相关联的,当A单元格扩展时,B单元格被 同步复制,此时A单元格称为B单元格的主格,B单元格称为A单元格的附属单元格。

     横伸主格

    如果A单元格横向扩展则则A为横伸主格

     纵展主格

    如果A单元格纵向扩展则则A为纵展主格

    合并单元格

    多个连续的单元格通过合并操作后显示为一个大的格子,合并后的格子成为合并单元格

    单元格属性值和表达式

    单元格的大部分属性都有属性值和表达式两种。
    属性值是在编辑报表时确定的,在运行期间不必经过运算,而表达式在运行期间需要经过运算而获得属性值。

    单元格的层次坐标

    通过单元格的坐标表示法唯一标识扩展后的格子

    扩展概念

    可扩展单元格

        当单元格的数据值表达式包含集合函数时,该单元格默认为可扩展单元格,可以修改扩展方向属性为默认、横向扩展或者纵向扩展。对于不包含集合函数的单元格,扩展方向属性默认为不可扩展。

    横向扩展

    描述:

    1. 当单元格为可扩展单元格时,可以把该单元格的扩展方向设为横向扩展,此时该单元格会横向进行复制,复制单元格的数据值依次为集合函数的结果数据值,集合返回几个值,单元格就复制几个,这种现象称为单元格的横向扩展
    2. 单元格进行扩展时,主单元格或同级别单元格被拉大成合并单元格,附属单元格被复制 (参考主格和附属格的认定规则
    3. 复制出来的新单元格的所有属性都引用被复制单元格的属性

    例1:横向扩展

    从下图中可以看出,B2单元格是横向扩展格,我们把B2单元格边框用颜色标识一下,以便扩展后容易识别,如下图所示

    扩展前:

      

    B1

    C1

      

    B2

    C2

      

    B3

    C3

    扩展后: 

      

    B1

    F1

      

    B2

      

      

      

    F2

      

    B3

      

      

      

    F3

    说明:在这个例子中,B2为横向扩展格,因此B3缺省为B2的附属单元格,因此当B2扩展时,B3被复制;B1虽然在B2的上方,但由于B1不是扩展格,所以不是B2的 横伸主格,B1和B2的横伸主格都是00格,因此B1和B2属于同一级别的单元格, 因此B2扩展的时候,也会把同级别单元格B1拉大。

    例2:下方较高级别或同级别单元格被横向拉大

    扩展前:假设B2B1的附属单元格,B4也是B1的附属单元格,因此从逻辑上讲,B4至少和B2平级,当B2进行扩展时,B4应该延展,不应该复制

      

    B1

    C1

      

    B2

    C2

      

    B3

    C3

      

    B4

    C4

    扩展后:

      

    B1

    F1

      

    B2

      

      

      

    F2

      

    B3

      

      

      

    F3

      

    B4

    F4

    纵向扩展

    描述:

    1. 当单元格为可扩展单元格时,可以把该单元格的扩展方向设为纵向扩展,此时该单元格会纵向进行复制,复制单元格的数据值依次为表达式的结果数据值,表达式返回几个值,单元格就复制几个,这种现象称为单元格的纵向扩展
    2. 单元格进行扩展时,主单元格或同级别单元格被拉大成合并单元格,附属单元格被复制 (参考 主格和附属格的认定规则
    3. 复制出来的新单元格的所有属性都引用被复制单元格的属性

    例1:纵向扩展

    从下图中可以看出,B2单元格是纵向扩展格,我们把B2单元格边框用颜色标识一下,以便扩展后容易识别,如下图所示

    扩展前:

    A1

    B1

    C1

    A2

    B2

    C2

    A3

    B3

    C3

    扩展后:

    A1

    B1

    C1

    A2

    B2

    C2

      

      

      

      

    A5

    B5

    C5

    说明:在这个例子中,B2为纵向扩展格,因此C2缺省附属于B2,因此当B2纵向扩展时,C2被复制;A2虽然在B2的左边,但A2不是扩展格,所 以A2不是B2的 纵展主格,A2和B2的纵展主格都是00格,因此A2和B2属于同一级别的单元格,所以B2扩展的时候,也会把同级别单元格A2拉大。

    例2:右边较高级别或同级别单元格延展

    扩展前:假设B2A2的附属单元格,D2也是A2的附属单元格,因此从逻辑上讲,D2至少和B2平级,当B2进行扩展时,D2应该延展,不应该复制

    A1

    B1

    C1

    D1

    A2

    B2

    C2

    D2

    A3

    B3

    C3

    D3

    扩展后:

    A1

    B1

    C1

    D1

    A2

    B2

    C2

    D2

      

      

      

      

    A5

    B5

    C5

    D5

    说明:由于把A2设成了纵向扩展格,因此A2是B2的纵展主格,同时C2的纵展主格设成了A2,因此B2和C2都附属于A2,他们属于同一级别的单元格,因此B2扩展时,同级别单元格C2被拉大。

    不可扩展

        当单元格里表达式的值是单值时,该单元格默认为不可扩展的单元格。不可扩展的单元格不能缺省做主格。

    默认

    1. 单元格的表达式为单值表达式时,该单元格默认为不可扩展单元格
    2. 单元格的表达式为集合表达式时,该单元格默认为可扩展单元格 (参考 主格和附属格的认定规则
      1. 可扩展单元格的横伸主格横向扩展时,该单元格默认为横向扩展
      2. 可扩展单元格的纵展主格纵向扩展时,该单元格默认为纵向扩展
      3. 可扩展单元格的主格为行首格时默认为横向扩展,为列首格时该单元格默认为纵向扩展
      4. 不满足前面条件则默认为纵向扩展

    横伸主格

    描述:

    1. A单元格横向扩展时,B单元格被同步复制,此时A单元格称为B单元格的 横伸主格 ,B单元格称为A单元格的附属单元格
    2. 横伸主格扩展时,附属单元格被横向同步复制,且与横伸主格的相对位置保持不变,附属单元格本身的附属单元格也将被复制。复制时,复制出来的新单元格的所有属性都引用被复制单元格的属性
    3. 在实际的报表逻辑中,附属单元格往往是主单元格在同一维上的更细划分,或者是主单元格当前维度的聚集,有时候附属单元格可能是主单元格的标题。
    4. 单元格横向扩展时,有时候需要跟着被复制的附属格不一定在该单元格的下边,此时,需要对附属单元格设置横伸主格属性。

    例1:附属单元格是主单元格的更细划分

    假设:B1是C1的 横伸主格,C1是D1的横伸主格

    A1

    B1(年)

    C1(季度)

    D1(月份)

    A2

    B2

      

      

       扩展后:

    A1

    2000年

    第一季

    1月

    2月

    3月

    第二季

    4月

    5月

    6月

    第三季

    7月

      

      

      

      

      

      

      

      

      

      

      

      

    例2:附属单元格是主单元格在当前维度的聚集

        假设:C1是B1单元格的附属单元格,B1是C1的横伸主格

    A1

    B1(季度)

    C1(小计)

    A2

    B2(月份)

    A3

    B3

    C3

        扩展后:

    A1

    第一季

    小计

    第二季

    小计

    第三季

    小计

    A2

    1月

    2月

    3月

    4月

    5月

    6月

    7月

    8月

    9月

    A3

      

      

      

      

      

      

      

      

      

      

      

      

    纵展主格

    描述:

    1. A单元格纵向扩展时,B单元格被同步复制,此时A单元格称为B单元格的 纵展主格。B单元格称为A单元格的附属单元格。
    2. 纵展主格扩展时,附属单元格被纵向同步复制,且与纵展主格的相对位置保持不变,附属单元格本身的附属单元格也将被复制。复制时,复制出来的新单元格的所有属性都引用被复制单元格的属性
    3. 在实际的报表逻辑中,附属单元格往往是主单元格在同一维上的更细划分,或者是主单元格当前维度的聚集,有时候附属单元格可能是主单元格的标题。
    4. 单元格纵向扩展时,有时候需要跟着被复制的单元格不一定在该单元格的右边,此时,需要对被复制的单元格设置纵展主格属性。

    例1:附属单元格是主单元格的更细划分

    假设:A2是A3的 纵展主格,A3是A4的纵展主格 

    A1

    B1

    A2(年)

    B2

    A3(季度)

    B3

    A4(月份)

    B4

        扩展后:

    A1

    B1

    2000年

      

    第一季

      

    1月

      

    2月

      

    3月

      

    第二季

      

    4月

      

    5月

      

    6月

      

    第三季

      

    7月

      

    例2:附属单元格是主单元格的在当前维度的聚集

    假设A3是A2单元格的附属单元格,A2是A3的纵展主格 

    A1

    B1

    C1

    A2(季度)

    B2(月份)

    C2

    A3(小计)

    C3

     扩展后:

    A1

    B1

    C1

    第一季

    1月

      

    2月

      

    3月

      

    小计:

      

    第二季

    4月

      

    5月

      

    6月

      

    小计:

      

    第三季

    7月

      

    8月

      

    9月

      

    小计:

      

    主单元格和附属单元格

    规则

    扩展规则

    单元格进行扩展时,主单元格或同级别单元格拉大成合并单元格,附属单元格被复制(横伸主格扩展时,附属格被横向同步复制; 纵展主格扩展时,附属格被纵向同步复制)

    引用规则

    单元格扩展时,附属单元格可以动态引用主单元格的值。随着主单元格扩展,附属单元格被复制到不同的位置,对主单元格的引用也相应的变化。

    例:ds1.select(col1,col2=A2) (其中A2为扩展主格)

    统计规则

    单元格扩展时,附属单元格如采用缺省的聚集表达式,则缺省统计所属主格区域内所有目标单元格的值 例:Sum(C3{})

    主格和附属格认定规则

    横伸主格的认定: 横伸主格的认定是向上依次查找。这里假设当前格是B3,上方单元格是B2

    1. 当前单元格B3设置了横伸主格属性,则横伸主格为设定的值
    2. 如果没有设定横伸主格属性,则检查上方单元格B2是否是横向扩展格并且在列范围内包含了当前单元格,如果是,上方单元格B2就是当前格B3的横伸主格。
    3. 如果B2不是横向扩展格,就检查B2的横伸主格,B3的横伸主格跟随B2,即B2和B3有共同的横伸主格。
    4. B2的横伸主格的认定方法,从步骤1开始执行
    5. 如果执行到首行仍未有横伸主格,则横伸主格缺省为00格

    纵展主格的认定:纵展主格的认定是向左依次查找。这里假设左边单元格是B2,当前格是C2 

    1. 当前单元格C2设置了纵展主格属性,则纵展主格为设定的值
    2. 如果没有设定纵展主格属性,则检查左边单元格B2是否是纵向扩展格并且在行范围内包含了当前单元格,如果是,左边单元格B2就是当前格C2的纵展主格
    3. 如果B2不是纵向扩展格,就检查B2的纵展主格,C2的纵展主格跟随B2,即B2和C2有共同的纵展主格
    4. B2的纵展主格的认定方法,从步骤1开始执行
    5. 如果执行到最左边仍未有纵展主格,则纵展主格缺省为00格

    单元格的层次坐标和汇总运算

    绝对层次坐标

    描述:

    1. 在进行报表设计时,单元格尚未扩展,但是单元格的表达式往往需要对扩展后的单元格进行运算
    2. 例如:C2单元格扩展成了c2-c10,如果其中一个单元格的表达式希望对扩展后的c3和c4进行求和,在扩展前,表达式很难描述这样的关系。 为避免混淆,应该对扩展后的单元格进行唯一性定义,这就是单元格的层次坐标

    表达式规则

                      

    说明:

    1、      Lk为Cellx的纵展主格,lk为纵展主格扩展后的次序,即扩展后的第几个单元格,如果不指定lk或者lk为0,则表示为当前表达式所在单元格所属的当前纵展主格Lk,Cellx为目标单元格,应该为Lk,Lk-1,。。。。。。L1的附属单元格

    2、      如果没有纵展主格,只有横伸主格的话,分号不能省略,即写成Cellx {;Lk':lk', Lk-1':lk-1',……L1':l1'}[]

    3、      如果没有横伸主格,只有纵展主格的话,分号可以省略,即写成Cellx {Lk:lk, Lk-1:lk-1,……L1:l1 }[]

    4、      Lk的次序是从远到近的,就是从离当前格最远的主格开始的

    5、      表达式最后面跟的花括号表示集合

    举例:

    假设:a2-a7单元格由A2单元格扩展而来

    扩展前:

    A1

    B1

    C1

    D1

    A2

    B2

    C2

    D2

    扩展后:

    C2{A2:0,B2:0}[]:如果C2{A2:0,B2:0}[]表达式写在d4单元格中,那么d4就是当前格,B2:0表示当前格所属的B2分组格,也就是扩展后的b4A2:0表示当前格所属的A2分组格,也就是扩展后的a2,因此C2{A2:0,B2:0}[]表达式表示扩展后的c4-c6单元格 

    C2{A2:2,B2:1}[] A2:2表示A2扩展后的第二个单元格,即扩展后的a7B2:1表示a7分组区域内,B2扩展后的第一个单元格,即扩展后的b7,因此整个表达式表示c7,c8,c9三个单元格

    B2{A2:0,B2:0}[]:如果B2{A2:0,B2:0}[]写在d11单元格中,那么d11就是当前格,A2:0表示当前格所属的A2分组格,也就是扩展后的a7B2:0表示当前格所属的B2分组格,也就是扩展后的b10,整个表达式表示扩展后的b10单元格

    相对层次坐标(位移坐标)

    描述:

    1. 报表中常常需要计算同期比、比上期之类的与时间相关的运算,而这些运算往往需要用到下一行的数据减上一行数据,后一列数据减前一列数据,这种涉及到行间、列间的运算,称为位移运算,相关的表达式称为位移表达式

    表达式规则

          

    说明:

    1. Lk为Cellx的 纵展主格,lk为单元格的偏移量,即当前表达式所在单元格的纵展主格Lk的上lk格或下lk格,如果不指定lk,则表示为当前所在的纵展主格LkCellx为目标单元格,一般为LkLk-1,。。。。。。L1的附属单元格
    2. 如果没有纵展主格,只有横伸主格的话,分号不能省略,即写成Cellx [;Lk' :±lk', Lk-1' :±lk-1',……L1' :±l1']
    3. 如果没有横伸主格,只有纵展主格的话,分号可以省略,即写成Cellx [Lk:±lk, Lk-1:±lk-1,……L1:±l1 ]
    4. Lk的次序是从远 到近的,就是从离当前格最远的主格开始的
    5. 表达式最后面跟的花括号表示集合

    更多内容:  报表引擎设计.pdf

    欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

  • 相关阅读:
    Codeforces Round #581 (Div. 2)
    Codeforces Round #605 (Div. 3)
    cin,cin.get(),cin.getline(),getline()
    容斥原理原理
    词法分析器
    Web学习开始。
    Convex hull凸包
    对max_flow做一个总结
    Vue中动画封装
    Vue中的动画特效
  • 原文地址:https://www.cnblogs.com/zhoujg/p/1603748.html
Copyright © 2011-2022 走看看