私はパワービルダーの初心者です。データ ウィンドウにフィルターを追加しようとしています。トランス数と量を返すデータ ウィンドウ dw_trans を作成しました。トランス数に基づいてフィルターを追加したい。ユーザーは、特定の行が表示されるトランス番号のみを選択します。
3 に答える
これは非常に簡単に行うことができます。データウィンドウの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( )
2 つの方法でフィルターを使用できます。第 1 の方法。列の値を文字列と見なし、入力を文字列として取得し、相対数または正確な数を見つけます。
2番目の方法。数値型フィルターを使用できます。正確な値を検索できるようにします。しかし、相対値を検索することはできません。
両方のサンプルコードを書きます。
列名を cust_num と考えています。入力値を入力するための SingleLineEdit コントロールがあります。その名前は sle_input です。ボタンがクリックされたイベントに次のコードを記述します。
第 1 の方法。
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()