PB开发系统实用工具1-数据筛选功能

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

1,新建一个Custom Visual对象,放入一个数据窗口控制,一个单行编辑框,两个checkbox以及两个按钮,新建一个数据窗口对象(外部数据源),三个字段即可,具体如下图,建好后面用户对象如图:

2,功能实现方法,在该对象增加几个实例变量,用户调用它的窗口对象、调用它的数据窗口控件,调用它的备用数据,当前列,过滤条件,具体如图:

3,具体代码(事件及函数),两个事件三个函数

4,运行效果,鼠标移动到列标题自动显示倒黑三角形

5,数据筛选,自动生成筛选下拉框

6,函数代码

//==============================================================================
// 函数: of_get_dw()
//------------------------------------------------------------------------------
// 描述:
//------------------------------------------------------------------------------
// 参数:
//        value    u_dw    adw_data        
//------------------------------------------------------------------------------
// 返回值:  integer
//------------------------------------------------------------------------------
// 作者:    zzx        日期: 2017.11.30
//==============================================================================
Blob lblb_data

idw_requst = adw_data

adw_data.GetFullState(lblb_data)

ids_requst.SetFullState(lblb_data)

Return 1

//==============================================================================
// 函数: of_set_data()
//------------------------------------------------------------------------------
// 描述:
//------------------------------------------------------------------------------
// 参数:
//        value    string    as_column        
//------------------------------------------------------------------------------
// 返回值:  integer
//------------------------------------------------------------------------------
// 作者:    zzx        日期: 2017.11.30
//==============================================================================
Any la_data
String ls_coltype,ls_coldisplay,ls_coldata,ls_column_type,ls_old_data
Long li_rc,i,li_row
Int li_find

li_row = ids_requst.RowCount()

If li_row > 0 Then
    ids_requst.SetSort(as_column + ' A')
    ids_requst.Sort()
    
    dw_filter.Reset()
    
    ls_coltype = Lower(ids_requst.Describe(as_column + ".ColType" ))
    ls_column_type = ids_requst.Describe(as_column+".Edit.Style")
    
    For i = 1 To li_row
        Choose Case Left(ls_coltype, 5)
            Case "char(", "char"
                la_data = ids_requst.GetItemString(i,as_column,primary!,True)
                If Lower(ls_column_type) = 'dddw' Or Lower(ls_column_type) = 'ddlb' Then
                    ls_coldisplay = ids_requst.Describe("Evaluate('LookUpDisplay("+as_column+") ', "+ String(i) + ")")
                Else
                    ls_coldisplay = String(la_data)
                End If                
                ls_coldata = String(la_data)
                
            Case "date"
                la_data = ids_requst.GetItemDate(i,as_column,primary!,True)
                ls_coldisplay = String(la_data,'yyyy-mm-dd')
                ls_coldata = String(la_data,'yyyy-mm-dd')
                
            Case "datet"
                la_data = ids_requst.GetItemDateTime(i,as_column,primary!,True)
                ls_coldisplay = String(la_data,'yyyy-mm-dd hh')
                ls_coldata = String(la_data,'yyyy-mm-dd hh')
                
            Case "numbe","decim"
                la_data = ids_requst.GetItemNumber(i,as_column,primary!,True)
                ls_coldisplay = String(la_data)
                ls_coldata = String(la_data)
                
        End Choose
        
        If IsNull(la_data) Then
            ls_coldisplay = '空';
            ls_coldata = 'null'
        End If
        
        If ls_old_data = ls_coldata Then
            Continue;
        Else
            ls_old_data = ls_coldata
        End If
        
        li_rc = dw_filter.InsertRow(0)
        
        If idw_requst.FilteredCount() > 0 Then
            dw_filter.Object.is_check[li_rc] = 'Y'
        Else
            dw_filter.Object.is_check[li_rc] = 'N'
        End If
        
        dw_filter.Object.col_display[li_rc] = ls_coldisplay
        dw_filter.Object.col_data[li_rc] = ls_coldata
    Next
    
    cbx_1.Checked = False
End If

ids_requst.ReSet()
idw_requst.RowsCopy(1,idw_requst.FilteredCount(),Filter!,ids_requst,1,Primary!)

