我是电力建设者的新手。我正在尝试在数据窗口中添加过滤器。我创建了一个数据窗口 dw_trans,它返回 trans 编号和金额。我想根据反号添加过滤器。用户仅选择特定行将显示的 trans 编号。
3 回答
您可以通过两种方式进行过滤。第一种方式。将列值视为字符串并将输入视为字符串,并找到相对数或确切数。
第二种方式。您可以使用数字类型过滤器。以便您可以搜索确切的值。但无法搜索相对值。
我将为两者编写示例代码。
我正在考虑将您的列名作为 cust_num。并具有用于输入输入值的 SingleLineEdit 控件。该名称是 sle_input。在按钮单击的事件上编写以下代码。代码如下
第一种方式。
string ls_input
ls_input=sle_1.text
If len(trim(ls_imput)) =0 Then
Messagebox('Alert','Please Enter The value to filter')
Return
End if
dw_trans.setfilter("string(cust_num) like '"+string (ls_input)+"%'")
dw_trans.filter()
第二种方式。
string ls_input
ls_input=sle_1.text
If len(trim(ls_imput)) =0 Then
Messagebox('Alert','Please Enter The value to filter')
Return
End if
dw_trans.setfilter("cust_num = "+string(ls_input))
dw_trans.filter()
powerbuilder 中有许多很棒的功能。它也可以在输入数字时进行过滤。如果您想了解该代码,请回复我。
谢谢拉杰
~
如果对此答案满意,请投票,否则为您的具体要求添加评论。以便其他有相同问题的人可以快速找到答案。
这是一个简单的例子
integer li_rc
long ll_rows, ll_filteredrows, ll_trans_id
string ls_filter, ls_original_filter
// in case you need original filter value
ls_original_filter = dw_trans.describe("Datawindow.Table.Filter")
// create the filter as a string using the dw column name
// ll_trans_id set somewhere else in code (user input or whatever)
ls_filter = 'trans_no = ' + string(ll_trans_id)
//li_rc will be -1 if an error occurs
li_rc = dw_trans.setfilter(ls_filter)
//ll_rows will be number of rows left after filtering
ll_rows = dw_trans.filter()
// # of rows filtered out by current filter
ll_filteredrows = dw_trans.filteredcount()
// remove a filter
dw_trans.setfilter('')
dw_trans.filter()
//set back original filter
IF POS(ls_original_filter,'~"') > 0 THEN
// get rid of tilde doublequote since it is an invalid expression when we try to re-apply the filter
ls_original_filter = replace(ls_original_filter,Pos(ls_original_filter,'~"') - 1, 2, "'")
// do twice since if there is one there will be two
ls_original_filter = replace(ls_original_filter,Pos(ls_original_filter,'~"') - 1, 2, "'")
END IF
li_rc = dw_trans.setfilter(ls_original_filter)
ll_rows = dw_trans.filter()
你可以很容易地做到这一点。在clicked()
你的数据窗口事件上试试这个 - 它会将所有数据从选择中过滤到数据窗口中。
integer li_colnbr, li_row
string ls_colname, ls_value, ls_filter, ls_type
if row = 0 then return //don't do nothing
ls_colname = dwo.name
li_row = row
li_colnbr = integer(this.describe(ls_colname + ".id")) //find the name of the column
if li_colnbr = 0 then
this.setredraw(true)
return
end if
ls_value = string(this.object.data[li_row, li_colnbr]) //get the value of the cell / item
if isnull(ls_value) then
ls_filter = "isnull(" + ls_colname + ")"
else
ls_type = lower(left(this.describe(ls_colname + ".coltype"), 5)) //get the type of the column
choose case ls_type
//creating the final filter
case "decimal", "number", "long", "ulong", "real" //search into the help for all coltypes
ls_filter = ls_colname + " = " + ls_value
case else
ls_filter = "string(" + ls_colname + ") = ~"" + ls_value + "~""
end choose
end if
this.setfilter(ls_filter) //setting the filter
this.filter()
this.sort() //done !
如果您想再次查看检索到的原始数据,只需在rbuttondown()
事件中添加以下内容:
this.setfilter('') //back to original filter
this.filter( )
this.sort( )