PB开发系统实用工具2-数据汇总功能

用户很多时候需要对查询出来的数据做小范围数据汇总,这时候Excel的数据透视功能优势就出来了,本文利用PB自建一个类似的数据透视功能。

1,新建个弹出型窗口,放入三个数据窗口控件,具体如图

2,实现方法,将调用它的数据窗口所有数据列(计算列暂不支持)分成两类,一类为非数值型字段(分组栏位),一类为数值型字段(汇总栏位),当用户选好需要汇总的分组栏位和汇总栏位后,系统将按选择条件自动汇总。

3,实现代码,

一,装载左边两个类型的字段名

//==============================================================================
// 事件: ue_populate()
//------------------------------------------------------------------------------
// 描述:
//------------------------------------------------------------------------------
// 参数:
//        value    u_dw    adw_group        
//------------------------------------------------------------------------------
// 返回值:  
//------------------------------------------------------------------------------
// 作者:    zzx        日期: 2018.01.19
//==============================================================================
String ls_column,ls_coltext,ls_coltype
Int li_column,i,li_row,li_cross

If adw_group.Object.datawindow.Processing = '4' Then
    adw_group.Modify('datawindow.crosstab.staticmode=no')
End If
    
li_column = Integer(adw_group.Object.datawindow.column.count)

If adw_group.Object.datawindow.Processing = '4' Then
    adw_group.Modify('datawindow.crosstab.staticmode=yes')
    li_cross = Integer(adw_group.Object.datawindow.column.count)
Else
    li_cross = 0
End If

For i = 1 To li_column
    ls_column = adw_group.Describe("#"+String(i)+".name")
    
    If Lower(adw_group.Describe(ls_column + "_t.Type")) = 'text' Then
        ls_coltext = adw_group.Describe(ls_column + "_t.text")
        
        If ls_coltext = '?' Then Continue;
        If ls_coltext = '!' Then Continue;
        
        If Len(ls_coltext) > 0 Then
            If Right(ls_coltext,2) = '▽' Or Right(ls_coltext,2) = '△' Then
                ls_coltext = Left(ls_coltext,Len(ls_coltext) - 2)
            End If
            
            ls_coltype = Left(Lower(adw_group.Describe(ls_column + ".ColType" )),5)
            
            If ls_coltype = "numbe" Or ls_coltype = "decim" Then
                li_row = dw_data.InsertRow(0)
                dw_data.Object.col_name[li_row] = ls_coltext
                dw_data.Object.col_data[li_row] = ls_column
            Else
                li_row = dw_column.InsertRow(0)
                dw_column.Object.col_name[li_row] = ls_coltext
                dw_column.Object.col_data[li_row] = ls_column
            End If
        End If
    End If
Next

If li_cross > 0 Then
    For i = 0 To li_cross - li_column
        ls_column = adw_group.Describe("#"+String(li_column)+".name")
        
        If i = 0 Then
            ls_coltext = adw_group.Describe( ls_column + '_t' + '.Text')
        Else
            ls_coltext = adw_group.Describe( ls_column + '_t_' + String(i) + '.Text')
        End If
        
        If ls_coltext = '?' Then Continue;
        If ls_coltext = '!' Then Continue;
        
        If Len(ls_coltext) > 0 Then
            ls_column = adw_group.Describe("#"+String(li_column + i)+".name")
            ls_coltype = Left(Lower(adw_group.Describe(ls_column + ".ColType" )),5)
            
            If Right(ls_coltext,2) = '▽' Or Right(ls_coltext,2) = '△' Then
                ls_coltext = Left(ls_coltext,Len(ls_coltext) - 2)
            End If
            
            If ls_coltype = "numbe" Or ls_coltype = "decim" Then
                li_row = dw_data.InsertRow(0)
                dw_data.Object.col_name[li_row] = ls_coltext
                dw_data.Object.col_data[li_row] = ls_column
            Else
                li_row = dw_column.InsertRow(0)
                dw_column.Object.col_name[li_row] = ls_coltext
                dw_column.Object.col_data[li_row] = ls_column
            End If
        End If
    Next
    
    adw_group.Modify('datawindow.crosstab.staticmode=no')
End If


二,实现分组汇总

//==============================================================================
// 事件: ue_group()
//------------------------------------------------------------------------------
// 描述:
//------------------------------------------------------------------------------
// 参数:(无)
//------------------------------------------------------------------------------
// 返回值:  
//------------------------------------------------------------------------------
// 作者:    zzx        日期: 2018.01.19
//==============================================================================
String ls_col_name,ls_col_data,ls_col_type,ls_state,ls_col,ls_column,&
        ls_find,ls_find1,ls_col_code,ls_col_result,ls_col_value,ls_mask
Long ll_row,ll_rc,i,k,ll_find,ll_find1,j,ll_inser,n
Dec ldc_data,ldc_data_sum,ldc_value

dw_result.Reset()

ll_rc = dw_column.Find("state = 'Y'",1,dw_column.RowCount())
If ll_rc = 0 Then
    MessageBox('提示','请勾选分组栏位!')
    Return
End If

If idw_group.Object.DataWindow.Processing = '4' Then
    idw_group.Modify('datawindow.crosstab.staticmode=yes')
End If

ll_rc = idw_group.RowCount()