li_row = ids_requst.RowCount()

If li_row > 0 Then
    ids_requst.SetSort(as_column + ' A')
    ids_requst.Sort()
    
    ls_coltype = Lower(ids_requst.Describe(as_column + ".ColType" ))
    ls_column_type = ids_requst.Describe(as_column+".Edit.Style")
    
    For i = 1 To li_row
        Choose Case Left(ls_coltype, 5)
            Case "char(", "char"
                la_data = ids_requst.GetItemString(i,as_column,primary!,True)
                If Lower(ls_column_type) = 'dddw' Or Lower(ls_column_type) = 'ddlb' Then
                    ls_coldisplay = ids_requst.Describe("Evaluate('LookUpDisplay("+as_column+") ', "+ String(i) + ")")
                Else
                    ls_coldisplay = String(la_data)
                End If                
                ls_coldata = String(la_data)
                
            Case "date"
                la_data = ids_requst.GetItemDate(i,as_column,primary!,True)
                ls_coldisplay = String(la_data,'yyyy-mm-dd')
                ls_coldata = String(la_data,'yyyy-mm-dd')
                
            Case "datet"
                la_data = ids_requst.GetItemDateTime(i,as_column,primary!,True)
                ls_coldisplay = String(la_data,'yyyy-mm-dd hh')
                ls_coldata = String(la_data,'yyyy-mm-dd hh')
                
            Case "numbe","decim"
                la_data = ids_requst.GetItemNumber(i,as_column,primary!,True)
                ls_coldisplay = String(la_data)
                ls_coldata = String(la_data)
                
        End Choose
        
        If IsNull(la_data) Then
            ls_coldisplay = '空';
            ls_coldata = 'null'
        End If
        
        If ls_old_data = ls_coldata Then
            Continue;
        Else
            ls_old_data = ls_coldata
        End If
        
        li_find = dw_filter.Find("col_data = '"+ls_coldata+"'",1,dw_filter.RowCount())
        
        If li_find <= 0 Then
            li_rc = dw_filter.InsertRow(0)
            
            dw_filter.Object.is_check[li_rc] = 'N'
            dw_filter.Object.col_display[li_rc] = ls_coldisplay
            dw_filter.Object.col_data[li_rc] = ls_coldata
        End If
    Next
    
    cbx_1.Checked = False
End If

Return 1

//==============================================================================
// 函数: of_set_filter()
//------------------------------------------------------------------------------
// 描述:
//------------------------------------------------------------------------------
// 参数:(无)
//------------------------------------------------------------------------------
// 返回值:  integer
//------------------------------------------------------------------------------
// 作者:    zzx        日期: 2017.11.30
//==============================================================================
String ls_filter,ls_is_check,ls_col_data,ls_coltype,ls_sle_1,ls_edit_type,ls_col_display
Long li_row,i

If dw_filter.AcceptText() <> 1 Then Return -1

li_row = dw_filter.RowCount()

ls_coltype = Lower(idw_requst.Describe(is_column + ".ColType" ))

