Previous topicNext topic
Help > 使用指南 > 数据统计 > 数据透视表 > 自定义数据透视表 >
自定义数据透视表

我们可以利用平台提供的关于数据透视表的相关控件自己自定义组合成任意的功能。下面我们就以一个简单的示例来演示一下我们该如何做自定义功能。

我们就先做一个这样的功能,上面是统计结果。双击表中统计的明细可以在下面的明细表中显示。下面我们就看看这样一个功能该如何实现。

第一步:我们需要得到写统计功能需要的代码和SQL语句。前期的准备工具我们需要到数据管理模块中去做。

  1. 写好SQL语句,并执行查询出结果。把这里的SQL保留好,后面会用到。
  2. 在表标题右键菜单中打开“数据透视表”功能。
  3. 设置好统计的参数,结合“更新”按钮检查确认是否我们要的结果。
  4. 根据需求,选择“VB代码”或“C#代码”按钮来查看要得到这样的统计结果所对应的代码。把这里的代码保留好,后面会用到。

我们预览得到的代码是类似下面的样子。下面的示例代码前面两行中,数据源名称和SQL语句是需要我们在实际使用时进行相应修改的。

 Vb.Net
Dim db As Database= Proj.SysDataFactory("MainDB")
Dim dt As DataTable = db.ExecuteDataTable("select * from someTable where col1 = '123'")
Dim pivot As PivotDataTable = New PivotDataTable(dt)

'添加PivotFilterField部分

'添加PivotColumnField部分
Dim colField As PivotColumnField = Nothing
'初始化列字段
colField=New PivotColumnField(dt, "业务员")
'添加相应的属性设置
colField.DateGroup = DateGroupEnum.None
'将类加入到集合中
pivot.ColumnFields.Add(colField)


'添加PivotRowField部分
Dim rowField As PivotRowField = Nothing
'初始化行字段
rowField=New PivotRowField(dt, "产品")
'添加相应的属性设置
rowField.DateGroup = DateGroupEnum.None
'将类加入到集合中
pivot.RowFields.Add(rowField)

'初始化行字段
rowField=New PivotRowField(dt, "客户")
'添加相应的属性设置
rowField.DateGroup = DateGroupEnum.None
'将类加入到集合中
pivot.RowFields.Add(rowField)


'添加PivotDataField部分
Dim dataField As PivotDataField = Nothing
'初始化数据字段
dataField=New PivotDataField(dt, "数量")
'添加相应的属性设置
dataField.Aggregate = AggregateTypeEnum.Sum
'将类加入到集合中
pivot.DataFields.Add(dataField)

'初始化数据字段
dataField=New PivotDataField(dt, "金额")
'添加相应的属性设置
dataField.Aggregate = AggregateTypeEnum.Sum
'将类加入到集合中
pivot.DataFields.Add(dataField)

'如果有标题需要更换
'根据设置的参数,运行生成相应的结果
pivot.Build()
'获得最终生成的数据透视表
Dim dtResult As System.Data.DataTable = pivot.DataTableResult
'引用输入的源数据表
Dim dtSource As System.Data.DataTable = pivot.DataTableSource
'获得引用上一次生成结果一共运行了多长时间,以秒为单位
Dim dblUsedTime As Double  = pivot.LastTimeGetPivotDataTableNeedSeconds

 C#
Database db = Proj.SysDataFactory["MainDB"];
DataTable dt = db.ExecuteDataTable("select * from someTable where col1 = '123'");
PivotDataTable pivot = new PivotDataTable(dt);

//添加PivotFilterField部分

//添加PivotColumnField部分
PivotColumnField colField=null;
//初始化类
colField=new PivotColumnField(dt, "业务员");
//添加相应的属性设置
colField.DateGroup = DateGroupEnum.None;
//将类加入到集合中
pivot.ColumnFields.Add(colField);


//添加PivotRowField部分
PivotRowField rowField=null;
//初始化类
rowField=new PivotRowField(dt, "产品");
//添加相应的属性设置
rowField.DateGroup = DateGroupEnum.None;
//将类加入到集合中
pivot.RowFields.Add(rowField);

//初始化类
rowField=new PivotRowField(dt, "客户");
//添加相应的属性设置
rowField.DateGroup = DateGroupEnum.None;
//将类加入到集合中
pivot.RowFields.Add(rowField);


//添加PivotDataField部分
PivotDataField dataField=null;
//初始化类
dataField=new PivotDataField(dt, "数量");
//添加相应的属性设置
dataField.Aggregate = AggregateTypeEnum.Sum;
//将类加入到集合中
pivot.DataFields.Add(dataField);

//初始化类
dataField=new PivotDataField(dt, "金额");
//添加相应的属性设置
dataField.Aggregate = AggregateTypeEnum.Sum;
//将类加入到集合中
pivot.DataFields.Add(dataField);

