PB動態數據窗口

〓創建動態數據窗口
若要動態創建數據窗口,需要使用函數Create,該函數的語法如下:
dw_1.Create(syntax{,errorbuffer})
其中,dw_1是數據窗口控件的名稱,該數據窗口控件要和新創建的數據窗口對象相關聯。syntax是用來描述創建數據窗口對象的確切語法的字符串。errorburrer是可選項,用來保存創建數據窗口對象過程中發生的錯誤信息。如果不指定該參數,就會在發生錯誤時顯示一個錯誤信息的提示窗口。如果創建成功該函數返回1,否則返回-1,如果參數爲null則函數返回null。
由於Create函數成功創建數據窗口對象後,要改變dw_1數據窗口控件所關聯的數據窗口對象,因此,需要重新爲數據窗口設置事務對象(使用函數SetTransObject或者SetTrans)。
獲取創建數據窗口的語法有多種方法,可以對相關的SQL語句使用SyntaxFromSQL函數,也可以使用對已經創建好的數據窗口對象使用LibraryExport函數。因爲創建數據窗口的語法比較複雜,即使使用了LibraryExport輸出已有數據窗口對象的語法,操作起來也相當費勁。所以,更爲通用的是前面一種方法。這種方法配合一定的編程技巧,讓用戶指定要創建
的數據窗口對象的SQL語句,使用戶有更多的自由和選擇。使用這種方法,肯定用到函數
SyntaxFromSQL,它的語法是:
transaction.SyntaxFromSQL(SQLselect,presetation,err)
其中,transaction是事務對象的名稱,該事務對象必須正確地設置了相關參數,並且和數據庫建立了聯結。SQLselect是用來創建數據窗口的SQL語句,爲String類型。presentation是要創建的數據窗口對象的顯示風格,爲String類型。簡單的格式是:
Style(Type=presentationstyle)
其中Style和Type都是保留字,presentationstyle的取值有Tabular,Grid,Form,Graph,Group,Label和Nup,其中Tabular是缺省類型。err是用來保存函數執行時出錯信息的string類型的變量。
*關於函數SyntaxFromSQL的參數presentation可以有更復雜的語法。其格式是:
"Style ( Type=value property=value ... )
DataWindow ( property=value ... )
Column ( property=value ... )
Group groupby_colnum1 Fby_colnum2 ... property ... )
Text property=value ... )
Title ( 'titlestring' )"
使用這樣的格式,可以詳細定義要創建的數據窗口對象的外觀。


〓在很多情況下都需要一個數據窗口控件和不同的數據窗口對象關聯。可以通過修改數據窗口控件的dataobject屬性來實現。在修改了這一特性之後,數據窗口控件就不再具有與它相關的事務處理對象了,應該再重新爲數據窗口設置事務對象。*如果爲數據窗口設置了行焦點標誌,在修改了dataobject屬性後應該重新設置行焦點標誌。


〓獲得數據窗口的SQL語句
有時需要修改數據窗口對應的SQL語句,以便構造查詢應用。這時,首先就要讀取數據窗口當前的SQL語句,然後再對where子句進行修改。可以有多種方法獲取SQL語句。最常用的是使用函數GetSQLSelect,它的語法如下:
dw_1.GetSQLSelect()
其中,dw_1是數據窗口控件的名稱,可以是子數據窗口或datastore等。函數執行正確則返回對應的SQL語句,否則返回空字符串("")。
另外,還可以使用Describe函數描述數據窗口對象的相關屬性來獲得。在使用該函數時,如果數據宙口聯結到數據庫則返回真正的SQL語句,否則返回數據窗口的PBselect語句。PBselect語句是數據窗口的專用語法,和SQL語句有很大的區別,但也是從SQL語句轉化而來的。數據窗口對象有三個屬性用來保存SQL語句,它們是的table.select、table.SQLselect、table.select.attribute。這些屬性獲得的SQL語法稍微有區別。下面是獲取一個數據窗口SQL語法的不同的語句:
string ls_sql
ls_sql = dw_1.GetSQLSelect()
ls_sql = dw_1.Describe("datawindow.table.select")
ls_sql = dw_1.describe("datawindow.table.SQLselect")
ls_sql = dw_1.describe("datawindow.table.select.attribute")


