rdlc报表 矩阵控件下的按组分页

场景:

使用rdlc开发报表,例如订单产品报表,显示多个订单,一个订单有动态生成的固定的多个产品组成,同时统计每个订单里多个产品数量总数。

数据库层面分析:

此报表属于交叉报表,例如5个订单,3个产品,总共的数据库记录应该为15条,而不是5条。

存在的技术难点:

(1)动态列生成

使用Matrix矩阵控件

(2)统计每个订单里多个产品数量总数

确保每个订单的第一条数据是正确的,第二条或第三条数据为NULL都没关系

(3)控制每页显示33条记录,而不是通过默认的高度来控制分页

(4)由于是使用矩阵控件,所以分页下序列号需从数据库中控制好

最终完成的效果:

(1)数据库方面:

  1 --Finally page procedure
  2 create procedure RP_BIREPORTSO
  3     @year INT,
  4     @month INT
  5 as
  6 begin
  7     WITH table_group AS (
  8         SELECT ROW_NUMBER() OVER(ORDER BY a.item_id) num_groupby,
  9                a.item_id
 10         FROM   (
 11                    SELECT wite.item_id,
 12                    wite.create_datetime
 13                    FROM   (
 14                               SELECT waus.user_id,
 15                                      waac.action_id
 16                               FROM   ws_account_action waac
 17                                      JOIN ws_account_user waus
 18                                           ON  waac.ws_uid = waus.ws_uid
 19                               WHERE  waac.parent_action_id IS NULL
 20                                      AND waac.ws_action_type = ‘BI‘
 21                                      AND waac.the_year = @year
 22                                      AND waac.the_month = @month
 23                           ) AS waac
 24                           JOIN (
 25                                    SELECT wite.item_id,
 26                                           ware.action_id,
 27                                           wite.create_datetime
 28                                    FROM   ws_account_request ware
 29                                           LEFT JOIN ws_item wite
 30                                                ON  ware.item_id = wite.item_id
 31                                    WHERE  wite.enable_flg = 1
 32
 33                                ) AS wite
 34                                ON  wite.action_id = waac.action_id
 35                    UNION
 36                    SELECT wite.item_id,
 37                    wite.create_datetime
 38                    FROM   ws_item wite,
 39                           (
 40                               SELECT waus.user_id
 41                               FROM   ws_account_action waac
 42                                      JOIN ws_account_user waus
 43                                           ON  waac.ws_uid = waus.ws_uid
 44                               WHERE  waac.parent_action_id IS NULL
 45                                      AND waac.ws_action_type = ‘BI‘
 46                                      AND waac.the_year = @year
 47                                      AND waac.the_month = @month
 48                                      AND waac.action_id NOT IN (SELECT DISTINCT
 49                                                                        action_id
 50                                                                 FROM
 51                                                                        ws_account_request)
 52                           ) AS waac
 53                    WHERE  wite.enable_flg = 1
 54
 55                ) a
 56         GROUP BY
 57                a.item_id
 58     )
 59     --Union exist relation data and other need display data
 60     SELECT
 61             tg.num_groupby,
 62             alldata.item_id,
 63            alldata.ledge_folio,
 64            alldata.item_desc_en,
 65            alldata.unit,
 66            alldata.create_datetime,
 67            alldata.quantity_issued_count,
 68            alldata.user_id,
 69            alldata.quantity_issued_total
 70
 71     FROM   (
 72                SELECT wite.item_id,
 73                       wite.ledge_folio,
 74                       wite.item_desc_en,
 75                       wite.unit,
 76                       wite.create_datetime,
 77                       wite.approved_qty AS quantity_issued_count,
 78                       waac.user_id,
 79                       (
 80                           SELECT SUM(ware2.approved_qty)
 81                           FROM   ws_account_request ware2
 82                                  LEFT JOIN ws_item wite2
 83                                       ON  ware2.item_id = wite2.item_id
 84                           WHERE  wite2.enable_flg = 1
 85                                  AND wite2.item_id = wite.item_id
 86                           GROUP BY
 87                                  wite2.item_id
 88                       ) AS quantity_issued_total
 89                FROM   (
 90                           SELECT waus.user_id,
 91                                  waac.action_id
 92                           FROM   ws_account_action waac
 93                                  JOIN ws_account_user waus
 94                                       ON  waac.ws_uid = waus.ws_uid
 95                           WHERE  waac.parent_action_id IS NULL
 96                                  AND waac.ws_action_type = ‘BI‘
 97                                  AND waac.the_year = @year
 98                                  AND waac.the_month = @month
 99                       ) AS waac
100                       JOIN (
101                                SELECT wite.item_id,
102                                       wite.ledge_folio,
103                                       wite.item_desc_en,
104                                       wite.unit,
105                                       wite.create_datetime,
106                                       ware.approved_qty,
107                                       ware.action_id
108                                FROM   ws_account_request ware
109                                       LEFT JOIN ws_item wite
110                                            ON  ware.item_id = wite.item_id
111                                WHERE  wite.enable_flg = 1
112                            ) AS wite
113                            ON  wite.action_id = waac.action_id
114                UNION
115                SELECT wite.item_id,
116                       wite.ledge_folio,
117                       wite.item_desc_en,
118                       wite.unit,
119                       wite.create_datetime,
120                       0 AS quantity_issued_count,
121                       waac.user_id,
122                       (
123                           SELECT SUM(ware2.approved_qty)
124                           FROM   ws_account_request ware2
125                                  LEFT JOIN ws_item wite2
126                                       ON  ware2.item_id = wite2.item_id
127                           WHERE  wite2.enable_flg = 1
128                                  AND wite2.item_id = wite.item_id
129                                  and waac.action_id = ware2.action_id
130                           GROUP BY
131                                  wite2.item_id
132                       ) AS quantity_issued_total
133                FROM   ws_item wite,
134                       (
135                           SELECT waus.user_id,waac.action_id
136                           FROM   ws_account_action waac
137                                  JOIN ws_account_user waus
138                                       ON  waac.ws_uid = waus.ws_uid
139                           WHERE  waac.parent_action_id IS NULL
140                                  AND waac.ws_action_type = ‘BI‘
141                                  AND waac.the_year = @year
142                                  AND waac.the_month = @month
143                                  AND waac.action_id NOT IN (SELECT DISTINCT
144                                                                    action_id
145                                                             FROM
146                                                                    ws_account_request)
147                       ) AS waac
148                WHERE  wite.enable_flg = 1
149            ) alldata
150            LEFT JOIN table_group tg
151                 ON  alldata.item_id = tg.item_id
152 end
153 go