//如果有标题需要更换
//根据设置的参数,运行生成相应的结果
pivot.Build();
//获得最终生成的数据透视表
DataTable dtResult = pivot.DataTableResult;
//引用输入的源数据表
DataTable dtSource = pivot.DataTableSource;
//获得引用上一次生成结果一共运行了多长时间,以秒为单位
double dblUsedTime = pivot.LastTimeGetPivotDataTableNeedSeconds;

第二步:按照下面的布局与设计创建窗体。

第三步:在统计结果表的MouseDoubleClick事件中写入显示子表明细的功能。

第四步:在“生成报表 ”的按钮里面写入我们在第一步获得的代码。并且修改代码的前面两行代码,修改一下数据源名称和SQL语句。

在代码的最后将统计的结果赋值给tblMain表。并且保存一下PivotDataTable对象,方便在双击事件中使用。

窗体的完整代码如下:

Vb.Net
Namespace FormEvents
    Public Class Formf8ce7ddbe2584fa08b1afada2d3bedf3
        Inherits FormEventsBase
        
        Private SplitContainer1 As System.Windows.Forms.SplitContainer
        Private SmButton1 As SmButton
        Private SmSplitContainerEx1 As SmSplitContainerEx
        Private tblMain As SmGrid
        Private tblDtl As SmGrid
        Public Sub NewForm2_Load(sender As Object,e As  System.EventArgs)
            SplitContainer1=Me.SmForm.ControlDictionary()("SplitContainer1")
            SmButton1=Me.SmForm.ControlDictionary()("SmButton1")
            SmSplitContainerEx1=Me.SmForm.ControlDictionary()("SmSplitContainerEx1")
            tblMain=Me.SmForm.ControlDictionary()("tblMain")
            tblDtl=Me.SmForm.ControlDictionary()("tblDtl")
            
        End Sub
        
        Private m_PivotDataTable As PivotDataTable=Nothing
        Public Sub SmButton1_Click(sender As Object,e As  System.EventArgs)
            '【修改一下数据源名称】
            Dim db As Database= Proj.SysDataFactory("UserDB")
            '【修改一下查询的SQL语句】
            Dim dt As DataTable = db.ExecuteDataTable("SELECT [产品],[客户],[业务员],[数量],[金额],[日期] FROM [订单信息]")
            Dim pivot As PivotDataTable = New PivotDataTable(dt)
            
            '添加PivotFilterField部分
            
            '添加PivotColumnField部分
            Dim colField As PivotColumnField = Nothing
            '初始化列字段
            colField=New PivotColumnField(dt, "业务员")
            '添加相应的属性设置
            colField.DateGroup = DateGroupEnum.None
            '将类加入到集合中
            pivot.ColumnFields.Add(colField)
            
            
            '添加PivotRowField部分
            Dim rowField As PivotRowField = Nothing
            '初始化行字段
            rowField=New PivotRowField(dt, "产品")
            '添加相应的属性设置
            rowField.DateGroup = DateGroupEnum.None
            '将类加入到集合中
            pivot.RowFields.Add(rowField)
            
            '初始化行字段
            rowField=New PivotRowField(dt, "客户")
            '添加相应的属性设置
            rowField.DateGroup = DateGroupEnum.None
            '将类加入到集合中
            pivot.RowFields.Add(rowField)
            
            
            '添加PivotDataField部分
            Dim dataField As PivotDataField = Nothing
            '初始化数据字段
            dataField=New PivotDataField(dt, "数量")
            '添加相应的属性设置
            dataField.Aggregate = AggregateTypeEnum.Sum
            '将类加入到集合中
            pivot.DataFields.Add(dataField)
            
            '初始化数据字段
            dataField=New PivotDataField(dt, "金额")
            '添加相应的属性设置
            dataField.Aggregate = AggregateTypeEnum.Sum
            '将类加入到集合中
            pivot.DataFields.Add(dataField)
            
            '如果有标题需要更换
            '根据设置的参数,运行生成相应的结果
            pivot.Build()
            '获得最终生成的数据透视表
            Dim dtResult As System.Data.DataTable = pivot.DataTableResult
            '引用输入的源数据表
            Dim dtSource As System.Data.DataTable = pivot.DataTableSource
            '获得引用上一次生成结果一共运行了多长时间,以秒为单位
            Dim dblUsedTime As Double  = pivot.LastTimeGetPivotDataTableNeedSeconds
            
            '将统计结果的
            tblMain.DataSource=dtResult
            '使用dtResult中的标题信息重新创建标题
            tblMain.BuildCaption(tblMain)
            '将pivot保存起来后面需要用
            m_PivotDataTable=pivot
        End Sub
        
        
        Public Sub tblMain_MouseDoubleClick(sender As Object,e As  System.Windows.Forms.MouseEventArgs)
            '双击显示子表信息
            m_PivotDataTable.ShowSubDetails(tblMain,tblDtl,e.Location)
        End Sub
        
    End Class
End Namespace

引申思考

我们还可以添加一些图表相关的功能,就可以让报表显示的非常优秀了。