OpenWithParm(w_status,'系统正在统计,请稍候...')
dw_result.SetRedraw( False)

For i = 1 To ll_rc
    ls_find = ''
    ls_find1 = ''
    ll_row = dw_column.RowCount()
    
    For k = 1 To ll_row
        ls_state = dw_column.Object.State[k]
        ls_col_code = dw_column.Object.col_data[k]
        ls_col_result = dw_column.Object.col_result[k]
        
        If  ls_state = 'Y' Then
            ls_col_value = wf_get_col_value(idw_group,i,ls_col_code)
            If IsNull(ls_col_value) Then ls_col_value = ''
            ls_col_type = idw_group.Describe(ls_col_code+".coltype")
            
            Choose Case Left(Lower(ls_col_type),5)
                Case 'char(','char','char '
                    If ls_find1 = '' Then
                        ls_find1 = "if( isnull(" + ls_col_code +"),''," + ls_col_code + ")" + " = '" + ls_col_value + "' "
                    Else
                        ls_find1 = ls_find1 + " and " +  " if( isnull(" + ls_col_code +"),''," + ls_col_code + ")" + " = '" + ls_col_value + "' "
                    End If
                    
                Case 'numbe','decim'
                    If ls_find1 = '' Then
                        ls_find1 = "if( isnull(" + ls_col_code +"),0," + ls_col_code + ")" + " = if(" + ls_col_value + "='',0," + ls_col_value +")"
                    Else
                        ls_find1 = ls_find1 + " and " +  " if( isnull(" + ls_col_code +"),0," + ls_col_code + ")" + " = if(" + ls_col_value + "='',0," + ls_col_value +")"
                    End If
                    
                Case 'date','date ','datet','time','time '
                    
                    ls_mask = idw_group.Describe(ls_col_code + ".editmask.mask")
                    If ls_mask = '' Or ls_mask = '?' Or ls_mask = '!' Then
                        ls_mask = idw_group.Describe(ls_col_code + ".Format")
                    End If
                    
                    If ls_mask = '' Or ls_mask = '?' Or ls_mask = '!' Then
                        If Left(Lower(ls_col_type),5) = 'time' Or Left(Lower(ls_col_type),5) = 'time ' Then
                            ls_mask = 'hh:mm'
                        Else
                            ls_mask = 'yyyy-mm-dd'
                        End If
                    End If
                    
                    If ls_find1 = '' Then
                        ls_find1 = "if( isnull(" + ls_col_code + ") ,'', string(" + ls_col_code + ",'" + ls_mask + "')) = '" +  ls_col_value +"'"
                    Else
                        ls_find1 = ls_find1 + " and " + " if( isnull(" + ls_col_code + ") ,'', string(" + ls_col_code + ",'" + ls_mask + "')) = '" +  ls_col_value +"'"
                    End If
                    
                Case Else
                    
            End Choose
            
            If ls_find = '' Then
                ls_find =  "if( isnull(" + ls_col_result +"),''," + ls_col_result + ")" +" = '" + ls_col_value + "' "
            Else
                ls_find = ls_find + " and " +  "if( isnull(" + ls_col_result +"),''," + ls_col_result + ")" +" = '" + ls_col_value + "' "
            End If
        End If
    Next
    
    ll_find = dw_result.Find(ls_find,1, dw_result.RowCount() )
    
    If ll_find > 0 Then Continue
    
    ll_inser = dw_result.InsertRow(0)
    ll_row = dw_column.RowCount()
    
    For k = 1 To ll_row
        ls_state = dw_column.Object.State[k]
        ls_col_code = dw_column.Object.col_data[k]
        ls_col_result = dw_column.Object.col_result[k]
        
        If  ls_state = 'Y' Then
            dw_result.SetItem( ll_inser ,ls_col_result,  wf_get_col_value(idw_group,i,ls_col_code) )
        End If
    Next
    
    ll_row = dw_data.RowCount()
    
    For k = 1 To ll_row
        ldc_data = 0
        ldc_data_sum = 0
        
        ls_state = dw_data.Object.State[k]
        ls_col_code = dw_data.Object.col_data[k]
        ls_col_result = dw_data.Object.col_result[k]
        
        If  ls_state = 'Y' Then
            For j = 1 To ll_rc
                ll_find1 = idw_group.Find(ls_find1,j, j )
                If ll_find1 > 0 Then
                    ldc_data = idw_group.GetItemNumber(ll_find1, ls_col_code)
                    If IsNull(ldc_data) Then ldc_data = 0
                    ldc_data_sum = ldc_data_sum + ldc_data
                End If
                
            Next
            If ldc_data_sum = 0 Then
                dw_result.SetItem( ll_inser ,ls_col_result, 0  )
            ElseIf Truncate(ldc_data_sum, 0) = ldc_data_sum Then
                dw_result.SetItem( ll_inser ,ls_col_result, String(ldc_data_sum,'#,##0')  )
            Else
                dw_result.SetItem( ll_inser ,ls_col_result, String(ldc_data_sum,'#,##0.####')  )
            End If
        End If
    Next
Next

dw_result.SetTransObject(i_tran)
wf_dddw_retrieve(dw_result)

If IsValid(w_status) Then
    Close(w_status)
End If

dw_result.SetRedraw( True)

4,左边数据窗口对象

5,右边数据窗口对象,注意汇总栏的表达式

 

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值