Choose Case Left(ls_coltype, 5)
    Case "char(", "char"
        
        If li_row > 0 Then
            For i = 1 To li_row
                ls_is_check = dw_filter.Object.is_check[i]
                ls_col_data = dw_filter.Object.col_data[i]
                ls_col_display = dw_filter.Object.col_display[i]
                If ls_is_check = 'Y' Then
                    If ls_col_display = '空' And ls_col_data = 'null' Then
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or isnull("+is_column+")"
                        Else
                            ls_filter = " isnull("+is_column+")"
                        End If
                    Else
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or "+is_column+" = '"+ls_col_data +"'"
                        Else
                            ls_filter = is_column+" = '"+ls_col_data+"'"
                        End If
                    End If
                End If
            Next
        End If
        
        ls_sle_1 = sle_1.Text
        
        If Len(ls_sle_1) > 0 Then
            ls_edit_type  =  Lower(idw_requst.Describe(is_column + ".Edit.Style" ))
            
            If Len(ls_filter) > 0 Then
                If Lower(ls_edit_type) = 'dddw' Or Lower(ls_edit_type) = 'ddlb' Then
                    ls_filter += " or LookUpDisplay("+is_column+") like '%"+ls_sle_1+"%'"
                Else
                    ls_filter += " or "+is_column+" like '%"+ls_sle_1+"%'"
                End If
            Else
                If Lower(ls_edit_type) = 'dddw' Or Lower(ls_edit_type) = 'ddlb' Then
                    ls_filter = " LookUpDisplay("+is_column+") like '%"+ls_sle_1+"%'"
                Else
                    ls_filter = is_column+" like '%"+ls_sle_1+"%'"
                End If
            End If
        End If
        
    Case "numbe","decim"
        
        If li_row > 0 Then
            For i = 1 To li_row
                ls_is_check = dw_filter.Object.is_check[i]
                ls_col_data = dw_filter.Object.col_data[i]
                ls_col_display = dw_filter.Object.col_display[i]
                If ls_is_check = 'Y' Then
                    If ls_col_display = '空' And ls_col_data = 'null' Then
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or isnull("+is_column+")"
                        Else
                            ls_filter = " isnull("+is_column+")"
                        End If
                    Else
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or "+is_column+" = "+ls_col_data +""
                        Else
                            ls_filter = is_column+" = "+ls_col_data+""
                        End If
                    End If
                End If
            Next
        End If
        
        ls_sle_1 = sle_1.Text
        
        If Len(ls_sle_1) > 0 Then
            If Len(ls_filter) > 0 Then
                ls_filter += " or String("+is_column+") like '"+ls_sle_1+"%'"
            Else
                ls_filter = " String("+is_column+") like '"+ls_sle_1+"%'"
            End If
        End If
        
    Case "date"
        
        If li_row > 0 Then
            For i = 1 To li_row
                ls_is_check = dw_filter.Object.is_check[i]
                ls_col_data = dw_filter.Object.col_data[i]
                ls_col_display = dw_filter.Object.col_display[i]
                If ls_is_check = 'Y' Then
                    If ls_col_display = '空' And ls_col_data = 'null' Then
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or isnull("+is_column+")"
                        Else
                            ls_filter = " isnull("+is_column+")"
                        End If
                    Else
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or String("+is_column+",'yyyy-mm-dd') = '"+ls_col_data +"'"
                        Else
                            ls_filter = " String("+is_column+",'yyyy-mm-dd') = '"+ls_col_data+"'"
                        End If
                    End If
                End If
            Next
        End If
        
        ls_sle_1 = sle_1.Text
        
        If Len(ls_sle_1) > 0 Then
            If Len(ls_filter) > 0 Then
                ls_filter += " or String("+is_column+",'yyyy-mm-dd') = '"+ls_sle_1 +"'"
            Else
                ls_filter = " String("+is_column+",'yyyy-mm-dd') = '"+ls_sle_1+"'"
            End If
        End If
        
    Case "datet"
        
        If li_row > 0 Then
            For i = 1 To li_row
                ls_is_check = dw_filter.Object.is_check[i]
                ls_col_data = dw_filter.Object.col_data[i]
                ls_col_display = dw_filter.Object.col_display[i]
                If ls_is_check = 'Y' Then
                    If ls_col_display = '空' And ls_col_data = 'null' Then
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or isnull("+is_column+")"
                        Else
                            ls_filter = " isnull("+is_column+")"
                        End If
                    Else
                        If Len(ls_filter) > 0 Then
                            ls_filter += " or String("+is_column+",'yyyy-mm-dd hh') = '"+ls_col_data +"'"
                        Else
                            ls_filter = " String("+is_column+",'yyyy-mm-dd hh') = '"+ls_col_data+"'"
                        End If
                    End If
                End If
            Next
        End If
        
        ls_sle_1 = sle_1.Text
        
        If Len(ls_sle_1) > 0 Then
            If Len(ls_filter) > 0 Then
                ls_filter += " or String("+is_column+",'yyyy-mm-dd hh') = '"+ls_sle_1 +"'"
            Else
                ls_filter = " String("+is_column+",'yyyy-mm-dd hh') = '"+ls_sle_1+"'"
            End If
        End If
        
    Case Else
        
End Choose

If cbx_2.Checked = True Then
    is_filter = ''
