如何在数据窗口中添加过滤器

时间:2014-05-01 09:51:46

标签: sybase powerbuilder datawindow

我是电力建设者的新手。我想在数据窗口中添加过滤器。 我创建了一个数据窗口dw_trans,它返回了反转数和量。我想根据反转数添加过滤器。用户只选择特定行将显示的转码。

3 个答案:

答案 0 :(得分:1)

这是一个简单的例子

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()

答案 1 :(得分:1)

您可以通过两种方式进行过滤。 第一路。 将列值视为字符串并将输入作为字符串,并查找相对数字或确切数字。

第二种方式。 你可以有数字类型过滤器。这样您就可以搜索确切的值。但无法搜索相对值。

我将为两者编写示例代码。

我将您的列名称视为cust_num。并使用SingleLineEdit控件输入输入值。那个名字是sle_input。在单击的按钮上写下面的代码,然后按下

第一路。

string ls_input
ls_input = sle_1.text
如果len(trim(ls_imput))= 0那么
  消息框('提醒','请输入要过滤的值')
  返回
结束如果
dw_trans.setfilter(" string(cust_num)喜欢'" + string(ls_input)+"%'")
dw_trans.filter()

第二路。

string ls_input
ls_input = sle_1.text
如果len(trim(ls_imput))= 0那么
  消息框('提醒','请输入要过滤的值')
  返回
结束如果
dw_trans.setfilter(" cust_num =" + string(ls_input))
dw_trans.filter()

powerbuilder有很多很棒的功能。它也可以在输入数字时进行过滤。如果您想了解该代码,请回复我。

感谢
拉吉〜

如果满足此答案,请投票,否则根据您的具体要求添加评论。所以其他有同样问题的人可以快速找到答案。

答案 2 :(得分:1)

您可以非常轻松地执行此操作。在数据窗口的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( )