〓修改數據窗口的SQL語句
使用上面介紹的方法獲得SQL後,可以進行修改加工,然後重新應用於數據窗口對象。使用這種方法可以創建功能比較強大的查詢程序。
和提取語法一樣,也有兩種修改SQL的方法:使用函數Modify或者SetSQLSelect。不管使用哪種方法,修改完SQL語句後都要重新設置事務對象。比較常用的是後一種函數,它的語法是:
dw_1.SetSQLSelect(statement)
其中,dw_1是要重新設置SQL語句的數據窗口控件名稱,可以是子數據窗口或者datastore。statement是一個包含合法SQL語句的字符串。該函數正確執行返回1,否則返回-1。另外,對於新的SQL語句有很多需要注意的地方:
(1)字段的類型和個數必須和原SQL語句相同;
(2)原來的SQL語句中定義了檢索變量時,就不能重新設置SQL語句。
如果原來的數據窗口可以修改數據庫中的數據表,那麼重新設置時,PowerBuilder把和原來主鍵位置相同的字段仍然作爲新的主鍵。如果碰到了下面的兩種情況,則將使數據窗口無法更新:
a)from於句中包含多個數據表名;
b)數據窗口可以更新的是數據庫的計算列。
使用相應的Modify函數和相應的語法也可以修改數據窗口的SQL。例如:
dw_1.modify("datawindow.table.select=~"select name,sex,from addresswhere sex='男'~"")
也可以直接使用語法來修改數據窗口的SQL語句。例如,上面的語句可以改寫成:
dw_1.datawindow.table.select="select name,sex,from address where sex='男'"
然而這種方法無法驗證SQL語句是否正確,不如使用Modify函數,但是上面這種方法的執行速度比較快,如果能夠確保準確無誤,這種方法還是可以考慮的。可以看出它的語法和上面的相同。
這裏的技巧是,如果在運行時需要對數據窗口的SQL語句進行修改,創建沒有where子句的數據窗口比較好些。因爲where子句可以在動態修改時添加,sort可以在運行時使用setsort函數實現。這樣,程序運行時處理數據窗口的SQL語句就比較方便。
下面介紹一個在程序運行時動態修改數據窗口的SQL語句的實例。在該例子中,使用數據窗口控件函數ModIfy可以修改數據窗口對象中的控件的屬性。腳本如下:
String ls_SQL,ls_where,ls_select
ls_SQL = dw_1.Describe("DataWindow.table.select") //獲取數據窗口當前的SQL語句
If Pos(ls_SQL,"where") > 0 Then //如果有where子句(有可能是運行時添加的)
ls_select = Left(ls_SQL,pos(ls_SQL,"where") - 1) //取where前面的內容
Else
ls_select = ls_SQL //如果沒有where子句則直接賦值
End If
ls_where = " where xm like '郭%' order by xm"//where子句。可以設計界面讓用戶構造
ls_SQL = ls_select + ls_where //添加where子句
If dw_1.SetSQLSelect(ls_SQL) = 1 Then
dw_1.Retrieve()
End If
在上面的例子中,where條件都是固定的。也可以設計界面,讓用戶指定條件來查詢數據。該腳本可以編寫成一個函數,將where子句作爲參數,將是否成功設置SQL作爲返回值,在用戶每次指定查詢條件進行檢索時調用該函數。


〓其他

*GetFileOpenName(title,pathname,filename{,extension{,filter}})
功能:Displays the system's Open Filedialog and allows the user to select a file or enter a filename.(打開選擇文件對話框)
--具體請見PB幫助

*LibraryDirectory ( libraryname, objecttype )
功能:Obtains a list of the objects in aPowerBuilder library.(獲得PBL中的對象)
--具體請見PB幫助

*long dwcontrol.ImportString ( string string {, long startrow {, longendrow {,long startcolumn {, long endcolumn {, long dwstartcolumn } } } } } )
功能:Inserts data into a DataWindowcontrol or DataStore from tab-delimited data in a string.(把字符串數據插入到數據窗口中)
--具體請見PB幫助

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章