Describe()
功能:返回資料視窗控制項結構方面的指定資訊包括DataWindow 對象以及資料視窗
對象中其他對象的屬性取值資料視窗中的每個列每個標題等等都是對象各自都有一
組描述其特徵的屬性參看第6 章資料視窗對象的屬性在Describe()函數的參數
中可以通過字串指定要得到其值的一組屬性該函數將會把它們的值作為一個字串返
回
使用Describe()函數也可以計算運算式的值運算式中可以使用指定行/列的值
文法:dwcontrol.Describe ( propertylist )
參數:dwcontrol 資料視窗控制項名
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()Function Compute運算式的方法
可以把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 假設有個名字為dw_emp 的資料視窗控制項該控制項關聯的資料視窗對象中由
兩個列名稱分別為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 下面的語句在調用GetItemNumber()函數得到salary 列的值之前首先檢查該
列的資料類型
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