數據窗口對象非常強大的原因之一就是能夠很容易地修改數據庫。當用戶修改了數據窗口中的數據,插入了新的數據行或者刪除了數據行以后,只要調用
update()函數就可以將修改了的數據保存到數據庫中。但是,這需要一個前提,就是必須設置數據窗口的修改屬性。
數據窗口要修改數據表,首先清楚數據窗口只能修改一個數據表。當數據窗口的數據來源于不止一個數據表時,可以用腳本控制數據窗口的修改屬性來對數據表逐個
進行修改,這種技術在后面有關章節介紹。下面介紹一次修改一個數據表的設定方法。
當數據窗口是用來接受用戶的手工錄入數據時,應該設置兩方面的屬性才能確保數據窗口能夠用來修改數據表。一個是修改數據窗口的修改屬性,另一個是用戶可以
修改的字段的相關屬性值。
首先介紹數據窗口的修改屬性的設置。在數據窗口畫板中,使用菜單項Rows->Update
Properties,彈出如圖所示的窗口。
數據窗口的所有修改屬性都集中在該窗口中。如果數據窗口對應的數據表中定義了主鍵或者惟一性索引,則數據窗口創建時缺省的就是允許修改,并且正確設置了所
有的修改屬性。否則就需要手工進行設置。前面介紹過,當增加、刪除或者重新選擇了字段時,PowerBuilder將數據窗口的修改屬性置為不允許,這時
也應該進行手工設置。
首先應該選中Allow Updates選項,只有選中該選項,才允許繼續進行其他屬性的設定。在Allow
Updates右面的下拉列表框叫做Table to
Update,只能在該下拉列表框中選擇一個,并且必須選擇一個數據表名,選中的表就是要被更新的表。
選中了Allow Updates屬性后,接下來就要指定在數據窗口中哪些列被更新。在Updateable
Columns列表框中用鼠標單擊被更新的字段。當數據窗口中的字段來自不止一個數據表時,這時一定要選擇同一個表中的字段,因為一個數據窗口一次只能更
新一個數據表。當數據窗口中增添了字段時,新增添的字段往往是不允許修改的,一定要在該列表框中選擇該字段。
選擇了可以修改的字段后,就應該在Unique Key
Columns(s)列表框中選擇惟一標識一行的列。如果在定義數據表時定義了主鍵,單擊右面的Primary Key按鈕可以在該列表框中選中主鍵。
Where Clause for Update/Delete組框中包含了三個選項,用來配置如何在Update和Delete
SQL語句中構造where字句的。這三個選項為數據庫加鎖提供了三種不同的選擇。當某行被選中時,用戶可以通過DataWindow對象來提供完整性保
護,可以防止其他用戶檢索該行。這三個選項是:Key Columns、Key and Updateable Columns和Key and
Modified Columns。下面分別詳細介紹。
1.Key Columns
當開發單用戶應用程序或者用戶都以加鎖方式訪問數據庫時可以選中該選項。該選項表示數據窗口只使用在Unique Key
Column(s)列表框中指定的惟一列進行數據更新。使用這種方式來修改數據庫,并發性很高,不同的用戶都可以并發地訪問數據庫,但是數據的完整性卻非
常差。因此要保證數據完整性,只有在單用戶應用程序或者加鎖訪問方式下才使用這種修改方式。
例如,在add_book(通訊錄)數據表中定義了5個字段,id為主鍵,name、address、telephone、ICQ四個字段為可修改字段,
某數據窗口包含這5個字段并且使用Key Columns更新數據庫。有如下一條數據:
id:230602710327574
name:朱義
address:勝利油田
telephone:945-8557021
ICQ:39661314
假設甲用戶修改了這條數據,將name改為“郭寶利”,數據窗口產生如下的UPDATE語句:
update add_book
set name = "郭寶利"
where id = "230602710327574";
其中的where字句中只包含在Unique Key
Columns中指定的字段id,用該字段來確定要修改數據庫中哪行數據。該update語句將成功執行。如果乙用戶要將address字段修改為“冀東
油田”,甲、乙用戶同時并發修改id為230602710327574的數據,都會修改成功,但會產生如下的數據:
id:230602710327574
name:郭寶利
address:冀東油田
telephone:945-8557021
ICQ:39661314
兩個人同時修改了一條記錄,本來地址是勝利油田的郭寶利卻成了冀東油田的了。
2.Key and Updateable Columns
這種修改方式是缺省的修改方式,它用主鍵列和可以修改的列來創建where子句,具有很高的數據完整性,但是并發性卻不是太好。推薦使用這種修改方式。
像上面例子一樣,如果甲用戶做修改操作,保存數據時將產生如下的SQL語句:
update add_book
set name = "郭寶利"
where id = "230602710327574"
and name = "朱義"
and address = "勝利油田"
and telephone = "945-8557021"
and ICQ = "39661314";
該SQL語句中的where子句包含了主鍵id和所有的可修改字段。如果乙用戶是在甲保存修改了的數據之前檢索的數據,當乙用戶要將address修改為
“冀東油田”時,產生如下的SQL語句:
update add_book
set address = "冀東油田"
where id = "230602710327574"
and name = "朱義"
and address = "勝利油田"
and telephone = "945-8557021"
and ICQ = "39661314";
此時,由于甲用戶已經修改了數據,將name改成了“郭寶利”,所以乙用戶的where子句中指定的數據在數據庫中已經不存在了,乙的修改不成功,從而保
證了數據的完整性。
3.Key and Modified Columns
該方法是上面兩種方法的折衷,當不同的用戶并發修改同一行數據的不同字段時,都能成功修改,所以它的并發性有了一定的限制,數據的完整性比第一種修改方式
有所提高。這種修改方式使用主鍵和數據發生了變化的列來產生where子句。同樣,在上面的例子中,甲用戶要將“朱義”修改為“郭寶利”會產生如下的
SQL語句:
update add_book
set name = "郭寶利"
where id = "230602710327574"
and name = "朱義";
這時的where子句中只包含主鍵id和要修改的字段name。如果此時乙用戶并發修改數據,要將id為“230602710327574”的用戶的
address修改為“冀東油田”,乙用戶也會成功修改。
4.時間標記
如果數據庫管理系統支持時間標記,則可以在DataWindow對象的結果集中包含時間標記來獲得最大的數據完整性。PowerBuilder將自動為更
新和刪除操作的where子句加上時間標記,而不顯示在可更新列的列表中。Oracle、SQL
Server完全在服務器上處理時間標記,在DataWindow中不要求有額外的工作。
5.Key Modification
該組框用來指定當用戶修改了主鍵時,數據窗口如何來更新數據表中的主鍵字段。有兩種選擇,Use Delete then Insert和Use
Update。
第一個選項是先刪除原有主鍵值,然后再使用新的主鍵值插入一個完整的行。使用這種更新主鍵的方式可以減少組織數據的工作量,但在數據庫中各個數據表之間存
在父子制約關系,并且依賴該主鍵的外部鍵被指定為級聯刪除時,操作就不會成功的。因為級聯刪除方式要求當依賴主鍵的外部鍵有數據時就不能刪除主鍵。
當DBMS允許更新主鍵列時,可以使用該選項,該選項直接修改主鍵值,所以防止了級聯刪除帶來的操作不成功的問題。
6.Identify Column
該下拉列表框用于為下拉列表框中所指定的列(通常是主鍵列)生成序號,當且僅當DBMS支持序號生成時該作用才有效。
當正確進行了上述所有操作后,單擊OK按鈕即完成了修改屬性的設置。如果數據窗口允許手工錄入數據,接下來就應該設置可修改字段的相關屬性了。主要包括如
下屬性:
l字段的Tab Order值。
l字段的Protect屬性。
l字段的DisplayOnly屬性。
l字段的Visible屬性。
上述屬性前3個中任意一個都可以讓用戶無法修改字段中的數據;最后一個屬性決定字段是否可見,不可見的字段不管其他屬性如何設置,用戶都無法修改字段中的
數據。
首先介紹如何設置字段的Tab Order值。使用菜單項Format->Tab Order可以在Design窗口顯示各字段的當前Tab
Order值,用鼠標單擊要修改Tab Order值的字段,然后手工將Tab Order值改為非0即可。在設置Tab Order時要注意三點:
(1)用戶可以手工修改的字段,其Tab Order值不能為0。
(2)在數據窗口修改屬性中,不允許修改的字段其Tab Order值應該為0,或者其Display Only屬性應該選中。
(3)Tab Order取值決定字段獲得焦點的順序。在數據窗口中使用Tab按鈕在字段間切換時,Tab
Order取值小的首先獲得焦點,最大的最后獲得焦點。
字段的Protect屬性設置字段是否被保護。如果該屬性設置為1,則不允許用戶修改字段中的數據,即使Tab
Order設置為非零。字段的DisplayOnly屬性決定字段中的內容是否只用來顯示,當屬性設置為1或者True時,字段中的數據不允許用戶修改,
不管其他幾個屬性是如何設置的。Protect屬性只能使用表達式,選中字段后在屬性視窗General屬性中單擊右側的紅色小按鈕(如果已經有表達式,
則按鈕為綠色),進入到表達式輸入對話框,輸入該屬性的表達式即可。比如,設置用戶不能修改字段id原來的數據,可以輸入如下的表達式:
if(isRowNew(),0,1)
字段的Display屬性在屬性視窗Edit中,選中該選項表示該字段中的數據只用來顯示,不允許用戶修改。該屬性不能使用表達式。在PB中,編輯類型的
控件都有該屬性,并且屬性的作用也是相同的。
當字段的Tab Order值為0時,肯定不能獲得焦點,但是非0時也不一定能獲得焦點,還得看字段的Protect屬性是否設置為1;當字段的Tab
Order值不為0,Protect屬性不為1并且字段的Visible屬性為True時,肯定可以獲得焦點。DisplayOnly屬性和焦點是否能夠
獲得無關。
posted on 2010-08-06 15:36
Ke 閱讀(8174)
評論(0) 編輯 收藏 所屬分類:
powerBuilder