資料視窗控制元件的函式Describe()
阿新 • • 發佈:2018-12-20
Describe()
功能:返回資料視窗控制元件結構方面的指定資訊包括DataWindow 物件以及資料視窗
物件中其他物件的屬性取值資料視窗中的每個列每個標題等等都是物件各自都有一
組描述其特徵的屬性參看第6 章資料視窗物件的屬性在Describe()函式的引數
中可以通過字串指定要得到其值的一組屬性該函式將會把它們的值作為一個字串返
回
使用Describe()函式也可以計算表示式的值表示式中可以使用指定行/列的值
語法:dwcontrol.Describe ( propertylist )
引數
propertylist 屬性列表是個字串由要檢視其取值的一個或多個屬性或表
達式組成屬性以及表示式之間使用空格分隔這裡的屬性指資料視窗物件的屬性
返回值String 該函式返回一個字串這個字串由對應於propertylist 中各屬性
的具體取值構成各屬性值之間使用換行字元~n 分隔
如果屬性列表中包含了無效的項比如拼錯了屬性名或寫錯了表示式那麼Describe()
函式在相應項的位置返回一個驚歎號! 並忽略隨後的所有項當某個屬性沒有值時
Describe()函式在相應位置返回一個問號?
如果某個屬性的值是個問號? 那麼Describe()函式將在該項位置返回問號並把
問號放置到引號中通常為單引號 '
如果任何引數的值為NULL 則Describe()函式返回NULL
用法使用Describe()函式可以深入理解資料視窗的結構例如我們可以查到資料
視窗都具備哪些區域也有稱做帶Band 的叫法各列的資料型別是什麼等使用
Describe()函式也能夠得到資料視窗當前的屬性取值之後可以使用資料視窗控制元件Modify()
函式進行所需的修改
應用程式中經常使用Describe()函式得到資料視窗當前的SELECT 語句然後根據需
要進行修改比如增加WHERE 子句修改排序方式等
當開發人員使用資料視窗畫筆以圖形化方式建立資料視窗物件選擇了操作資料庫的
資料來源後實際上就定義了某個SELECT 語句在儲存資料視窗物件時PowerBuilder
儲存的不是標準的SQL SELECT 語句而是以它自己定義格式的SELECT 語句稱做
PBSELECT 語句與資料視窗物件儲存在一起當應用程式使用Describe()函式得到
Table.Select 屬性的值時如果應用程式已經連線到資料庫上那麼Describe()函式返回SQL
SELECT 語句如果應用程式尚未連線到資料庫上那麼Describe()函式返回PBSELECT
語句
在Describe()函式的引數中引用資料視窗物件屬性的一般語法為
objectname.property
有關資料視窗屬性表示式的詳細介紹請參閱第6 章資料視窗物件屬性的訪問方法
節
對資料視窗的某些屬性來說Describe()函式將返回一組值每個值之間使用Tab 字元
~t 分隔例如下面的Describe()語句將返回指定資料視窗當前使用的所有帶Band
的帶名
BandsName=dw_1.Describe( "DataWindow.Bands ")
帶名之間使用Tab 字元~t 分隔具有下述的形式資料視窗不同使用的帶也略
有區別
header~tdetail~tsummary~tfooter
當應用程式要檢視某個列的屬性時可以使用列名也可以使用列號使用列號時
在列號前放上#號例如Name 是某個資料視窗的第2 列那麼語句
Name=dw_1.Describe( "Name.coltype ")
與
Name=dw_1.Describe( "#2.coltype ")
等價
當我們使用資料視窗畫筆建立資料視窗物件時系統自動為列物件和列的標題物件命
名列物件的名稱通常與資料庫中相應列的名稱相同計算列的名稱採用Compute_####
表示其中####是四個數字列標題的名稱由列物件名加上_t 構成比如資料庫某個表
中有個名稱為salary 的列當資料視窗物件中包含該列時這個列物件的名稱為salary
相應列標題的名稱為salary_t
下面介紹一下使用Describe()函式計算表示式的方法
可以把Evaluate()函式作為Describe()函式的引數來計算資料視窗畫筆表示式的值
Evaluate()函式的語法格式為
Evaluate ( 'expression ', rownumber )
這裡expression 是希望計算其值的資料視窗畫筆表示式rownumber 是資料行的行號
畫筆表示式根據該行的資料計算其值在畫筆表示式中可以使用資料視窗畫筆函式有關
資料視窗畫筆函式的詳細介紹請參閱第6 章資料視窗畫筆函式節例如下面的語句
根據資料視窗第3 行salary 列的值返回255 或0
ls_ret = dw_1.Describe( "Evaluate( 'If(salary > 100000, 255, 0) ', 3) ")
一般來說我們使用資料視窗控制元件函式來得到資料視窗中資料值但是有些資料窗
口畫筆函式例如LookUpDisplay()函式不能在程式碼中直接呼叫此時在Describe()函
數中利用Evaluate()函式進行計算就成為唯一的選擇
示例1
兩個列名稱分別為emp 和empname 相應列標題物件的名稱分別為emp_h 和empname_h
另外state 不是該資料視窗中的一個物件使用該選擇的目的是為了演示Describe()函式
對不正確屬性設定的處理程式執行下述程式碼後
string ls_request, ls_report
ls_request = "DataWindow.Bands DataWindow.Objects "&
+ "empname_h.Text " &
+ "empname_h.Type emp.Type emp.Coltype " &
+ "state.Type empname.Type empname_h.Visible "
ls_report = dw_1.Describe(ls_request)
變數ls_report 的值為
header~tdetail~tsummary~tfooter~Nemp~tempname~temp_h~tempname_h~N
"Employee~R~NName "cd~N text~N column~Nchar(20)~N!
結果中驚歎號的出現表示Describe()的引數中出現的錯誤的項即原本沒有的state 列
示例2
列的資料型別
string ls_data_type
integer li_rate
ls_data_type = dw_1.Describe( "salary.ColType ")
IF ls_data_type = "number " THEN
li_rate = dw_1.GetItemNumber(5, "salary ")
ELSE
. . . // 其他處理
END IF
示例3 下面的語句利用列名得到當前列的資料型別這段程式碼要在資料視窗控制元件的
事件處理程式中使用在其他地方使用時需要把This 替換為實際的資料視窗控制元件名
s = This.Describe(This.GetColumnName()+ ".ColType ")
示例4 下面的程式碼段是資料視窗控制元件ScrollVertical 事件的事件處理程式的一部分
該程式碼段的功能是當用戶滾動資料視窗不管是按箭頭鍵還是移動滾動條進行滾動時
把資料視窗中第一個可見行設定為當前行
s = This.Describe( "DataWindow.FirstRowOnPage ") //得到第一個可見行的行號
IF IsNumber(s) THEN This.SetRow(Integer(s)) //設定為當前行.
示例5 下面的程式碼使用了Describe()的Evaluate()函式其功能是得到state_code 列的
顯示值該列使用了下拉資料視窗DropDownDataWindow 編輯風格這段程式碼應該在
發生過ItemChanged 事件後執行這樣使用者所選值已經被放入了相應的緩衝區為了安全
下面的程式碼放置在名稱為getdisplayvalue 的資料視窗使用者自定義事件中
string rownumber, displayvalue
rownumber = String(dw_1.GetRow())
displayvalue = dw_1.Describe( &
"Evaluate( 'LookUpDisplay(state_code) ', " &
+ rownumber + ") ")
在資料視窗的ItemChanged 事件中可以編寫下述程式碼來郵寄使用者自定義事件
getdisplayvalue
dw_1.PostEvent( "getdisplayvalue ")
示例6 下面的程式碼是某個資料視窗控制元件ItemError 事件處理程式的一部分其功能是
把當前出錯的資料項的值置為空除String 型別的列外其他型別的列不能置為空字串
那樣將產生資料型別不匹配的錯誤程式碼中Data 和row 是ItemError 事件的引數
string s
s = This.Describe(This.GetColumnName() + ".Coltype ")
CHOOSE CASE s
CASE "number "
IF Trim(data) = " " THEN
integer null_num
SetNull(null_num)
This.SetItem(row, This.GetColumn(), null_num)
RETURN 3
END IF
CASE "date "
IF Trim(data) = " " THEN
date null_date
SetNull(null_date)
This.SetItem(row, This.GetColumn(), null_date)
RETURN 3
END IF
. . . // 您可以自行增加對其他資料型別的處理
END CHOOSE