SQL查询结果:

(2)rdlc报表配置方面:

  • 矩阵控件
  • 添加分组,分组表达式控制分页
  • rdlc内置函数的使用

    =IIF(Fields!quantity_issued_count.Value <> 0,Fields!quantity_issued_count.Value,"---")

    =IIf(IsNothing(Fields!quantity_issued_total.Value),0,Fields!quantity_issued_total.Value)

(3)页面后台处理方面:

 1 private void InitData()
 2 {
 3     int year = int.Parse(Request["year"]);
 4     int month = int.Parse(Request["month"]);
 5     DataTable dt = Bll.Report.BiReport.GetReportBySO(year, month);
 6     int count = dt.Rows.Count;
 7     if (count == 0)
 8     {
 9         this.RegisterJS("alert(‘Without relevant data!‘);window.opener=null;window.open(‘‘,‘_self‘);window.close();");
10         return;
11     }
12     var q = from p in dt.AsEnumerable()
13             group p by p["user_id"].ToString() into g
14             select new
15             {
16                 UserId = g.Key
17             };
18     //int columnCount = q.Count<object>();
19     int allDataCount = int.Parse(dt.Rows[count - 1]["num_groupby"].ToString());
20     int rowCount = 33;
21     if (allDataCount % rowCount != 0)
22     {
23         int addRowCount = rowCount - allDataCount % rowCount;
24         DataRow dr;
25         for (int i = 0; i < addRowCount; i++)
26         {
27             ++allDataCount;
28             foreach (var item in q)
29             {
30                 dr = dt.NewRow();
31                 dr["user_id"] = item.UserId;
32                 dr["num_groupby"] = allDataCount;
33                 dr["item_id"] = -i;
34                 dr["create_datetime"] = "1900/1/1";
35                 dt.Rows.Add(dr);
36             }
37         }
38     }
39     //Control every first record is right
40     DataView dv = dt.DefaultView;
41     dv.Sort = "num_groupby,quantity_issued_total desc";
42     dt = dv.ToTable();
43     DateTime startDate = DateTime.MinValue, endDate = DateTime.MinValue;
44     StartDateAndEndDate(ref startDate, ref endDate);
45     ReportViewer1.Visible = true;
46     ReportViewer1.LocalReport.ReportPath = MapPath("BiReportSo.rdlc");
47     ReportDataSource rds = new ReportDataSource("dsBiReportSo", dt);
48     this.ReportViewer1.LocalReport.SetParameters(new ReportParameter("parmDept", BelongUnitName()));
49     this.ReportViewer1.LocalReport.SetParameters(new ReportParameter("parmStartDate", string.Format("{0:d}", startDate)));
50     this.ReportViewer1.LocalReport.SetParameters(new ReportParameter("parmEndDate", string.Format("{0:d}", endDate)));
51     ReportViewer1.LocalReport.DataSources.Clear();
52     ReportViewer1.LocalReport.DataSources.Add(rds);
53 }
时间: 2024-10-19 14:08:10