End If

If Len(is_filter) > 0 And Len(ls_filter) > 0 Then
    ls_filter = is_filter + " and " + " ("+ls_filter+")"
End If

is_filter = ls_filter

idw_requst.SetRedraw(False)
idw_requst.SetFilter(ls_filter)
idw_requst.Filter()
idw_requst.SetFilter("1=1")
idw_requst.Sort()
idw_requst.GroupCalc()
idw_requst.SetRedraw(True)
sle_1.Text = ''

If idw_requst.RowCount() > 0 Then
    idw_requst.Event rowfocuschanged(1)
End If

Return 1

7,调用数据窗口相关事件,数据窗口控件增加实例变量

8,数据窗口控件增加鼠标移动事件

//==============================================================================
// 事件: ue_mousemove()
//------------------------------------------------------------------------------
// 描述:
//------------------------------------------------------------------------------
// 参数:
//        integer     xpos        
//        integer     ypos        
//        long        row         
//        dwobject    dwo         
//------------------------------------------------------------------------------
// 返回值:  long
//------------------------------------------------------------------------------
// 作者:    zzx        日期: 2017.11.30
//==============================================================================
String ls_band,ls_column,ls_column1
Int li_x,li_y

If This.RowCount() <= 0 And This.FilteredCount() <= 0 Then
    If IsValid(iuo_stdwn) Then
        If IsValid(iuo_stdwn.iuo_filter) Then
            iuo_stdwn.iuo_filter.Visible = False
            iuo_stdwn.iuo_filter.Hide()
        End If
            
        iuo_stdwn.Visible = False
        iuo_stdwn.Hide()
    End If
    
    Return 0
End If

If This.Object.datawindow.processing = '4' Then Return 0

If is_status = 'F' Or is_status = '' Then
    ls_band = GetBandAtPointer()
    ls_band = left(ls_band,(pos(ls_band,'~t') - 1))
    
    If ls_band = 'header' Then
        ls_column = dwo.Name
        
        If ls_column = 't_1' Or ls_column = 't_2' Or ls_column = 'id_t' Then Return 0
        
        If IsValid(iuo_stdwn) Then
            If Lower(This.Describe(ls_column + ".Type")) = 'text' Then
                ls_column1 = Left(ls_column,Len(ls_column) - 2)
                
                If This.is_column <> ls_column1 Then
                    li_x = long(Describe(ls_column+".x")) + long(Describe(ls_column + ".width")) - 70 - ii_horizontal
                    li_y = long(Describe(ls_column+".y"))
                    
                    iuo_stdwn.backcolor = Long(Describe(ls_column+".Background.Color"))
                    iuo_stdwn.Move(This.x + li_x,This.y + li_y + 8)
                    iuo_stdwn.of_get_dw(This)
                    iuo_stdwn.is_column = ls_column1
                    This.is_column = ls_column1
                End If
                
                If iuo_stdwn.Visible = False Then
                    iuo_stdwn.Visible = True
                    iuo_stdwn.Show()
                End If
            End If
        Else
            If of_getparentwindow(This,iw_parent) = 1 Then
                iw_parent.OpenUserObject(iuo_stdwn)
                iuo_stdwn.Visible = False
                iuo_stdwn.idw_requst = This
                iuo_stdwn.iw_parent = This.iw_parent
                
                If Lower(This.Describe(ls_column + ".Type")) = 'text' Then
                    ls_column1 = Left(ls_column,Len(ls_column) - 2)
                    li_x = long(Describe(ls_column+".x")) + long(Describe(ls_column + ".width")) - 70 - ii_horizontal
                    li_y = long(Describe(ls_column+".y"))
                    
                    iuo_stdwn.backcolor = Long(Describe(ls_column+".Background.Color"))
                    iuo_stdwn.Move(This.x + li_x,This.y + li_y + 8)
                    iuo_stdwn.of_get_dw(This)
                    iuo_stdwn.is_column = ls_column1
                    This.is_column = ls_column1
                    iuo_stdwn.Visible = True
                    iuo_stdwn.Show()
                End If
            End If
        End If
    End If
End If

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

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

抵扣说明:

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

余额充值