函數作用:為DataWindow或者DataStore指定數據過濾規則。通常在調用該函數前使用函數Retrieve將數據檢索到客戶端,該函數可以決定檢索到客戶端的這些數據哪些可以顯示,哪些不能顯示。該函數對客戶端的數據進行操作,和后台數據庫沒有任何關系。在設置完過濾規則后使用函數Retrieve檢索數據是不合理的,每次設置過濾規則后都檢索數據,這樣的執行效率很低。需要注意的是,該函數緊緊是設置過濾規則,並不進行過濾。函數Filter是進行過濾的,使用最近設置好的過濾規則對數據進行過濾。
函數語法:integer dwcontrol.SetFilter ( string format )
ldwcontrol:要為其設定過濾規則的DataWindow、DataStore或者下拉子數據窗口控件的名稱;
lformat:作為過濾規則的表達式,該表達式的返回值應該是Boolean類型,或者是True、或者是False。如果表達式返回值為Null,則在執行函數Filter時自動彈出對話框讓用戶指定過濾規則。在表達式中可以使用數據窗口對象函數、列名、列號、數字、字符串等。如果用到了列號,則應該以‘#’開頭、后面緊跟數字來表示。多個條件可以使用邏輯運算符進行聯結,一個非常良好的習慣是每個條件都應該使用括號。這樣既可以保證表達式的清晰,又可以避免一些Bug。后面的代碼實例中會講到。
返 回值:數字類型,1表示執行成功,-1表示執行失敗。該函數的返回值沒有多大意義,很少在程序中使用該返回值。
代碼實例:
例1:使用列名進行過濾。
string ls_filter
ls_filter = "cust_qty > 100 and cust_code >30"
dw_Employee.SetFilter(ls_filter)
dw_Employee.Filter( )
例2:必須使用括號的情況。下面的腳本在邏輯上看起來沒有什么問題:
String ls_filter
ls_filter = “name like ‘張%’ and article_title like ‘%計算機%’”
dw_1.SetFilter()
dw_1.Filter()
實際上,上面的程序是不能正確執行的。將過濾規則作如下改動就可以了:
ls_filter = “(name like ‘張%’) and (article_title like ‘%計算機%’)”
例3:取消過濾規則。下面兩個語句都能實現:
語句1:dw_1.SetFilter(“”)
語句2:dw_1.SetFilter(“1=1”)
例4:下面的語句在運行時可以讓用戶自己指定過濾規則:
String ls_null
SetNull(ls_null)
dw_1.SetFilter(ls_null)
dw_1.Filter()
例5:下面腳本可以判斷數據窗口中是否有主鍵重復的數據。假設數據窗口中的主鍵是dept_id:
string ls_fieldname//主鍵名稱
long ll_rc//數據窗口中總的數據行數
ls_fieldname = "dept_id"
dw_1.SetFilter("1=1")//取消過濾規則,顯示全部的數據
dw_1.Filter()//過濾
ll_rc = dw_1.RowCount()//保存數據行數
dw_1.SetSort(ls_fieldname + " A")//用主鍵進行排序
dw_1.Sort()
//下面語句是核心語句。該過濾規則的含義是:只顯示相鄰行不同的數據。
dw_1.SetFilter(ls_fieldname + " <> " + ls_fieldname + "[-1] or GetRow() =1")
dw_1.Filter()
if dw_1.RowCount() < ll_rc then
MessageBox("提示",ls_fieldname + "列中存在重復的數據!",StopSign!)
end if
注:條件里的列名必須和數據窗口中的列名一致而不是和物理表列名一致,否則會提示表達式錯誤。