精华内容
下载资源
问答
  • 如何水晶报表中分组汇总记录,不错的入门实例,用户可以自己扩展其它功能
  • 如何水晶报表中分组汇总记录源程序实例,C#.net源代码编写,VisualStudio.net
  • 如何水晶报表中分组排序记录源程序实例,C#.net源代码编写,VisualStudio.net
  • 前面几篇文章,我们一起学习了行式填报表制作的相关内容,也了解了多源 SQL 和脚本两种数据处理方式,今天我们来研究一下如何制作分组报表。 同样地,我们以 demo 示例库的雇员表信息维护为例,数据填报...

    在前面几篇文章中,我们一起学习了行式填报表制作的相关内容,也了解了多源 SQL 和脚本两种数据处理方式,今天我们来研究一下如何制作分组填报表。

    同样地,我们以 demo 示例库中的雇员表信息维护为例,在数据填报页面,需要实现以下效果:

    1)雇员信息按照地区分组显示

    2)雇员基本信息可进行修改

    效果图如下图所示:

    imagepng

    在制作分组填报表之前,我们先来看一下它的设计原理。

    原理说明:

    分组填报表中有两个维度:分组维度和明细维度,如何处理两者之间的逻辑关系是重点,这两个维度之间应该是什么样的一种逻辑关系呢?我们先来看一个简单的例子,A1 单元格为分组维度,B1 单元格为明细维度,两者关系如下:

    imagepng

    A1:[1,2]     单元格在解析计算时会展开成 1,2 两个分组

    B1:[[11,55],[22,44]]   B1 需要按照 A1 的分组维度展开对应的数据

    分组维度是两个值,那么明细维度要分别对应设置序列:1 对应 [11,55],2 对应 [22,44],最终解析结果如上图右侧所示。

    从这里我们可以看出来,明细维度和分组维度是一一对应的,我们需要将符合维度值的数据整理为一个序列,这样才能保证结果页面数据的对应关系是正确的。

    在了解了原理之后,我们来看详细实现步骤:

    第一步 新建空白填报表

    编辑填报表内容和样式,如下图所示:

    imagepng

    第二步 设置数据处理

    根据我们前面讲到的原理,来源脚本内容如下图所示:

    imagepng

    其中,A2:通过 query 函数取出要进行修改的表数据;

    A3:通过 id 函数对地区去重,获取到分组维度数据;

    A4:通过 run 函数逐个取地区分组维度下的雇员 ID,并返回序列;

    在 run 函数中,先定义了一个变量 dq,dq 的值为当前执行的 A3(地区),然后我们通过 select 函数过滤出来对应的雇员 ID 数据,最后将结果插入到 B1 单元格,返回完整的明细维度序列数据。

    A5:吧分组维度(地区)和明细维度(雇员 ID)整合到一个序列中返回;

    A6:吧雇员信息写到雇员对象中,便于在填报表中取数;

    PS:脚本写法不唯一,只需要保证“地区”和“雇员 ID”两个维度的逻辑关系正确就可以了。

    去向脚本内容如下图所示:

    imagepng

       其中,

    A2:通过 update 函数实现对雇员表数据的维护,将页面新数据与原有旧数据进行比较,将差异数据更新到雇员表中;

    A3:获取数据库操作过程中的异常信息;

    A4:如果 A3 获取到的异常信息为空,那么就提交入库,否则就执行事务回滚;

    第三步 配置取数表达式和字段名称

    imagepng

    其中,

    A2 单元格:设置单元格类型为维度格,字段名称配置为:雇员. 地区,

    单元格取数表达式为:=dim(1),表示取 dim 对象中的第一条记录;

    B2 单元格:设置单元格类型为维度格,单元格取数表达式为:=dim(2),表示取 dim 对象中的第二条记录;

    因为第一行的标题内容和字段名称一致,所以 A2 后面的单元格不需要再配置字段名称。

    PS:对数据采集规则不理解的同学,可以直接对每个数值格设置字段名称,规则是:对象名. 字段名。

    这里分享一个 **【小技巧】**,我们可以通过设计器的预览按钮查看填报表的分区识别结果:

    imagepng

    在制作填报表时,需要保证右侧识别到的对象、字段名称和来源脚本的对象结构是匹配的,这是将数据成功更新入库的必要条件之一。

    第四步 其他设置

    按照需求设置编辑风格、校验、自动计算、显示格式等。

    其中,

    校验设置可参考文章: 报表数据填报中的合法性校验 ](http://c.raqsoft.com.cn/article/1544091400841?r=xiaohuihui)

    自动计算配置可参考文章: 报表数据填报中的自动计算 ](http://c.raqsoft.com.cn/article/1544091026876?r=xiaohuihui)

    总结:

    至此,一个简单的单分组填报表就制作完成了。这里实现的难点在于分组维度数据和明细维度数据之间逻辑关系的理解和处理,还是不会怎么办?盘它,盘的多了,你会发现集算器脚本进行数据处理时的各种惊艳之处。

    展开全文
  • 传统的分组报表制作方式是用户根据数据绑定向导指定分组,汇总字段,生成分组报表,但是这样也只是小数据量的前提下可以实施,当数据量很大很复杂时,相信使用葡萄城报表制作分组报表,就是事半功倍了。

    什么是分组报表

    分组报表,是所有报表中最基本、最常见的报表类型,也是所有报表工具中都支持的报表格式。从一般概念上来讲,分组报表就是只有纵向的分组。传统的分组报表制作方式是把报表划分为条带状,用户根据一个数据绑定向导指定分组,汇总字段,生成标准的分组报表。当然,我们也可以在Excel中,进行分组报表的制作;但是这样也只是在小数据量的前提下可以实施,当数据量很大很复杂时,相信使用葡萄城报表制作分组报表,就是事半功倍了。

    而使用葡萄城报表,将会使制作分组报表的方式更简单、更智能化,无需编码即可快速设计报表。

    分组报表的类型

    分组报表常用的类型有:单级分组报表嵌套分组报表等类型。同时还可以使用表格、列表以及矩阵等数据区域控件对数据源进行分组操作。分组报表在商业报表系统中应用不胜枚举,客户信息归类统计表、商品分类统计表、销售记录年度、阅读统计等等。

    如何创建分组报表

    1、创建报表文件

    在应用程序中添加一个葡萄城报表文件,使用的项目模板类型为页面报表。添加完成之后从 VS 报表菜单中选择报表属性菜单项,并在外观选项卡中设置报表页边距为 1cm。

    报表打印

    2、打开报表资源管理器,并按照以下信息创建报表数据源

    名称: NWind_CHS
    类型: Micorsoft OleDb Provider
    OLE DB 提供程序: Microsoft.Jet.OLEDB.4.0
    服务器或文件名称: Data\NWind_CHS.mdb
    报表打印

    3、 添加数据集

    在新建的 NWind_CHS 数据源上鼠标右键并选择添加数据集菜单项,数据集信息如下:

    常规-名称:Products

    查询-查询:

    SELECT 产品.*,类别.类别名称,类别.说明 AS 类别说明,类别.图片 AS 类别图片, 供应商.公司名称 AS 供应商,供应商.联系人姓名,供应商.城市,供应商.地址 FROM (供应商 INNER JOIN 产品 ON 供应商.供应商ID = 产品.供应商ID) INNER JOIN 类别 ON 产品.类别ID = 类别.类别ID ORDER BY 产品.类别ID;

    通过简单的上述操作,即可得到下面的分组报表

    报表打印

    从上图可以看出,分组报表从结构和样式上都与Excel很相似,但Excel并不是专业的报表软件,葡萄城报表的出现则正好填补了类Excel报表的空缺。

    转载请注明出自:葡萄城报表 
    http://www.grapecity.com.cn/enterprise-solutions/activereports_server/

    展开全文
  • BIRT报表中实现过滤和分组

    千次阅读 2013-03-28 21:16:28
    所有聚集函数都允许使用两个可选参数来指示过滤和分组:  Total.... 关于过滤器参数  ...过滤器参数提供了一个布尔表达式,对于每一行,BIRT 都会该表达式进行求值。计算聚集时,BIRT 仅考虑与该...它可以访问行
    所有聚集函数都允许使用两个可选参数来指示过滤和分组: 
    

    Total. <聚集函数> ( ..., filter, group ) 

    关于过滤器参数 
    过滤器参数提供了一个布尔表达式,对于每一行,BIRT 都会对该表达式进行求值。在计算聚集时,BIRT 仅考虑与该过滤器匹配的行。例如,报告可以对活动客户的贷记限额进行求和,以确定最大贷记风险。 

    此表达式是在数据转换阶段执行的。它可以访问行中的列、参数、用户定义的函数以及上述上下文描述中定义的其他资源。例如: 

    Total.sum( row["CreditLimit"], row["Active"] == &apos;Y&apos; ); 

    指定过滤器参数 null、未定义过滤器参数或者指定 Total.NO_FILTER,都表示未提供过滤器。如果应用程序未提供过滤器,则过滤器缺省为未定义。如果提供了组参数,则必须提供 null 或 Total.NO_FILTER 以指示不进行过滤。 

    关于组参数 
    报告经常需要显示当前分组级别的总计。例如,假定一个报告按客户和订单进行分组,并且详细信息记录表示订单中的行项。每个行项都有单位价格和数量,如以下聚集函数所示: 

    Total.sum( row["price"] * row["quantity"] ) 

    此聚集函数对当前组的金额进行求和。如果将此聚集放在订单组脚中,则它将显示该订单的行项之和。如果将其放在客户组脚中,它就会显示该客户的所有订单的所有行项之和。并且,如果将其放在报告组脚中,它就会显示所有客户的所有行项之和。 

    但是,应用程序有时需要访问另一分组级别的总计。例如,您可能想了解一个订单的总金额在该客户所有订单中所占的百分比。在这种情况下,必须访问除当前组以外的组的总计。可以使用分组参数来实现此目的: 

    Total.sum( row.CreditLimit, null, "Customer" ); 

    组参数可以是下列其中一项: 

    Null,这表示当前分组级别。 
    当前分组级别或更高分组级别的组的名称。此名称是报告设计中指定的名称。 
    当前分组级别或更高分组级别的组的组键表达式。 
    组级别的数字索引。0 表示整体总计,1 表示最高级别的组,依此类推。 
    相对组索引:-1 表示比此组高一级的组,-2 表示比此组高两级的组,依此类推。 
    特殊名称“Overall”,此名称引用数据集的整体总计。也可以使用静态属性 Total.OVERALL。 
    下列示例演示了三类组参数: 

    Total.sum( row["myCol"] null, null ); // 当前组 
    Total.sum( row["myCol"], null, "Customer" ); // 按名称 
    Total.sum( row["myCol"], null, "row[`custID']" ); // 按组键 
    Total.sum( row["myCol"], null, 1 ); // 按组索引 
    Total.sum( row["myCol"], null, "Overall" ); // 整体总计 
    Total.sum( row["myCol"], null, 0 ); // 整体总计 

    使用分组参数时,必须提供过滤器参数。如果不需要过滤器,请指定 null 作为过滤器值。不能将组索引括在引号中,它必须是数字。即,1 表示级别为 1 的组,而 "1" 表示名为 "1" 的组。 
    展开全文
  • 【摘要】 在分组报表中,按某字段分组后,组内数据较多时一组会分多页显示,并且一组数据显示完成后要求下组从新的一...在对报表数据进行打印时,经常会要求进行精确打印,比如一张纸能打印 20 行数据,如果超过就...

    【摘要】

    在分组报表中,按某字段分组后,组内数据较多时一组会分多页显示,并且一组数据显示完成后要求下组从新的一页开始显示,这样就要求某组数据展示完后,如果数据不满整页,需要补足空行以达到更好的效果,某组分页后要求组内页码的生成以及页内小计功能,点击如何在分组报表中实现组内数据补空行及组内页码查看具体做法

    在对报表数据进行打印时,经常会要求进行精确打印,比如一张纸能打印 20 行数据,如果超过就分页,如果不满 20 行,则在数据下方进行补够空行。这种情况最常见于银行对账信息等明细数据的打印。同时,在某些业务中还会按照一些字段分组,比如地区、类别等,在报表展示或打印时则要求先按照字段进行分组,将分组字段相同的数据放到一组内进行明细数据的打印,并在组内要求实现补空行操作。另外,对于分组数据,打印时所显示的页码要求是组内页码,比如报表总共 10 页,某一组分三页,则该组内页码应该显示为“第 1 页 / 共 3 页”。当然,最常见的每页打印表头也一定是需要的。

    总结起来,其实是四点:

    一:每页的表头;

    二:报表分组后,每组的表头以及布局;

    三:要求每组内数据补足空行,打印时每页都占满整张纸张;

    四:组内页码。

    下面是一个实际例子的效果图:

    1jpg

    熟悉报表工具的同学都知道,报表中可以设置表头、分组表头,这样前两点就 OK 了。然后,我们可以算出数据条数用 to 函数进行补空行,第三点也满足了。但是,第四点,组内页码却无法实现,报表内置的 pno() 等函数都是相对于整张报表的,无法确定到组内是第几页,所以 pass,只能换种方式实现:“人为分页”。何为“人为分页”?就是在报表中根据特定的方法人为的去指定分几页,每页取什么数据。

    下面通过一个报表介绍一下实现的过程。先看一下数据集的结构:

    2jpg

    报表展示时要根据 MDS_OPERATION_SEQ_ID 字段进行分组,然后取出其他字段的明细数据,经测算,在 A4 纸上打印时刨除表头信息,能够打印 19 行数据,所以打印时要求每页打印 19 行,超过数据分页,不满 19(或 19 整数倍)则补空行。

    看下整个报表设计模板:

    3jpg

    首先报表要求表头信息每页都打印,此处可以使用报表的左主格,以要求报表纵向扩展时实现跟随扩展,将 A1~A7 合并,这样 A1 单元格就是后边单元格的左主格,A1 每纵向扩展都会实现后边区域的跟随扩展,A1 单元格表达式为:=ds2.group(MDS_OPERATION_SEQ_ID;MDS_OPERATION_SEQ_ID:1),该表达式按照 MDS_OPERATION_SEQ_ID 分组。

    A1 单元格按照字段分组后,组内数据可能是多页,所以要在 B1 单元格中再进行一次分页操作,同样 B1~B7 单元格合并,里边表达式为:=to(1,if(ds2.count()%19==0,ds2.count()/19,int(ds2.count()/19)+1)),这里用到了 to 函数来实现扩展几页,具体页数要根据分组后数据条数来确定,之前说过每页能显示 19 行,所以表达式中是根据 19 进行了判断,如果表达式 ds2.count()%19==0 成立,表示数据量是 19 的整数倍,所以此时该组分 ds2.count()/19 页,否则分 int(ds2.count()/19)+1) 页,int 函数为取整操作,这样 B1 单元格实现组内页数的扩展。

    页数取出后,接下来要进行数据行的操作,在 C6 单元格中写入表达式:=to((B1-1)*19+1,B1*19),该单元格同样用到 to 函数实现数据扩展,用来根据 B1 单元格(页数)里构造一个纵向的扩展区域,如果 B1 中分了两页,则 C6 会扩展出两片区域 119,2038,这样 C6 这就能构造出 19 的整数倍行(视页数定),也就实现了补空行的操作。

    通过 A、B、C 三列现在实现了按字段分组、获取页数并且根据行扩展构造出了整个展示的轮廓,下面看下怎么将数据和之前模拟扩展的行关联上,在 D6 单元格中写入表达式:=ds2.select(#0)(C6),#0 是报表在数据集前默认保留了一个序号列,=ds2.select(#0)可以理解成是一个数组然后后边的 (C6) 是根据 C6 取数组中的第几个值,这样,就能将 ds2 数据集和扩展行关联上,在实际中有可能该组只有一条记录,也就是 =ds2.select(#0)是 1 条, (C6)是对数组操作,所以会报错,修改 D6 表达式为:=if(ds2.count()<=1,ds2.#0,ds2.select(#0)(C6)),先根据条数判断下,再决定返回什么表达式。

    这样前四列结果如下:

    4jpg

    在 D 列中取出了 ds2 数据集中的 #0,在 E6 单元格中写入表达式:=ds2.select(ID,#0==D6),根据#0 列做为条件取出对应的 ID 字段,后边其他列就是常规的网格式报表的制作,直接用数据集. 字段名即可。

    上面实现了分组报表的表头每页可见、数据补空行操作,接下来看下怎么实现组内页码的操作,之前说过,在 B 列中根据数据条数能够获取该组内一共分了几页并进行 to 的纵向扩展,组内页码可以直接获取 B1 单元格的值就是组内的第几页,在 L3 单元格中写入:=“第”+B1+“页 / 共”+count(B1[A1]{})+“页”,此处获取总页数时,要获取该组内一共几页,表达式为 count(B1[A1]{}),此处用了润乾报表特有的“位移坐标”概念(位移坐标具体用法见《报表高级设计》),取该组(A1)内扩展出的 B1 的数量。这样,就实现了组内页码的需求。

    最后,将 A~E 列隐藏,将 C7 单元格的行后分页属性选中以实现强制分页,最后再按照实际要求设置报表样式,这样就实现了报表分组时组内页码及补空行的操作。最终效果如下:

    5jpg

    由本例可以看到,不管用户需求千变万化,除了使用在报表工具中自带的一些分页方式外,我们还可以自己在报表中根据用户需求做更加灵活的设置。通过行后分页属性,可以在指定位置进行分页,根据 select 的集合属性,可以取集合中的某个值,从而实现数据集和人为定义出的扩展数据之间的结合。

    扩展:

    此例中通过 B1 的 to 函数模拟出了组内分了几页,所以在表中同样可以实现分组后的页内小计和组内合计,直接用 sum(单元格 {}) 即可。

    展开全文
  • VB使用动态分组报表

    千次阅读 2004-03-20 14:41:00
    一般要使用分组报表VB建立一个DataEnvironment,并其中建立数据库联接和命令对象,命令对象设置分组字段,最后将这些分组字段加入到报表中。但是这种方法只能适应静态的数据源,当遇到数据表的字段不...
  • 前面我们学习了sql server 2012 如何使用Reporting Service 2012制作报表Reporting Service制作报表,有了初步的了解,这里我主要记录一下,如何做一个分组折叠式的报表. 1. 创建一个报表tb_Bills.rdl,添加一个...
  • ActiveReports 中可以设置单级分组、嵌套分组,同时,还可以使用表格、列表以及矩阵等数据区域控件数据源进行分组操作。分组报表在商业报表系统中应用不胜枚举,客户信息归类统计表、商品分类统计表、销售记录...
  • 分组报表

    2013-10-13 22:42:24
    分组报表 group() 函数说明: 根据分组表达式,从数据集中选出一组组集。 语法: datasetName.group(, ,) //适用于不需要排序或数据集中已排好序 datasetName.group(selectExp{,descExp{,filterExp{,...
  • 可重复分组报表是指同一记录出现不同的分组中被重复统计,常见的可重复分组报表有两类:一类是分组区间有交集,如:统计年龄段20-30岁、25-35岁、30-40岁之间的用户数量;另外一类是分组区间有包含关系,如:...
  • 2 分组报表 2.1 概述 有两种情况会使用分组报表: 美观和好看的显示。...应用可以通过选择需要打印的父表记录,将父表记录的 ID 传入,由报表自动进行分组。 2.2 设置分组属性 (1)新建模板 使用用户列表...
  • 关于等值分组中可以看到对应设置的每个表达式,这里不多做说明,重点看下面 其他分组 举例: 有时除了上述等值分组外,我们还希望做到部分分组(又称不完全分组,即不把所有的记录用于分组,只保留用户关心的...
  • 报表开发,经常会碰到一些需要进行非常规统计的报表,预置分组、可重复分组、组内排序,还包括跨行组计算的报表,甚至有些报表本身无数据来源、以及需要数据源再计算。这些报表本身具备一定的特殊性,使用常规...
  • 按段分组报表制作

    2018-12-20 16:14:58
    【摘要】 按照某些字段做分组统计时,通常会按照数据将...在报表对数据进行汇总统计时,通常是按照某个字段进行分组,比如按地区、类别等字段分组其他信息进行汇总,但有一种分组模式为不规则分组,其分组是...
  • 水晶报表中分组后,有些数据的字段是重复的,只显示一个就行了,那如何来解决这个问题呢? 其实这个不是很难,关键是你要想清楚你要的效果,基本思路是:用一个公式字段来记录每一组的记录数量,再用一个字段...
  • 在报表对数据进行汇总统计时,通常是按照某个字段进行分组,比如按地区、类别等字段分组其他信息进行汇总,但有一种分组模式为不规则分组,其分组是根据数据的值段来分的,例如按照分数段、年龄段、按时间段等,...
  • 上图是一个典型的规则分组情况,另外还有一些不规则的分组情况,典型情况就是按段分组,比如时间段、年龄段等,也就是按照某个值区间完成记录分组。 上图的例子我们可以看到,分别统计了 “2012 年圣诞前...
  • 开发自有许多心得,但最想跟大家谈的是在报表中实现每页打印指定记录数这个问题。   方法一   VFP的报表生成器,编制报表,用调整报表页头带和页脚带高度的方法来控制每页要打印的记录数据,这是一...
  • 使用多级分组报表展现分类数据

    千次阅读 2017-09-20 10:23:50
    分组报表,是所有报表中最基本、最常见的报表类型,也是所有报表工具中都支持的报表格式。
  • 先确认下原帖需求: 1、详细节最多5条记录(不能超过5条); 2、无论前一组是否满5条记录,每个新组都要另起一页 ...我们知道每页最多显示N条的控制方法,打开节专家,详细节后面新建页公式编辑:
  • 《秒级展现的百万级大清单报表怎么做》,我们介绍了无论 RDB 还是非 RDB,润乾报表都能够通过异步线程实现秒级海量大清单报表(以下简称:大报表)。实际业务,除了查询明细,有时还要展现全量汇总数据,或者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,983
精华内容 7,593
关键字:

在报表中可以对记录分组