关于使用矩阵做报表的使用说明
1. 矩阵是多维度向下钻取数据的报表的工具。
2. 使用矩阵报表,需先配置一个数据集,如图:2-1所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A2-1%20%E6%95%B0%E6%8D%AE%E9%9B%86%E5%90%84Datatable%20%E7%9A%84%E7%BB%93%E6%9E%84%E5%9B%BE.bmp)
图:2-1 数据集各Datatable 的结构图
其中DataTable各列为报表统计时所需的各个字段,不需要连接数据库并把数据显示出来,这些列仅用于报表初始化使用,数据显示将使用存储过程动态实现。
3. 新建一个报表文件,并从左侧的工具箱里拉出几个矩阵到编辑区,点击工具栏上的“数据”,选择数据源,如图:3-1
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A3-1%20%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E6%BA%90.bmp)
图:3-1 选择数据源
4. 将报表的各个维度字段拉入矩阵,如图:4-1所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A4-1%20%E7%9F%A9%E9%98%B5%E5%90%84%E7%BB%B4%E5%BA%A6%E5%AD%97%E6%AE%B5%E5%9C%A8%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E7%BB%93%E6%9E%84%E5%9B%BE.bmp)
图:4-1 矩阵各维度字段在矩阵中的结构图
其中人员构成中的两个列组的生成过程如图
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A4-2%20%E9%80%89%E6%8B%A9%E6%8F%92%E5%85%A5%E7%BB%84.bmp)
图:4-2 选择插入组
插入组后,按图:4-3所示操作选择维度
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A4-3%20%E9%80%89%E6%8B%A9%E5%88%97%E7%BB%84%E7%9A%84%E8%A1%A8%E8%BE%BE%E5%BC%8F.bmp)
图:4-3 选择列组的表达式
选择好表达式后,按图:4-4所示选择排序
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A4-4%E9%80%89%E6%8B%A9%E5%88%97%E7%BB%84%E7%9A%84%E6%8E%92%E5%BA%8F%E8%A1%A8%E8%BE%BE%E5%BC%8F.bmp)
图:4-4选择列组的排序表达式
其中,方向可选升序或降序,也可以对组进行编辑,如图:4-5所示,右键单击第一个列组,选择编辑进行编辑,编辑它的排序表达式。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A4-6%E7%BC%96%E8%BE%91%E5%88%97%E7%BB%84%E7%9A%84%E6%8E%92%E5%BA%8F%E8%A1%A8%E8%BE%BE%E5%BC%8F.bmp)
图:4-5编辑列组的排序表达式
设置矩阵的行组与设置列组类似,不再详细介绍,仅截一个截图如图:4-6所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A4-7%E7%BC%96%E8%BE%91%E8%A1%8C%E7%BB%84.bmp)
图:4-6编辑行组
5. 实现矩阵的合计功能,如图4-2所示,选择小计,将会按照第一个列组进行合计,如果要将合计显示在矩阵的左侧,右击合计右上角的绿色三角区,选择属性,在属性中配置。如图:5-1所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A5-1%E8%AE%BE%E7%BD%AE%E6%80%BB%E8%AE%A1%E7%9A%84%E6%98%BE%E7%A4%BA%E4%BD%8D%E7%BD%AE.bmp)
图:5-1设置总计的显示位置
6. 设置矩阵的边框样式和宽度,如图:6-1所示;宽度设置0.5不会导致导出Excel是边线过粗的现象。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A6-1%E8%AE%BE%E7%BD%AE%E7%9F%A9%E9%98%B5%E7%9A%84%E8%BE%B9%E6%A1%86%E6%A0%B7%E5%BC%8F%E5%92%8C%E5%AE%BD%E5%BA%A6.bmp)
图:6-1设置矩阵的边框样式和宽度
矩阵文本的对齐方式,如同Office操作,选择工具栏的对齐方式即可。
矩阵有各种函数、运算符和程序流等,可自动完成许多功能,如图6-2所示完成计算百分比并根据所得结果进行替换的功能。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A6-2%E7%9F%A9%E9%98%B5%E5%AE%9E%E7%8E%B0%E7%99%BE%E5%88%86%E6%AF%94%E8%AE%A1%E7%AE%97.bmp)
图:6-2矩阵实现百分比计算
7. 多个组时,文本对齐方式的设置,如图:7-1所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A7-1%E5%A4%9A%E5%88%97%E7%BB%84%E6%97%B6%E8%AE%BE%E7%BD%AE%E6%96%87%E6%9C%AC%E5%AF%B9%E9%BD%90%E6%96%B9%E5%BC%8F.bmp)
图:7-1多列组时设置文本对齐方式
设置参数,在工具栏,单击“报表”,选择“报表参数”,在报表参数里增加一个参数;如图7-2所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A7-2%20%E8%AE%BE%E7%BD%AE%E6%8A%A5%E8%A1%A8%E5%8F%82%E6%95%B0.bmp)
图:7-2 设置报表参数
使用报表参数,如设置报表的填报时间;如图7-3所示
![](https://p-blog.csdn.net/images/p_blog_csdn_net/yohop/%E5%9B%BE%EF%BC%9A7-3%20%E4%BD%BF%E7%94%A8%E6%8A%A5%E8%A1%A8%E5%8F%82%E6%95%B0.bmp)
图:7-3 使用报表参数
8. 建立存储过程,为了动态实现报表的数据呈报,应使用存储过程做数据源,如岗位职级构成存储过程如下所示:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go CREATE PROCEDURE [dbo].[P_RYJBXX_GWZSGC] ( @CheckTime datetime ) AS select c_emplinfo_emplid,c_positionzj_name,C_POSITIONZJ_ORDER from ---获取去除离职员工后的员工编号 (select distinct a.c_emplinfo_emplid from t_personnel_emplinfo a left outer join t_personnel_leavecompany b on a.c_emplinfo_emplid=b.C_LEAVECOMPANY_EMPLID ---离职时间在统计时间之后或离职时间为空 where (b.C_LEAVECOMPANY_LEAVEDATE>=@CheckTime or b.C_LEAVECOMPANY_LEAVEDATE is null) and ---入职登记时间在统计时间之前 a.C_EMPLINFO_REGISTERDATE<=@CheckTime) r
inner join --获取每位员工的最小岗位排序号 (select distinct C_EMPLPOST_EMPLID,min(C_POSITION_ORDER) as C_POSITION_ORDER from --获取每位员工的员工编号,岗位编号,岗位排序和岗位所在的职级编号 (select a.C_EMPLPOST_EMPLID,a.C_EMPLPOST_POSTID,b.C_POSITION_ORDER,b.C_POSITION_BELONGZJID from T_PERSONNEL_EMPLPOSITION a left outer join T_ORGANIZATION_POSITION b on a.C_EMPLPOST_POSTID=b.C_POSITION_ID ---员工任职时间在统计时间之前且离职时间在统计时间之后或离职时间为空 where a.C_EMPLPOST_STARTDATE<=@CheckTime and (a.C_EMPLPOST_ENDDATE>@CheckTime or a.C_EMPLPOST_ENDDATE is null) ---岗位设置时间在统计时间之前而且岗位终止时间在统计时间之后 and b.C_POSITION_BEGIDATE<=@CheckTime and (b.C_POSITION_ENDDATE>@CheckTime or b.C_POSITION_ENDDATE is null) ) m group by C_EMPLPOST_EMPLID) o on r.c_emplinfo_emplid=o.C_EMPLPOST_EMPLID inner join --获取岗位排序号和岗位所属的职级编号 (select distinct C_POSITION_ORDER,C_POSITION_BELONGZJID from (select a.C_EMPLPOST_EMPLID,a.C_EMPLPOST_POSTID,b.C_POSITION_ORDER,b.C_POSITION_BELONGZJID from T_PERSONNEL_EMPLPOSITION a left outer join T_ORGANIZATION_POSITION b on a.C_EMPLPOST_POSTID=b.C_POSITION_ID) m ) p on o.C_POSITION_ORDER=p.C_POSITION_ORDER inner join ---获取职级名称和职级排序 (select distinct top 100 percent b.C_POSITIONZJ_ID,b.C_POSITIONZJ_NAME,b.C_POSITIONZJ_ORDER from T_ORGANIZATION_POSITION a left outer join T_ORGANIZATION_POSITIONZJ b on a.C_POSITION_BELONGZJID=b.C_POSITIONZJ_ID ---职级生效时间在统计时间之前而且职级过期时间在统计时间之后或职级过期时间为空 where b.C_POSITIONZJ_STARTDATE<=@CheckTime and (b.C_POSITIONZJ_ENDDATE>@CheckTime or b.C_POSITIONZJ_ENDDATE is null) order by b.C_POSITIONZJ_ORDER) t on p.C_POSITION_BELONGZJID=t.C_POSITIONZJ_ID RETURN
1. 画报表界面,代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage/MyReportPage.master" AutoEventWireup="true" CodeFile="RptEmpInfo.aspx.cs" Inherits="Report_RptEmpInfo" Title="Untitled Page" %>
<%@ Register Assembly="Ideal.MISCore.MyControls" Namespace="Ideal.MISCore.MyControls" TagPrefix="MyCtrl" %>
<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<asp:Content ID="Content2" ContentPlaceHolderID="DETAIL_PART" Runat="Server">
<div style="text-align:center">
<table style="text-align:center; width:100%">
<tr align="left">
<td style="width:64px">填表日期:</td>
<td>
<MyCtrl:MyWebCalendar ID="txtDateTime" runat="server"></MyCtrl:MyWebCalendar>
<asp:Button ID="btnQuery" runat="server" Text="查询" OnClick="btnQuery_Click" />
</td>
</tr>
</table>
</div>
<div style="width:100%">
<rsweb:ReportViewer ID="RV" runat="server" Width="100%" Height="560px" Font-Names="Verdana" Font-Size="8pt">
</rsweb:ReportViewer>
</div>
</asp:Content>
11. 程序代码,如下所示:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Microsoft.Reporting.WebForms;
using Ideal.MISCore.MyWebCore;
using Ideal.MISCore.MyDataEngine;
public partial class Report_RptEmpInfo :MyBasePage
{
private const string VS_REPORTDATE = "ReportDate";
protected void Page_Load(object sender, EventArgs e)
{
//如果报表从其他网页跳转过来,则接受上个网页传来的时间
if(!String.IsNullOrEmpty(Request["time"]))
{
string mTime = Request["time"].ToString();
txtDateTime.Text = mTime;
}
//如果是第一次,则设置当前日期为填表日期
if (!Page.IsPostBack)
{
ViewState[VS_REPORTDATE] = DateTime.Now.ToString("yyyy-MM-dd");
showReport(true);
}
}
protected void btnQuery_Click(object sender, EventArgs e)
{
//如果填报日期为空,则显示错误信息
if (this.txtDateTime.Text.Trim() == "")
{
Response.Write("<script language='javascript'>window.alert('请选择日期')</script>");
return;
}
else
{
ViewState[VS_REPORTDATE] = this.txtDateTime.Text;
showReport(false);
}
}
}