rdlc报表 矩阵控件下的按组分页的相关文章

强大的报表引擎控件Stimulsoft Reports.Ultimate

Stimulsoft Reports.Ultimate 报表控件是一个综合全面的解决方案,被用于呈现.NET Framework 平台上的报表.该产品包括一套完整的可以在WinForms,ASP.NET 和 WPF 环境下创建报表的工具集.可以在设计时和运行时运行,其中包括一个独特的web报表设计器.Viewers 用来显示报表.此外,其强大的报表输出系统,能支持多种不同的报表格式.简单但功能强大的报表引擎.Stimulsoft Reports.Ultimate的一条基本使用原则是,用户可以用常

跨平台的报表生成器控件Stimulsoft Reports.Fx for Flex

Stimulsoft Reports.Fx for Flex是一个跨平台的报表生成器控件,用于丰富的互联网应用程序中.在创建这个报表工具的时候,我们使用了一种在互联网商业程序开发中的一个高级技术 - Adobe Flex.我们试图给软件开发者和用户最灵活的工具来创建和使用报表.这个工具不仅可以提高您的工作效率,还可以在您的web 程序中增添许多pluses. 具体功能: 解决问题 在我们的产品发布之前,互联网程序的报表贝各种问题限制.在显示报表时,缺乏活力,简易性和交互性.与服务器之间交换信息.

快速强大的报表引擎控件Stimulsoft Reports.Fx for PHP

Stimulsoft Reports.Fx for PHP控件是为在互联网上使用客户端-服务器技术来创建报表而设计的报表工具控件.在这个产品中,我们结合了两种技术.PHP 脚本在服务器端工作.这个技术控制报表生成.Adobe Flash 技术在客户端工作.这个技术提供一个普通的机制,可以在几乎任何客户端生成报表.正是由于这点,Stimulsoft Reports.Fx 非常易于使用:同时产品提供了一个现代化的,具有成本效益的方式在网站上提供报表,并使用内置的PHP 技术.快速强大的报表引擎,丰富

android控件 下拉刷新pulltorefresh

外国人写的下拉刷新控件,我把他下载下来放在网盘,有时候访问不了github 支持各种控件下拉刷新 ListView.ViewPager.WevView.ExpandableListView.GridView.(Horizontal )ScrollView.Fragment上下左右拉动刷新,比下面johannilsson那个只支持ListView的强大的多.并且他实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验更好. 国内网盘地址:http://www.400gb.c

Stimulsoft Reports.Wpf是针对WPF开发的报表工具控件

Stimulsoft Reports.Wpf是针对WPF开发的报表工具控件.无需上网,所有的WPF功能都能用上!丰富的界面更换功能.查看功能.打印以及导出报表功能——所有的这一切就是它都能轻松实现. 创建Stimulsoft Reports.Wpf是基于Stimulsoft团队多年开发以及使用的报表引擎来创建报表.只需简单的几行代码即可执行报表复杂的操作,报表引擎提供了创建报表的许多功能.大量的组件开发包,独特的一套属性和参数,精心构思的报表体系.很多选项都是绝对独特且仅出现该产品中.Stimu

Atitit.ui控件---下拉菜单选择控件的实现select html

Atitit.ui控件---下拉菜单选择控件的实现select   html 1. 调用& model的实现 1 2. -----select.jsp------ 1 1. 调用& model的实现 Proj.vod2 <% List li=new ArrayList(); Map m=new HashMap (); m.put("lab","爱情"); m.put("v","1"); li.add(m)

bootstrap-表单控件——下拉选择框select元素

1.运行效果如图所示 2.实现代码如下 <!DOCTYPE html> <html> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>表单控件--下拉选择框select元</title>     <!-

控件下的Lookup方法

如果想重写系统的某个数据源下的字段的Lookup,则可以在此控件下重写Lookup方法,不调用其父级数据源下字段的looku即可. 以下是一个关于重写Lookup方法的例子,可参考: [FormControlEventHandler(formControlStr(SalesTable, SalesLine_ItemId), FormControlEventType::Lookup)] public static void SalesLine_ItemId_OnLookup(FormControl

C#学习笔记(20140910)-单选控件和单选组控件、复选控件、复选组控件

晚上学习了一下单选控件和单选组控件.复选控件.复选组控件. 稍微动了点脑筋,做了一个小小的网页程序.主要功能是相互赋值已经设置标签的字体大小和颜色已经前后背景色. 主要功能: 1. 在文本输入框中输入文字,提交后可以对标签赋值: 2. 选择单选框可以给标签赋值: 3. 选择单选组控件时可以给标签设置颜色: 4. 选择单选组控件时可以给字体设置大小. 最后的效果如下: 分块设置就不多说了,看看用到了哪些模块吧: 1. 自定义了一个方法,把标签的值赋值给输入框.使得输入框中的内容和标签的内容一致.