數據窗口控件是應用程序在窗口中展現數據窗口對象的惟一途徑,數據窗口控件與數據窗口對象的結合構成了應用程序訪問和操做數據庫數據的主要手段。數據庫
數據窗口在處理數據時頗有特點,它在客戶機的本地內存中開闢了四個緩衝區:主緩衝區、刪除緩衝區、過濾緩衝區、原始緩衝區,從數據庫中檢索到數據後,數據窗口根據不一樣狀況把數據放置到不一樣的緩衝區。四個緩衝區各司其職,協做完成數據的增刪改,最後把結果提交給數據庫管理系統。編程
數據窗口的屬性、事件和函數是靈活運用數據窗口的基礎,也是數據窗口的博大精深之所在。事實上,只要有足夠的代碼(不考慮效率的話),數據窗口可以完成任何功能。函數
10.1 創建數據窗口控件與數據窗口對象的鏈接工具
在數據窗口畫板中定義一個數據窗口對象後,要把數據窗口控件放置在窗口中才能利用它來處理數據。數據窗口控件是標準的PowerBuilder控件,能夠像使用其它控件同樣使用它,既用戶先要在窗口中添加一個數據窗口控件,而後將在數據窗口畫板中建立的數據窗口對象與這個數據窗口控件鏈接起來,以下圖:ui
數據窗口對象與數據窗口控件的鏈接this
1、運用數據窗口的通常步驟編碼
1. 1. 使用數據窗口畫板建立數據窗口對象;指針
2. 2. 在窗口上放置數據窗口控件;orm
3. 3. 經過屬性設置或編碼將數據窗口控件與數據窗口對象聯繫起來;對象
4. 4. 設置數據窗口控件的屬性,以控制它的外觀和行爲;
5. 5. 若是應用程序還沒有與數據庫創建鏈接,那麼在某個事件處理程序中使用CONNECT語句與數據庫創建鏈接;
6. 6. 將數據窗口控件與事務對象聯繫起來(使用數據窗口控件的對象函數SetTransObject ( )或SetTrans ( ));
7. 7. 使用數據窗口控件的對象函數Retrieve ( )把數據庫中的數據裝入數據窗口中;
8. 8. 針對具體應用,編寫某些數據窗口控件事件的事件處理程序,響應用戶的操做;
9. 9. 須要時使用數據窗口控件的對象函數Update ( )保存用戶對數據的修改。
2、放置數據窗口控件
經過數據窗口控件運用數據窗口對象是數據窗口的最多見用法。數據窗口控件能夠放置到窗口上,也能夠放置到定製可視用戶對象中,它們的處理方法都是一致的。
在窗口上放置數據窗口控件步驟爲:
1. 1. 單擊畫板欄上的窗口畫板,打開要放置數據窗口控件的窗口;
2. 2. 單擊窗口畫板工具欄圖標上的箭頭,打開控件圖標列表,從中選擇數據窗口控件圖標
3. 3. 單擊窗口上想放置數據窗口控件的地方,此處即出現一個空白的方框,該方框就是數據窗口控件;
4. 4. 根據須要移動數據窗口控件的位置和改變它的大小。
3、鏈接數據窗口控件與對象
窗口上放置了數據窗口控件後,還須要將數據窗口對象與它結合起來才能發揮數據窗口控件的做用,其結合方法爲:
1.雙擊放置在窗口上的數據窗口控件,或右擊數據窗口控件並從彈出菜單中選擇「Properties」菜單項;
2. 系統顯示「DataWindow」屬性對話框;
3. 在「General」選項卡中,「DataWindow Object Name」編輯框用於指定與數據窗口控件相關聯的數據窗口對象,在該編輯框中能夠直接鍵入數據窗口對象的名字,不過更經常使用的方法是單擊「Browse…」按鈕,系統顯示以下圖所示的「Select Object」對話框;
4.在該對話框底部的「Application Libraries」列表框中單擊包含要選擇數據窗口對象的應用庫;
5.經過單擊在中部列表框中選擇數據窗口對象,此時該對象的名稱出如今頂部的編輯框中、相應數據窗口對象的註釋顯示在「Comments」中(固然,直接在編輯框中鍵入數據窗口對象名也能夠);
6.單擊「OK」按鈕返回屬性對話框;
7. 在屬性對話框中單擊「OK」按鈕,咱們就把數據窗口對象與數據窗口控件結合了起來。
4、動態更換數據窗口對象
數據窗口控件與數據窗口對象的關聯是經過給數據窗口控件的dataobject屬性賦值實現的,dataobject屬性的數據類型爲字符串(String)。程序中經過給dataobject屬性賦不一樣的值而讓數據窗口控件關聯不一樣的數據窗口對象,這個值就是數據窗口對象的名稱。
例如,將數據窗口控件dw_1關聯的數據窗口對象換成名爲d_graph,在按鈕程序中寫上下述語句:
//清除數據窗口控件dw_1數據窗口中的全部數據。
dw_1.reset( )
//將數據窗口控件dw_1關聯的數據窗口對象換成名爲d_graph dw_1.dataobject="d_graph"
//讓數據窗口控件d_graph使用系統缺省的事務對象SQLCA
dw_1.settransobject(SQLCA)
//讓數據窗口控件d_graph從數據庫中提取數據。
dw_1.retrieve( )
10.2 數據窗口控件與數據庫
在窗口畫板中,把一個數據窗口對象與一個數據窗口控件鏈接後,若是預覽該數據窗口,數據窗口會顯示一個沒有數據的數據窗口控件。應用程序是經過數據窗口控件與數據窗口對象交互的,若是要想在數據窗口控件中顯示數據,必須把定義數據窗口對象的數據源鏈接到數據窗口控件中,也就是說要建立應用程序與數據庫的鏈接。
一個應用程序要建立與數據庫的鏈接需完成如下步驟:
⑴將事務對象(Transaction Object)設置爲相應的值;
⑵與數據庫鏈接;
⑶爲數據窗口控件設置事務對象;
⑷進行數據庫處理;
⑸斷開與數據庫的鏈接。
1、與數據庫創建鏈接
應用程序與數據庫的鏈接經過事務對象來完成,在創建鏈接前須要首先給事務對象的相關屬性賦值,而後用嵌入式SQL語句CONNECT創建鏈接。
若是應用程序只訪問一個數據庫,那麼使用PowerBuilder的缺省事務對象SQLCA也就能夠了。SQLCA是個全局對象,在應用程序的任何地方均可以訪問。下面是使用SQLCA與ODBC數據源創建鏈接的簡單示例:
//設置事務對象屬性
// Profile stock
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=stock;UID=sa;PWD='"
//與數據庫鏈接
CONNECT USING SQLCA;
//檢查鏈接是否成功
If SQLCA.SQLCode<0 Then
MessageBox("鏈接失敗",SQLCA.SQLErrText,Exclamation!)
End If
2、爲數據窗口控件分配事務對象
在使用數據窗口控件檢索數據前,必須通知數據窗口使用哪一個事務對象來操做數據庫(實際上也就是告訴數據窗口從哪一個數據庫中檢索數據)。
要完成這個任務,可使用數據窗口控件的對象函數SetTransObject()。
其語法格式爲: dwcontrol.SetTransObject (事務對象名)
其中:dwcontrol是數據窗口控件的名稱;
transaction:是事務對象名。
SetTransObject( )函數執行成功時返回1,失敗時返回-1。經過該函數的返回值,應用程序可以知道SetTransObject()函數的執行狀況。
例如:把數據窗口控件dw_1與鏈接數據庫的事務對象SQLCA聯繫在一塊兒。dw_1.SetTransObject (SQLCA)
注:通常來講,咱們在數據窗口控件所在窗口的Open事件中執行SetTransObject()函數
3、檢索數據
數據窗口控件與事務對象創建聯繫以後,咱們已經在二者之間架起了一座橋樑,可是,數據還在數據庫中,如今須要調用數據窗口控件的對象函數Retrieve()把數據裝入數據窗口中。
Retrieve( )函數的語法格式爲:
dwcontrol.Retrieve ( {argument, argument . . .} )
該函數執行成功時返回一個長整數指示顯示的數據行數(即主緩衝區中的數據行數),失敗時返回-1。若是參數中有空值(NULL),則該函數返回空值。
例1,語句lrc=dw_1.Retrieve ( )執行無參數檢索,返回值放到long型變量lrc中。
例2,假定數據窗口控件dw_1包含的數據窗口對象使用下述SQL SELECT語句:
SELECT indate, sid, quantity,unit,cost From instock
WHERE indate between :a_date1 and :a_date2
其中 :a_date1和:a_date2是數據窗口畫板中定義的參數,對應的檢索語句能夠爲:
lrc=dw_1.Retrieve (date(‘2000-01-01’, ‘2001-01-01’))
檢索數據時發生的事件執行Retrieve ( )函數時觸發下列的數據窗口控件事件:
DBError:檢索失敗時觸發。
RetrieveRow:每檢索一行數據觸發一次,利用該事件可向用戶提供當前已檢索數據條數的信息,並可在檢索過程當中終止檢索,但對該事件編程後,將會顯著增長檢索時間,嚴重影響程序的運行效率。該事件的返回值爲:
0----繼續檢索(缺省值)
1----中止檢索
RetrieveStart:檢索開始時觸發,此時數據庫還沒有檢索數據,應用程序能夠控制是否繼續檢索、是否不作任何處理中止檢索、以及是否把新檢索出的行添加到數據窗口原有行末尾。上述動做經過該事件的不一樣返回值來控制,RetrieveStart事件的返回值爲:
0----繼續檢索(缺省值)
1----中止檢索
2----在檢索數據前不清除數據窗口控件的緩衝區和顯示行
RetrieveEnd:檢索結束時觸發。
4、更新數據庫
用戶修改了數據窗口中的數據後,就須要把修改過數據保存到數據庫中,最簡便的方法就是使用函數Update()了。該函數語法格式爲:
dwcontrol.Update ( {accept {,resetflag}})
其中:⑴dwcontrol:數據窗口控件名;
⑵Accept:可選參數,它用一個Boolean值指明在更新數據庫數據前是否先執行AcceptText()函數把用戶當前輸入的數據放到數據窗口中,有效取值爲:
① ① TRUE---缺省值,自動執行AcceptText()函數,若未經過數據有效性校 驗,則取消更新操做;
② ② FALSE-----不執行AcceptText()函數。
⑶Resetflag---可選參數,它用一個Boolean值指明該控件是否自動復位更新標誌。有效取值爲:
① ① TRUE---缺省值,自動復位更新標誌;
② ② FALSE---不復位更新標誌。
若是更新成功,Update()函數的返回值爲1,若是失敗,返回值爲-1。執行該函數後,應該檢查返回值,當返回值爲1時,使用COMMIT語句提交修改,讓數據庫永久性地記錄數據的修改;不然,使用ROLLBACK語句撤消全部修改。
下面是Update()函數的一個應用示例:
integer rc
string str
rc=dw_1.Update()
if rc>0 then
COMMIT USING SQLCA;
MessageBox("提示信息","提交成功!")
Else
Str = "錯誤號="+String(SQLCA.SQLDBCode)+"緣由爲:"+SQLCA.SQLErrText
ROLLBACK USING SQLCA ;
MessageBox("數據庫出錯", str)
end if
Update( )函數可觸發下述事件:
DBError:更新失敗時觸發。
SQLPreview:在SQL語句發送到數據庫時觸發。
UpdateStart:更新開始時觸發。
UpdateEnd:更新結束時觸發。
若是accept參數設置爲TRUE,那麼Update( )函數還會觸發下述事件:
ItemChanged
ItemError
10.3 數據窗口項的引用
1、數據窗口控件的緩衝區
數據窗口從數據庫中檢索到的數據都放置在客戶機的內存中,這片內存被分紅了四個區域,分別爲:
u u 主緩衝區(Primary Buffer)
u u 刪除緩衝區(Delete Buffer)
u u 過濾緩衝區(Filter Buffer)
u u 原始緩衝區(Original Buffer)
代碼中能夠直接訪問這四個緩衝區。
主緩衝區保存顯示在數據窗口控件中的全部數據行,以及這些行和各個列的狀態。當使用數據提取函數Retrieve()檢索數據時,檢索到的數據放置在主緩衝區中;當插入數據時,插入的數據也存放在主緩衝區。行和列的狀態用於數據窗口保存數據時生成合適的SQL語句。
當刪除數據行時(不論是使用DeleteRow()函數直接刪除一行仍是使用RowsMove()函數在緩衝區之間移動數據行),被刪除數據行從主緩衝區移動到刪除緩衝區。當使用數據窗口控件的對象函數Update()將數據窗口的修改發送到數據庫管理系統後,被成功刪除的記錄均從刪除緩衝區中清除。在保存數據時,刪除緩衝區用於生成DELETE語句。
過濾緩衝區用於保存那些知足數據源定義(即知足SELECT語句中的條件)而不知足過濾條件的行。過濾緩衝區與主緩衝區一塊兒在更新數據時生成所需的INSERT或UPDATE語句。
原始緩衝區保存數據窗口從數據庫中檢索出的原始數據,這些數據用於構造修改數據庫數據的SQL語句的WHERE子句。原始緩衝區在5.0之前的版本中應用程序不能直接訪問,如今能夠經過把GetItem簇函數(包括GetItemString()、GetItemDecimal()、GetItemDate()…)的第四個參數設置爲TRUE來訪問原始緩衝區中數據。
2、編輯狀態標誌
在數據窗口控件的主緩衝區、過濾緩衝區和刪除緩衝區中,每一行和每一行中的每一個列(即每一個數據項)都有個編輯狀態標誌(Edit Status Flag),這個標誌指示了相應行是不是新增長的行、相應列的數據是否被修改。在往數據庫中保存數據時,數據窗口利用這個標誌值來決定產生什麼類型的SQL語句。
3、插入行與刪除行
1. 1. 插入行InsertRow( )
InsertRow()函數在數據窗口的主緩衝區中插入一個空行,其語法格式爲:
dwcontrol.InsertRow ( row )
其中:row是個長整數(long型),它指定插入行的插入位置。
功能:在數據窗口的主緩衝區中插入一個空行
例如,咱們想在數據窗口dw_1中插入一行,並讓該行成爲數據窗口的第10行,那麼語句:
dw_1.InsertRow ( 10 )
即能完成這個任務。
row等於0時含義特殊,它表示在主緩衝區最後一行後面插入一行。
InsertRow( )函數執行成功時,返回一個long型值指示插入行的行號,執行失敗時返回 -1。
2. 2. 刪除行DeleteRow( )
DeleteRow()函數在數據窗口的主緩衝區(即顯示在用戶面前的數據中)中刪除一行,語法格式爲:
語法格式:dwcontrol.DeleteRow ( row )
其中: row爲要刪除行的行號,row等於0時刪除當前行。
功能:刪除數據窗口主緩衝區中一行記錄。
DeleteRow ()函數執行成功時返回1,失敗時返回-1。
例如: dw_1.DeleteRow ( 10)
刪除數據窗口控件dw_1中的第10行。
DeleteRow ()函數執行成功時返回1,失敗時返回-1。
4、編輯控件
使用數據窗口控件時,須要理解的最重要概念之一是編輯控件(EditControl)。請注意,這裏講述的編輯控件不是放置在窗口上的編輯框。
當數據窗口中的列能夠編輯時,系統自動建立一個編輯控件「漂浮」在獲得輸入焦點的可編輯項上,這個編輯控件沒有邊框,從外觀上咱們只能看到插入指針在閃動。當用戶按Tab鍵或經過單擊改變輸入焦點時,編輯控件隨之移動到獲得焦點的項上,同時編輯控件根據該項的設置及相應列的編輯風格調整自將編輯控件數據放到數據窗口列中。
所以,本質上用戶是在編輯控件中鍵入、編輯、修改數據。咱們知道,編輯控件是個文本型控件,在它裏面輸入的全部數據都被看成字符串保存。
列的編輯風格控制着數據的顯示和操做方式,而顯示格式則控制着編輯控件再也不有效時(也就是輸入焦點離開該列時)數據的顯示方式。
當用戶按Tab鍵或經過單擊改變輸入焦點時,數據窗口接受編輯控件中的數據(固然數據要經過適當的有效性檢查,後文將介紹檢查步驟),並將其置入相應的數據項中(放到數據窗口的主緩衝區中)。
1.在編輯控件中的數據被放到主緩衝區以前獲取用戶在編輯控件中輸入的值, 可使用數據窗口控件的對象函數GetText()。
GetText()函數的語法爲:dwcontrol.GetText( )
不管編輯控件當前所在行的數據類型是什麼,GetText()函數都返回一個字符串。應用程序負責適當的數據類型轉換。若是數據窗口中沒有可編輯列,那麼GetText( )函數返回空串。
通常來講。GetText()函數在數據窗口控件的ItemChanged和ItemError事件的事件處理程序中調用。
2.在代碼中設置編輯控件的值
語法格式:dwcontrol. SetText( )
例:dw_1.SetText()
用途: 用戶輸入了某個選擇項的一部分時,程序自動填充整個選項。
此時可使用數據窗口控件的對象函數SetText( )達到目的。
3. 將編輯控件數據放到數據窗口列中
前面咱們曾經講到,用戶輸入數據時,其實是在編輯控件中輸入,該控件框「漂浮」在當前列上面,用戶移動輸入焦點後,數據窗口把編輯控件中的數據移到列中。當用戶沒有移動輸入焦點時,怎麼把編輯控件中的數據送到列中呢?
這就要使用AcceptText( )函數了,它告訴數據窗口控件:若是編輯控件中還有數據未檢驗,那麼如今檢驗它並把它放入主緩衝區中。
AcceptText ( )函數的格式爲: dwcontrol.AcceptText ( )
例:dw_1.AcceptText()
這個函數沒有參數,返回值1表示執行成功,返回值-1表示執行出錯。AcceptText ( )函數可觸發下述事件:
ItemChanged
ItemError
5、獲得與設置當前行/列
當前行和當前列是目前正操做的行和列,用戶在編輯數據時,也就是正編輯數據項所在的行和列。
1.獲得當前行號GetRow ( )
GetRow ( )函數返回當前行的行號。
語法格式爲:dwcontrol.GetRow ( )
功能:獲得當前行的行號。
該函數返回一個long型值,表示當前行號。若是沒有選中任一行,則返回0,出錯時返回-1。
2. 2. 設置某行爲當前行SetRow ( )
SetRow(row)函數把參數row指定的行設置成當前行。
語法格式爲: dwcontrol.SetRow ( row )
功能:把參數row指定的行設置成當前行。
設置成功時該函數返回1,不然返回-1。若是row的值小於1或大於數據窗口中的總行數,則SetRow ( )函數執行失敗。SetRow ( )函數可能觸發下述事件: ItemChanged
ItemError
ItemFocusChanged
RowFocusChanged
3. 3. 獲得記錄行數RowCount( )
語法格式:dwcontrol. RowCount( )
功能:返回當前數據窗口中的記錄個數。
該數據窗口控件的對象函數能夠返回當前數據窗口中的記錄個數。
例:按鈕「下一條」能夠改變數據窗口的當前行
long row, rsm
dw_1.SetRowFocusIndicator(Hand!) // 設置行光標指示爲手。
rsm = dw_1.RowCount( )
row = dw_1.GetRow( )
if row >= rsm then
row = 1
else
row ++
end if
dw_1.SetRow( )
注:爲了清楚顯示,可在窗口Open事件中加入
dw_1.SetRowFocusIndicator(Hand!) //設置行光標指示爲手。
4.獲得當前列號GetColumn ( )
GetColumn ( )返回當前列號。語法格式爲:dwcontrol.GetColumn ( )
功能:獲得當前列號
該函數返回一個integer型值,表示當前行號。返回值爲0表示無當前列,返回值爲-1表示操做失敗。
5. 設置某列爲當前列SetColumn ( )
SetColumn ( )把參數column指定的列設置爲當前列。
語法格式爲: dwcontrol.SetColumn ( column )
功能:把參數column指定的列設置爲當前列。
設置成功時該函數返回1,不然返回-1。若是column的值小於1或大於數據窗口中的總列數,則SetColumn ( )函數執行失敗。參數column能夠是個列號(integer)、也能夠是列名(String)。
SetColumn ( )函數可能觸發下述事件:
ItemChanged
ItemError
ItemFocusChanged
6、獲得與設置數據項的值
數據窗口中任意一行和任意一列的表示:控件名.Object.列名[行號]
例如:dw_1.object.name[1]
例1: 編寫按鈕控件事件,在控件dw_1中的顧客表中插入一條記錄,而後賦值。
Long row
Row = Dw_1.InsertRow (0) //在數據窗口控件的最後一行後面插入一行
Dw_1.ScrollToRow ( row )
Dw_1.object.cname[row] = 「無」
Dw_1.object.age[row] = 20
…..
例2:編寫按鈕控件事件,將控件dw_1中的顧客表中凡年齡>=18的顧客的備註中寫入「成年人」,不然寫入「少年兒童」。
long I, row, rsm
rsm = dw_1.RowCount()
for I=1 to rsm
if dw_1.object.age[I] >= 18 then
dw_1.object.memory[I] = 「成年人」
else
dw_1.object.memory[I] = 「少年兒童」
end if
next
10.4 與數據窗口有關的函數
1、滾動數據行
除了用戶直接操做滾動顯示在數據窗口中的數據行外,經過編程一樣能夠滾動數據行。完成數據行滾動到函數有六個Scroll( )、ScrollToRow( )、ScrollNextRow ( )、ScrollPriorRow ( )、ScrollNextPage ( )、ScrollPriorPage ( )。
1. 1. Scroll( )函數滾動「漂浮」數據窗口上的編輯控件中的文本行,使相應行顯示在編輯控件中。
Scroll()函數的語法爲: dwcontrol.Scroll ( number )
其中:dwcontrol:數據窗口控件名;
number:long類型,指定要滾動的行數和方向。Number大於0時向下滾動number行,number小於0時向上滾動number行。若是number值超過餘下可滾動行數,那麼該函數滾動到編輯控件中數據的開頭或結尾(依據滾動方向)。
返回值:Long。
函數執行成功時,Scroll()函數返回編輯框中第一個可見行的行號;發生錯誤時返回-1。若是任何參數的值爲NULL,則Scroll()函數返回NULL。
用法:若是Scroll( )函數參數中指定的滾動行數超過了編輯框中餘下的實際行數,則該函數將回繞滾動。
例1:下面的代碼把數據窗口控件當前編輯框的內容向下滾動4行:
dw_Employee.Scroll(4)
例2:下面的代碼把數據窗口控件當前編輯框的內容向上滾動4行:dw_Employee.Scroll(-4)
2.ScrollToRow()當在數據窗口主緩衝區的末尾插入一行時,新行並不必定能在數據窗口中看到,這時可使用函數ScrollToRow( )。
將該行滾動到窗口視野中,讓用戶不用按滾動條就看到新行。同時,ScrollToRow( )函數還把指定行設置爲當前行,但它並不改變當前列。
功能:滾動數據窗口控件的顯示到指定行,該函數改變當前行但不改變當前列。語法:dwcontrol.ScrollToRow ( row )
參數:dwcontrol:數據窗口控件名;
row:long類型,指明要滾動到哪一行。若是row參數設置爲0,則滾動到第一行;若是row大於最後一行的行號,則滾動到最後一行。
用法:
執行了ScrollToRow()函數後,指定的行成爲新的當前行。若是該行已經顯示在數據窗口中(即用戶能夠直接看到該行),那麼顯示行不會變化。若是該行不可見,則顯示行向所需方向滾動,以把當前行顯示在數據窗口中。
ScrollToRow()並不加亮(或稱選中)當前行。若是想加亮當前行,請使用數據窗口控件的對象函數。
SelectRow()。ScrollToRow()函數可能觸發數據窗口的下述事件:
u u ItemChangedn
u u ItemErrorn
u u ItemFocusChangedn
u u RowFocusChanged
注意,該函數隱含地把第row行設置爲當前行,但它並不改變當前列。
2、改變當前行光帶
功能:在數據窗口控件中選擇或去掉選擇(加亮或去掉加亮)指定的行。
格式:dwcontrol. SelectRow(row, boolean)
參數dwcontrol:數據窗口控件名;
row:long類型,指定要選擇或去掉選擇行的行號。該參數的值指定爲0時,選擇或去掉選擇全部的行;
boolean :boolean類型,指定要選擇行或是去掉選擇行。有效取值爲:
u u TRUE選中指定的行,被選中行被加亮顯示;
u u FALSE不選中指定的行,這些行正常顯示
返回值:Integer。
函數執行成功時返回1,發生錯誤時返回-1。若是任何參數的值爲NULL,則SelectRow()函數返回NULL。
例:在dw_1的rowfocuschanged事件中寫入
dw_1.SelectRow(0, FALSE)
dw_1.SelectRow(CurrentRow, TRUE) // CurrentRow當前行
3、清除全部行
功能:清除數據窗口控件中的全部數據。
語法:dwcontrol.Reset ( )
參數:dwcontrol:數據窗口控件名。
返回值: Integer。
函數執行成功時返回1,發生錯誤時返回-1。若是dwcontrol的值爲NULL,則Reset()函數返回NULL。
數據窗口在檢索數據前自動清除原有數據,所以檢索前不須要調用該函數。Reset ( )函數的功能與刪除數據窗口的全部行有些差異,執行Reset ( )函數後再執行Update( )函數並不會清除數據庫中的數據,而刪除數據窗口的全部行後再執行Update( )函數就會清除數據庫中的數據。
例1,下面的語句清除數據窗口控件dw_employee的內容:
dw_employee.Reset( )
4、修改過濾條件及過濾數據
1.SetFilter( )
功能:定義數據窗口控件的過濾條件。
語法:dwcontrol.SetFilter ( format )
參數:dwcontrol:數據窗口控件名;
format:string類型,其值是用作過濾條件的邏輯表達式。表達式中可使用列名或列號,使用列號時,在列號前加上個#符號。若是format參數的值爲NULL,那麼程序運行時PowerBuilder會提醒用戶輸入過濾條件。
返回值:Integer。函數執行成功時返回1,發生錯誤時返回-1。若是任何參數的值爲NULL,則SetFilter()函數返回NULL。
用法:在定義數據窗口對象時,能夠同時定義過濾條件,這樣,程序運行時,檢索出數據窗口中的數據後,不知足過濾條件的數據馬上從主緩衝區被移動到過濾緩衝區。
執行SetFilter()函數後,新的過濾條件將取代原來的過濾條件(若是原來有過濾條件的話)。此時,數據窗口並無真正地過濾數據,要完成過濾任務,還須要執行數據窗口控件的對象函數Filter(),該函數把不知足過濾條件的數據從主緩衝區移動到過濾緩衝區。
過濾表達式是由列名或列號、關係操做符、以及要比較的值組成的邏輯表達式。邏輯表達式中可使用AND、OR、NOT邏輯操做符鏈接不一樣的部分。使用括號能夠改變求值順序。
2.Filter( )
功能:在數據窗口控件中顯示知足當前過濾條件的行,不知足過濾條件的行從主緩衝區中移動到過濾緩衝區。
語法:dwcontrol.Filter ( )
參數:dwcontrol:數據窗口控件名。
返回值:Integer。函數執行成功時返回1,出現錯誤時返回-1。若是dwcontrol的值爲NULL,則Filter()函數返回NULL。
用法:Filter()函數使用數據窗口當前的過濾條件過濾數據窗口中的數據,函數執行以後,數據窗口中只顯示知足過濾條件的數據。
使用SetFilter()函數改變當前的過濾條件。定義了新的過濾條件後,使用Filter( )函數把不知足條件的數據移動到過濾緩衝區中。
例1:dw_1.SetFilter(「age>20 and sex=’男’」)
dw_1.Filter()
例2:清除過濾條件
dw_1.SetFilter(「」)
dw_1.Filter( )
10.5 數據窗口事件
觀察營業員管理窗口中的數據窗口控件中的各個事件。
例1:實現營業員表的主從顯示。
解:dw_1做爲主表採用grid風格,dw_2做爲從表採用自由風格,且按營業員號檢索。
在dw_1的rowfocuschanged事件中,有以下腳本
long row, rsm, id
rsm = this.RowCount()
row = this.GetRow()
if row>0 and row<=rsm then
id = this.Object.SalerID[row]
row = dw_2.retrieve(id)
end if
例2: 在dw_2輸入營業員編號過程當中,當輸入的營業員編號與之前的營業員編號重複,應報警提示。
解:在dw_2的itemchanged事件中,編寫如下腳本
/*********************
* 防止不合法的ID號 *
*********************/
string str
long i, num
if dwo.Name="salerid" then
num = dw_1.RowCount()
for i=1 to num
if (integer(dw_2.GetText())=dw_1.Object.salerid[i]) then
str = "當前ID號與第"+string(i)+"條記錄的ID號重複"
MessageBox("錯誤信息", str, stopsign!)
dw_2.SetColumn(dw_2.GetColumn())
return 2
end if
next
end if
return 0