摘要:數(shù)據(jù)窗口對象及其所有實體(如列、文本、圖形、圖像等)都有一組屬性值。本文主要介紹了如何編寫代碼查看和修改這些屬性,以達到在程序運行過程中動態(tài)修改數(shù)據(jù)窗口的數(shù)據(jù)源和外觀界面的目的。
關(guān)鍵詞:PowerBuilder;數(shù)據(jù)窗口;getsqlselect函數(shù);describe函數(shù);modify函數(shù)
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)19-30063-02
How to Script about Datawindow in Languages of PowerBuilder
QIN Fei-zhou
(College of Physic Electronic Information, Ningxia University, Yinchuan 750021, China)
Abstract: Each column and graphic object in the DataWindow has a set of properties, which are listed in the DataWindow Reference. You specify one or more properties as a string and Describe returns the values of the properties.
Key words: PowerBuilder; DataWindow; Function of getsqlselect; describe and modify
數(shù)據(jù)庫類應用系統(tǒng)的開發(fā),主要目的是組織處理數(shù)據(jù)。而數(shù)據(jù)窗口對象是PowerBuilder提供給開發(fā)人員一個操作數(shù)據(jù)的強有力的工具,也是PowerBuilder與其他面向?qū)ο蟮臄?shù)據(jù)庫應用前端開發(fā)工具的最主要的區(qū)別之一。通過數(shù)據(jù)窗口控件,開發(fā)人員可以查詢并修改數(shù)據(jù)、改變數(shù)據(jù)的表現(xiàn)形式、處理錯誤及共享數(shù)據(jù)等。
數(shù)據(jù)庫窗口對象是用于查詢、顯示和維護來自關(guān)系型數(shù)據(jù)庫或其他數(shù)據(jù)源(如Excel或dBASE文件)數(shù)據(jù)的對象。在數(shù)據(jù)窗口對象中可以定義數(shù)據(jù)的顯示格式、顯示風格和其他數(shù)據(jù)屬性,使數(shù)據(jù)對用戶更加直觀和更有意義。開發(fā)人員可以通過定義數(shù)據(jù)窗口對象來指定數(shù)據(jù)源、表現(xiàn)風格以及其他數(shù)據(jù)屬性,但利用編程對數(shù)據(jù)窗口進行修改則更應該是開發(fā)者所必需掌握的技術(shù)。下面將主要介紹幾種關(guān)于數(shù)據(jù)窗口的編程方法。
1 動態(tài)修改數(shù)據(jù)窗口對象的數(shù)據(jù)源
當我們建立一個數(shù)據(jù)窗口時必須確定其數(shù)據(jù)源,一旦這個數(shù)據(jù)窗口建立完畢后,它的數(shù)據(jù)源也就確定了。如果想改變改變數(shù)據(jù)源,可用以下兩種方法實現(xiàn)。
方法1:
string d_name
dw_1.dataobject=d_name
dw_1.settransobject(sqlca);
這段代碼可以動態(tài)地修改數(shù)據(jù)窗口控件dw_1所關(guān)聯(lián)的數(shù)據(jù)窗口對象。數(shù)據(jù)窗口對象的名稱放在字符串變量d_name中,數(shù)據(jù)窗口控件dw_1所關(guān)聯(lián)的數(shù)據(jù)窗口對象隨變量d_name的變化而變。
方法2:
string OldSyn, NewSyn
//獲取與數(shù)據(jù)窗口dw_emp相關(guān)的SQL SELECT語句
OldSyn = dw_emp.GetSQLSelect()
//指定新的SQL SELECT語句
NewSyn = 'SELECT employee.EMP_Name FROM employee WHERE salary < 100000'
IF dw_emp.Retrieve() = 0 THEN
dw_emp.SetSQLSelect(NewSyn) //為dw_emp設(shè)置新的SQL SELECT語句
dw_emp.Retrieve()
END IF
用上述方法可以為數(shù)據(jù)窗口改變SQL SELECT語句。這兩個方法都可以改變數(shù)據(jù)窗口的數(shù)據(jù)源,方法一的代價是需要作多個數(shù)據(jù)窗口,方法二的適用范圍是用戶對數(shù)據(jù)進行隱蔽操作。開發(fā)人員可根據(jù)實際需要進行選擇使用。
2 修改數(shù)據(jù)窗口所包含對象的屬性
數(shù)據(jù)窗口對象屬性主要用來存儲控制數(shù)據(jù)窗口對象行為的有關(guān)信息。開發(fā)人員通過修改這些內(nèi)容可以給用戶提供一個外形動態(tài)變化的數(shù)據(jù)窗口,而無須做多個類似的數(shù)據(jù)窗口。這里所講的屬性不是數(shù)據(jù)窗口控件的屬性,而是在數(shù)據(jù)窗口控件中所顯示的對象(如column、text)的屬性。在數(shù)據(jù)窗口畫板中可以確定數(shù)據(jù)窗口對象屬性,也在程序代碼中修改對象的屬性值。
2.1 獲得對象的屬性表達式
Describ函數(shù)主要是用于獲取數(shù)據(jù)窗口對象或非數(shù)據(jù)窗口對象中的對象屬性。數(shù)據(jù)窗口中的每個對象(如column、text)都有一個屬性集。將一個或多個屬性可設(shè)定成一個字符串,Describe返回這個字符串的內(nèi)容。屬性列表中屬性的格式:對象名稱.屬性。參看以下例子:
string data_type
int data_value
//返回數(shù)據(jù)窗口dw_1的列對象salary的數(shù)據(jù)類型
data_type=dw_1.describe(\"salary.coltype\")
//如果列對象salary的數(shù)據(jù)類型是number(數(shù)值型)
if data_type=\"number\" then
//將第一行salary列的值復制到變量data_value
data_value=dw_1.getitemnumber(1,\"salary\")
end if
如果對象是列,可指定列名或指定以'#'開始的列號,數(shù)據(jù)窗口畫板可自動給出列的名字和列的標識。下面兩條語句功能相同,都是獲取當前列的數(shù)據(jù)類型。
String s,t
s=this.describe('#' +string(this.getcolumn())+'.coltype')
t=this.describe(this.getcolumnname()+'.coltype')
2.2 Modify函數(shù)的使用
Modify函數(shù)用于修改一個數(shù)據(jù)窗口對象的屬性值,通過修改屬性值,通過說明可以修改數(shù)據(jù)窗口對象的外觀、行為和數(shù)據(jù)源信息,還可為數(shù)據(jù)窗口增加或移走對象。Modify函數(shù)一般用于下列內(nèi)容的修改:
1)修改顏色、設(shè)置字體、對象的其他外觀屬性。
2)在數(shù)據(jù)窗口中修改不同表的update狀態(tài),可以同時修改多個表。
3)修改數(shù)據(jù)窗口對象的SELECT 和WHERE子句。
4)調(diào)整Query 模式或Prompt For Criteria,使用戶可以規(guī)定所需要的數(shù)據(jù)。
5)修改Retrieve Only As Needed的狀態(tài)。
6)修改數(shù)據(jù)窗口的數(shù)據(jù)源
7)控制Print Preview的顯示。
8)在數(shù)據(jù)窗口中增加和刪除對象(如lines 或bitmaps)
PowerBuilder包含了許多修改數(shù)據(jù)窗口屬性的函數(shù)。在使用Modify之前,必須檢查用于對象的控件上的數(shù)據(jù)窗口的函數(shù)列表,確保產(chǎn)生修改的函數(shù)是存在的。
例:數(shù)據(jù)窗口對象關(guān)聯(lián)了department和empolyee兩個表,修改department表時,沒有設(shè)置狀態(tài)標志,隨后employee表被修改。如果所有有修改都成功,update命令設(shè)置標志位,并使用commit命令提交這個修改。
integer rc
string err
// 修改department,如同在數(shù)據(jù)窗口畫板中一樣
rc = dw_1.Update(TRUE, FALSE) //
IF rc = 1 THEN //如果表department已被更新成功
//禁止表department的列新
dw_1.Modify(\"department_dept_name.Update = No\")
dw_1.Modify(\"department_dept_id.Update = No\")
dw_1.Modify(\"department_dept_id.Key = No\")
// 使employee表成為可更新的
dw_1.Modify(\"DataWindow.Table.UpdateTable = ~\"employee~\"\")
//返回對表employee列的修改
dw_1.Modify(\"employee_emp_id.Update = Yes\")
dw_1.Modify(\"employee_emp_fname.Update = Yes\")
dw_1.Modify(\"employee_emp_lname.Update = Yes\")
dw_1.Modify(\"employee_emp_id.Key = Yes\")
//更新表employee
rc = dw_1.Update()
IF rc = 1 THEN //兩個表都更新成功
COMMIT USING SQLCA;
ELSE
ROLLBACK USING SQLCA; // 表employee更新失敗
MessageBox(\"提示信息\",\"表employee更新失?。")
END IF
ELSE//表department更新失敗
ROLLBACK USING SQLCA;
MessageBox(\"提示信息\",\"表department更新失?。")
END IF
參考文獻:
[1]王姍,薩師煊. 數(shù)據(jù)庫系統(tǒng)概論[M]. 4版. 高等教育出版社,2006.
[2]高守傳,劉小靜. 使用嵌入式SQL訪問數(shù)據(jù)庫[J]. 電腦編程技巧與維護,2007(2).
[3]吳飛,王昕. 嵌入式移動數(shù)據(jù)庫SQL SERVER for Windows CE的應用[J]. 微計算機信息,2006(7).
[4]張繼德,史寶英. PowerBulider大型結(jié)果集的處理[J]. 電腦知識與技術(shù),2006(11).
[5]崔巍. PowerBuilder7.0應用技術(shù)[M]. 清華大學出版社,2000.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文