通用DW窗口查询功能
一 创建用户对象u_vst_search
二 初始化控件 uo_find.uf_init_dw( dw_1 )三 重写ue_search() 和ue_all()事件用来处理过滤功能
如重写ue_search()按选择的查询条件进行过滤
long ll_count
dw_1.setredraw( false )
//先检索所有数据
ll_count = dw_1.retrieve( '1',"%" )
//再按条件过滤
dw_1.setfilter( as_condition)
dw_1.filter( )
ll_count = dw_1.rowcount( )
if ll_count <= 0 then
event zfc_new()
end if
dw_1.setredraw( true )
forward
global type u_vst_search from userobject
end type
type st_txt from statictext within u_vst_search
end type
type cb_1 from commandbutton within u_vst_search
end type
type pb_find from commandbutton within u_vst_search
end type
type sle_xx from dropdownlistbox within u_vst_search
end type
type ddlb_condition from dropdownlistbox within u_vst_search
end type
type ddlb_col from dropdownlistbox within u_vst_search
end type
end forward
global type u_vst_search from userobject
integer width = 2318
integer height = 112
long backcolor = 67108864
string text = "none"
long tabtextcolor = 33554432
long picturemaskcolor = 536870912
event ue_key pbm_keydown
event ue_all ( )
event ue_search ( string as_condition )
st_txt st_txt
cb_1 cb_1
pb_find pb_find
sle_xx sle_xx
ddlb_condition ddlb_condition
ddlb_col ddlb_col
end type
global u_vst_search u_vst_search
type variables
DataWindow idw_1
String is_CurrentCol = ''
string is_title
string is_datalist[]
string is_condition
string is_condtype = 'F' //查询方式:F(DW过滤);Q(SQL查询)
end variables
forward prototypes
public function string uf_explain_condition (string as_condition)
public subroutine uf_set_condition (string as_type)
public function long uf_check ()
public function string uf_check_datatype (integer ai_id)
public subroutine uf_init (datawindow adw_1)
end prototypes
event ue_all();//点击“所有”操作,取消查询条件
//parent.event ue_all()
end event
event ue_search(string as_condition);//点击“查询”操作,as_condtion为查询条件
//parent.event ue_search(as_condition)
end event
public function string uf_explain_condition (string as_condition);String ls_ret
Choose Case as_condition
Case '等于'
ls_ret = '='
Case '不等于'
ls_ret = '<>'
Case '大于'
ls_ret = '>'
Case '大于等于'
ls_ret = '>='
Case '小于'
ls_ret = '<'
Case '小于等于'
ls_ret = '<='
Case '类似于'
ls_ret = 'like'
Case '包含'
ls_ret = 'like'
Case '不包含'
ls_ret = 'not like'
Case '在...之间'
ls_ret = 'between'
Case '并且'
ls_ret = 'And'
Case '或者'
ls_ret = 'Or'
End Choose
return ls_ret
end function
public subroutine uf_set_condition (string as_type);ddlb_condition.Reset()
Choose Case lower(as_type)
Case 'num'//数字型
ddlb_condition.AddItem("等于")
ddlb_condition.AddItem("不等于")
ddlb_condition.AddItem("小于")
ddlb_condition.AddItem("小于等于")
ddlb_condition.AddItem("大于")
ddlb_condition.AddItem("大于等于")
Case 'str'//字符型
ddlb_condition.AddItem("等于")
ddlb_condition.AddItem("不等于")
ddlb_condition.AddItem("小于")
ddlb_condition.AddItem("小于等于")
ddlb_condition.AddItem("大于")
ddlb_condition.AddItem("大于等于")
ddlb_condition.AddItem("类似于")
ddlb_condition.AddItem("包含")
ddlb_condition.AddItem("不包含")
Case 'date'//日期型
ddlb_condition.AddItem("等于")
ddlb_condition.AddItem("不等于")
ddlb_condition.AddItem("小于")
ddlb_condition.AddItem("小于等于")
ddlb_condition.AddItem("大于")
ddlb_condition.AddItem("大于等于")
End Choose
end subroutine
public function long uf_check ();Int li_id, li_pos,li_posleft,li_posright
string ls_data
li_id = Integer(Mid(ddlb_col.text, 2, Pos(ddlb_col.Text, ']', 1) - 2))
if li_id = 0 then
return 1
end if
ls_data = sle_xx.text
Choose Case uf_check_datatype(li_id)
Case 'num'
li_PosLeft = Pos(ls_data, "[")
li_PosRight = Pos(ls_data, "]")
if li_posright > li_posleft and li_posleft > 0 then
ls_data = Mid(ls_data, li_PosLeft + 1, li_PosRight - li_PosLeft - 1)
end if
If Not IsNumber(ls_data) Then
Goto Err
End If
Case 'date'
IF uf_explain_condition(ddlb_condition.Text) = 'between' Then
li_pos = Pos(ls_data, ',', 1)
If li_pos = 0 Then
messagebox("查询", "请输入正确的数据格式,如: 2001-01-01,2003-01-01")
Goto Err
End If
If Not IsDate(Left(ls_data, li_pos - 1)) Or Not IsDate(Right(ls_data, len(ls_data) - li_pos)) Then
Goto Err
End If
Else
If Not IsDate(ls_data) Then
Goto Err
End If
End If
End Choose
Return 1
Err:
messagebox("查询", "数据的类型不匹配!")
Return -1
end function
public function string uf_check_datatype (integer ai_id);String ls_datatype, ls_ret
ls_datatype = idw_1.Describe("#" + String(ai_id) + ".ColType")
If Pos(ls_datatype, '(', 1) > 0 Then
ls_datatype = Mid(ls_datatype, 1, Pos(ls_datatype, "(", 1) - 1)
End If
Choose Case ls_datatype
Case 'numeric', 'decimal', 'int', 'money', 'real', 'smallint', 'smallmoney', 'tinyint','long'
ls_ret = 'num'
Case 'datetime', 'timestamp'
ls_ret = 'date'
Case Else
ls_ret = 'str'
End Choose
Return ls_ret
end function
public subroutine uf_init (datawindow adw_1);idw_1 = adw_1
String ls_ColName, ls_Col, ls_itemName, ls_tag, ls_parent
Int li_ColCount, i, m, li_visible
ddlb_col.reset( ) //重置列名
li_ColCount = Integer(idw_1.Describe("DataWindow.Column.Count"))
For i = 1 To li_ColCount
ls_Col = idw_1.Describe("#" + String(i) + ".Name")
ls_ColName = idw_1.Describe(ls_col + "_t.Text")
li_visible = Integer(idw_1.Describe(ls_col + ".Visible"))
ls_tag = idw_1.Describe("#" + String(i) + ".Tag")
If li_visible = 0 Then Continue
If ls_ColName = '!' Then Continue
If ls_tag = 'NOSEARCH' Then Continue
If Pos(ls_Col, "item_no") > 0 Then
ls_itemName = ls_ColName
m = i
End If
ddlb_col.AddItem("[" + String(i) + "]:" + ls_ColName)
Next
If m > 0 Then
ddlb_col.Text = "["+ String(m) + "]:" + ls_itemName
ddlb_col.TriggerEvent("SelectionChanged")
Else
If i > 0 Then
ddlb_col.SelectItem(1)
ddlb_col.Event SelectionChanged(1)
End If
End If
//接窗口增加模糊查询
ls_parent = lower(ClassName(This.GetParent()))
if ls_parent = '' then
ddlb_col.InsertItem("[0]:模糊查询", 1)
ddlb_col.SelectItem(1)
ddlb_col.Event SelectionChanged(1)
end if
end subroutine
on u_vst_search.create
this.st_txt=create st_txt
this.cb_1=create cb_1
this.pb_find=create pb_find
this.sle_xx=create sle_xx
this.ddlb_condition=create ddlb_condition
this.ddlb_col=create ddlb_col
this.Control[]={this.st_txt,&
this.cb_1,&
this.pb_find,&
this.sle_xx,&
this.ddlb_condition,&
this.ddlb_col}
end on
on u_vst_search.destroy
destroy(this.st_txt)
destroy(this.cb_1)
destroy(this.pb_find)
destroy(this.sle_xx)
destroy(this.ddlb_condition)
destroy(this.ddlb_col)
end on
type st_txt from statictext within u_vst_search
integer x = 14
integer y = 32
integer width = 379
integer height = 52
integer textsize = -10
integer weight = 400
fontcharset fontcharset = gb2312charset!
fontpitch fontpitch = variable!
string facename = "宋体"
long textcolor = 134217751
long backcolor = 67108864
string text = "精确查询:"
alignment alignment = right!
boolean focusrectangle = false
end type
type cb_1 from commandbutton within u_vst_search
string tag = "检索出所有数据"
integer x = 2075
integer y = 4
integer width = 219
integer height = 96
string text = "所有"
end type
event clicked;call super::clicked;is_condition = ""
event ue_all()
end event
type pb_find from commandbutton within u_vst_search
string tag = "查询"
integer x = 1902
integer y = 4
integer width = 165
integer height = 96
string text = "查询"
end type
event clicked;call super::clicked;
String ls_colname,ls_coldbname,ls_data,ls_datatype,ls_condition,ls_where
Integer li_pos,li_posleft,li_posright
Int li_id,li_ret
If Not IsValid(idw_1) Then
Return
end if
If ddlb_col.Text = 'none' Then
Return
end if
If uf_check() = -1 Then
Return
end if
li_id = Integer(Mid(ddlb_col.Text, 2, pos(ddlb_col.text, ']', 1) - 2))
if is_condtype = 'F' then
//按DW的列名生成过滤条件
ls_ColName = idw_1.Describe("#" + String(li_id) + ".Name")
else
//按表的字段名生成SQL查询条件
ls_ColName = idw_1.Describe("#" + String(li_id) + ".dbName")
end if
ls_datatype = uf_check_datatype(li_id)
ls_condition = uf_explain_condition(ddlb_condition.Text)
ls_data = Trim(sle_xx.Text)
li_PosLeft = Pos(ls_data, "[")
li_PosRight = Pos(ls_data, "]")
If li_PosLeft > 0 And li_PosRight > 0 And li_PosLeft < li_PosRight Then
ls_data = Mid(ls_data, li_PosLeft + 1, li_PosRight - li_PosLeft - 1)
End If
If IsNull(ls_data) or ls_data = '' then
Messagebox("提示","请输入查询条件!")
return
end if
Choose Case ls_datatype
Case 'num'
ls_where = "(" + ls_ColName + ' ' + ls_condition + " " + ls_data + ")"
Case 'str'
If ls_condition = 'like' Or ls_condition = 'not like' Then
If Pos(ddlb_condition.text, "包含") > 0 Then
ls_where = "(" + ls_ColName + ' ' + ls_condition + " '%" + ls_data + "%')"
Else
ls_where = "(" + ls_ColName + ' ' + ls_condition + " '" + ls_data + "%')"
End If
Else
If ls_condition = 'between' Then
li_pos = Pos(ls_data, ",", 1)
ls_where = "(" + ls_colName + ' ' + ls_condition + " '" + &
Trim(Left(ls_data, li_pos - 1)) + "' and '" + &
Trim(Right(ls_data, Len(ls_data) - li_pos)) + "')"
Else
ls_where = "(" + ls_ColName + ' ' + ls_condition + " '" + ls_data + "')"
End If
End If
Case 'date'
If ls_condition = '=' Then
ls_data = string(date(ls_data), "yyyy-mm-dd")
ls_where = "(" + ls_ColName + " >= ('" + ls_data +"') and "+ls_colname +" <= ('" + ls_data + " 23:59:59.9'))"
Else
ls_where = "(" + ls_ColName + ' ' + ls_condition + " '" + ls_data + "')"
End If
End Choose
is_condition = ls_where
event ue_search(ls_where)
end event
type sle_xx from dropdownlistbox within u_vst_search
event key pbm_keydown
integer x = 1339
integer y = 8
integer width = 553
integer height = 544
integer taborder = 10
integer textsize = -9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long textcolor = 33554432
boolean allowedit = true
boolean autohscroll = true
boolean sorted = false
boolean hscrollbar = true
boolean vscrollbar = true
borderstyle borderstyle = stylelowered!
end type
event key;if key = KeyEnter! then
IF Len ( This.Text ) > 0 THEN
pb_find.TriggerEvent ( Clicked! )
This.SelectText ( 1, Len ( This.Text ) )
END IF
end if
end event
event modified;string ls_data
integer li_i
ls_data =this.text
//处理下拉模糊查询
if sle_xx.totalitems( ) > 0 then
if sle_xx.finditem(ls_data,0) < 0 then
for li_i = 1 to upperbound(is_datalist)
if pos(is_datalist[li_i],ls_data) > 0 then
sle_xx.selectitem( li_i )
exit
end if
next
end if
end if
if keydown(keyenter!) then
IF Len ( This.Text ) > 0 THEN
pb_find.TriggerEvent ( Clicked! )
This.SelectText ( 1, Len ( This.Text ) )
END IF
end if
end event
type ddlb_condition from dropdownlistbox within u_vst_search
integer x = 942
integer y = 8
integer width = 393
integer height = 512
integer textsize = -9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long textcolor = 33554432
string text = "none"
boolean sorted = false
boolean vscrollbar = true
borderstyle borderstyle = stylelowered!
end type
type ddlb_col from dropdownlistbox within u_vst_search
integer x = 398
integer y = 8
integer width = 539
integer height = 676
integer textsize = -9
integer weight = 400
fontcharset fontcharset = ansi!
fontpitch fontpitch = variable!
fontfamily fontfamily = swiss!
string facename = "Arial"
long textcolor = 33554432
string text = "none"
boolean sorted = false
boolean vscrollbar = true
borderstyle borderstyle = stylelowered!
end type
event selectionchanged;String ls_datatype, ls_ColName
Integer li_id,li_i
string ls_empty[]
for li_i = sle_xx.totalitems( ) to 1 step -1
sle_xx.deleteitem( li_i )
next
is_datalist = ls_empty
li_id = Integer(Mid(This.Text, 2, Pos(This.Text, ']', 1) - 2))
if li_id = 0 then
ddlb_condition.Reset()
ddlb_condition.AddItem("包含")
ddlb_condition.SelectItem("包含", 1)
return
end if
ls_ColName = idw_1.Describe("#" + String(li_id) + ".Name")
is_CurrentCol = ls_ColName
ls_datatype = uf_check_datatype(li_id)
Choose Case ls_datatype
Case 'num'
If Not IsNumber(sle_xx.text) Then
sle_xx.text = ''
End If
Case 'date'
If Not IsDate(sle_xx.text) Then
sle_xx.text = ''
End If
End Choose
Parent.uf_set_condition(ls_datatype)
ddlb_condition.text = '等于'
String ls_DisplayCol, ls_DataCol
String ls_values, ls_work, ls_pData, ls_dData, ls_data
Long ll_pId, ll_dId, Row, n
//具有DDDW的列的处理
DataWindowChild ldwc_1
If idw_1.GetChild(ls_ColName, ldwc_1) <> -1 Then
If ldwc_1.RowCount() > 0 Then
DataStore lds_1
lds_1 = Create DataStore
lds_1.DataObject = idw_1.Describe(ls_ColName + ".DDDW.Name")
ldwc_1.RowsCopy(1, ldwc_1.RowCount(), Primary!, lds_1, 1, Primary!)
ls_DisplayCol = Trim(idw_1.Describe(ls_ColName + ".DDDW.DisplayColumn"))
ls_DataCol = Trim(idw_1.Describe(ls_ColName + ".DDDW.DataColumn"))
ll_pId = Long(ldwc_1.Describe(ls_DisplayCol + ".Id"))
ll_dId = Long(ldwc_1.Describe(ls_DataCol + ".Id"))
For Row = 1 To ldwc_1.RowCount()
ls_pData = String(lds_1.Object.Data.Primary.Current[Row, ll_pId])
ls_dData = String(lds_1.Object.Data.Primary.Current[Row, ll_dId])
If ls_PData <> "新增..." Then
choose case ls_datatype
case 'num'
ls_data = "[" + string(ls_dData) + "]" + ls_pData
case else
ls_data = "[" + ls_dData + "]" + ls_pData
end choose
sle_xx.AddItem(ls_data)
is_datalist[upperbound(is_datalist) + 1] = ls_data
End If
Next
End If
End If
//具有ddlb的列的处理
n = 1
ls_values = Trim(idw_1.Describe(ls_ColName + ".values"))
If ls_values = "?" Then Return
ls_work = gf_string_xsub(ls_values, "/", 1)
Do While Len(ls_work) > 0
If Pos(ls_work, "~t", 1) > 0 Then
ls_PData = gf_string_xsub(ls_work, "~t", 1)
ls_dData = gf_string_xsub(ls_work, "~t", 2)
If ls_PData <> "新增..." Then
choose case ls_datatype
case 'num'
ls_data = "[" + string(ls_dData) + "]" + ls_pData
case else
ls_data = "[" + ls_dData + "]" + ls_pData
end choose
sle_xx.AddItem(ls_data)
is_datalist[upperbound(is_datalist) + 1] = ls_data
End If
End If
n++
ls_work = gf_string_xsub(ls_values, "/", n)
Loop
end event