1. 程式人生 > >PB9.0提供了28個屬性、35個預設事件、162個函式。注意與資料視窗物件的區分。

PB9.0提供了28個屬性、35個預設事件、162個函式。注意與資料視窗物件的區分。

*儘量不要在RetrieveRow事件下編寫指令碼(包括註釋)。

*如果資料視窗的DoubleClicked事件中編寫了指令碼,那麼在資料視窗的C1icked事件中的指令碼應該儘量短,否則雙擊事件中的指令碼永遠不可能得到執行。一般來說,Cliked中指令碼的執行時間和兩次擊滑鼠之間的間隔時間之和,不應該大於作業系統中所設定的滑鼠雙擊時間間隔,否則雙擊事件永遠不可能觸發,雙擊時僅僅是接連兩次觸發c1icked事件。

*在資料視窗中錄入資料時,事件EditChanged是觸發頻率最高的,每一個按鈕都觸發該事件;觸發頻率僅次於該事件的是ItemChanged事件和ItemFocusChanged,只要修改了單元中的內容,每次觸發ItemFocusChanged事件都會觸發ItemChanged事件。在這些事件下編寫過長的指令碼會非常影響錄入工作的效率。同樣,事件RowFocusChanged的觸發頻率也是相當高的。一般來說是可以避免在這四個事件中編寫指令碼的。

■dwo引數使用
資料視窗的某些事件中可以使用一個稱為dwo的變數,該變數儲存資料視窗中的部分資訊,用資料視窗的屬性可以讀取這些資訊dwo.type:讀取在dwo中儲存的物件型別。物件型別可能有bitmap、button、column、compute、graph、groupbox、line、ole、ellipse、rectangle、roundrectangle、report、tableblob、text、datawindow(當用戶沒有單擊特定物件時)
dwo.Name:column的列名
dwo.Primary[row]:column的資料
dwo.Selected:選中column的資料

■資料緩衝區
資料視窗在執行時要建立四個緩衝區,分別是主緩衝區、刪除緩衝區、過濾緩衝區和原始緩衝區,這四個緩衝區各司其職、共同配合,來保證資料視窗對資料的正確處理。下面分別加以介紹。
1、主緩衝區-Primary
這是最重要的一個緩衝區,儲存的是當前顯示在資料視窗中的所有資料以及它們的修改狀態。在儲存資料時使用這些狀態生成SQL語句。平常的大多數操作都是針對該緩衝區,函式中的緩衝區引數預設也是該緩衝區。
2、刪除緩衝區-Delete
該緩衝區儲存所有刪除了的資料。儲存資料時,該緩衝區中的資料用來產生delete語句。在資料沒有提交到資料庫之前,可以從該緩衝區中將資料恢復出來。資料提交後,該緩衝區中的資料清空。
3、過濾緩衝區-Filter
該緩衝區中儲存的是沒有通過過濾規則的所有資料,這些資料在儲存時同主快取區的資料一起生成相應的insert或update語句。
4、原始緩衝區-original
用來儲存從資料庫中檢索到的初始值,在儲存資料時用來生成where語句。
    上面這四個緩衝區中,original緩衝區在指令碼中很少使用,其他三個經常涉及到,很多資料視窗函式都需要指定對這三個緩衝區中的哪個進行操作,大多數情況下都使用預設的緩衝區Primary!。這三個緩衝區,除了儲存相應的資料外,都自動維護這些資料的修改標誌,它們之間的協作也是自動維護的。例如,當使用過濾函式時,沒有通過過濾規則的資料自動從Primary快取區移送到Filter快取區;執行刪除操作時,資料自動從Primary快取區移送到Delete快取區。所有這些資料的移送無需指令碼的干預,只管使用相應的函式即可。

■DWBuffer
Primary! 0
Delete!   1
Filter!   2

■DWItemStatus
NotModified! 0
DataModified! 1
New!   2
NewModified! 3

■編輯控制元件
和資料視窗控制元件打交道都是通過編輯控制元件進行的。在資料視窗中錄入資料、修改資料,實際上是在修改單元上的編輯控制元件中的內容。當編輯控制元件移動到另外單元上之前,要對編輯控制元件中的資料進行校驗,如果能通過欄位的校驗規則,就儲存到欄位中。編輯控制元件是可以移動的,需要編輯哪個單元,編輯控制元件就移動到哪個單元上,接受輸入或者修改。
編輯控制元件在沒有離開當前欄位時,使用者錄入或者修改的資料就不會被儲存到欄位中,如何確保在資料視窗失去焦點時,最後位置上編輯框中的內容不被遺漏呢?前面介紹了在資料視窗的LoseFocus事件中編寫如下指令碼:
this.AcceptText()
這個方法在很多情況下能解決該問題。美中不足的是,如果編輯框中的內容不能通過欄位的校驗規則,有時會顯示兩次錯誤資訊視窗。造成兩個錯誤資訊視窗,往往是在選擇其他單元時發生,在資料視窗失去焦點之前(如單擊“儲存”按鈕等)只會顯示一個錯誤資訊視窗。使用者選擇其他單元時,編輯框中的資料開始進行校驗,不能通過校驗規則,顯示校驗錯誤資訊,在顯示校驗錯誤資訊時資料視窗失去焦點,觸發資料視窗的LoseFocus事件執行AcceptText函式,又一次顯示校驗錯誤視窗。
所以,顯示兩次校驗錯誤視窗的原因是LoseFocus事件中的AcceptText函式造成的。可以想法讓該函式在這種情況下不執行。為此定義一個例項變數:
       Boolean ib_accept = True
該變數用來表示是否正確通過了校驗,然後將LoseFocus中的指令碼改成下面的指令碼:
If ib_accept Then
This.AcceptText()
Else
ib_accept = true
End If
在資料視窗的ItemError事件中編寫指令碼:
ib_accept = False
這樣就可以解決顯示兩個校驗錯誤資訊視窗了,並且不會遺漏最後一個編輯框中的內容。

*當在某個單元中修改或者錄入資料後,編輯框要離開時,要進行4個校驗步驟,前面兩個步驟由PowerBuilder完成,後面兩個由開發者編寫。
(1)看資料和編輯前相比是否發生了改變,沒有改變則不做任何處理。
(2)檢查測試此值是否違反了任何一個在欄位上定義的有效性校驗規則,違反則拒絕接受此值,並觸發ItemError事件。
(3)檢查此值是否與編輯前真的不同,沒有改變則終止有效性校驗。
(4)檢查開發人員在ItemChanged事件中編寫的指令碼。具體的發生情況取決於分配給被稱為動作程式碼的值。

■讀取和設定資料
讀取:
1、使用函式
dw_1.getitemX()
2、直接使用資料視窗物件屬性來讀取資料
dw_1.object.data.primary.current[row,column]
該語句的格式是:
dwcontrol.object.data[buffer[.whichvalue]][row,column]
dwcontrol是資料視窗控制元件名稱。
whichvalue既可以是current(預設值),也可以是original。這樣就允許使用者訪問一個列的初始值或當前值。
row和column是要訪問的單元所在的行號及列號。
object、data是保留字,buffer是快取區的名稱,有Delete、Primary、Filter。
這種引用方法速度比較快,尤其讀取大量資料時。
設定:
使用函式
SetItem()
SetText()


【屬性】

▲DataObject
資料來源

▲Title
用來顯示在資料視窗的標題條(TitleBar)上的一個字串。建議該字串要有一定的含義,能夠標明資料視窗的用途或者其中的資料的類別。該屬性的預設值none。當屬性TitleBar為True時,該屬性起作用。

▲Visible
是否顯示資料視窗控制元件,預設為True。有時為了向其他資料視窗提供資料,除了使用datastore控制元件外,還可以使用Visible屬性為False的資料視窗。如果僅僅是為了處理資料,不贊成使用Visible屬性為False的資料視窗,而應該使用Datastore物件,這樣可以節省計算機資源,提高處理效率。

▲Enabled
資料視窗控制元件是否可以獲得焦點,預設為True。可以在指令碼中修改該屬性以限制使用者執行了某些特定操作後再允許操作資料視窗。

▲TitleBar
是否顯示標題條,預設為False。使用該屬性可以在資料視窗上部顯示標題條,類似於視窗的標題條。設定屬性為True後,使用者就能夠拖動資料視窗。

▲ControlMenu
是否顯示控制選單,預設為False。該屬性當TitleBar屬性為True時才有效。

▲MaxBox和MinBox
是否顯示最大和最小控制按鈕,預設為False。當屬性TitleBar為True時,該屬性有效。屬性TitleBar和ControlMenu、MinBox、MaxBox共同控制資料視窗的外觀是否像視窗的外觀。

▲HscrollBar和VscrollBar
這兩個屬性用來控制資料視窗控制元件的橫向和縱向滾動條是否顯示。設定為True時,滾動條可以根據需要自動顯示,資料夠顯示時則不出現滾動條。

▲LiveScroll
該屬性是一個比較重要的屬性,預設為True,表示當拖動垂直滾動滑塊時,資料視窗中的行也跟隨滾動;屬性為False時表示拖動垂直滾動滑塊時,資料視窗中的行不跟隨滾動,放開垂直滾動滑塊後,資料視窗中的資料才滾動到適當資料行上。建議選中該屬性,這樣當資料很多時,使用者就可以拖動垂直滾動小滑塊來快速瀏覽資料了。

▲HsplitScroll
該屬性是一個非常有實際用途的屬性。該屬性決定是否顯示分割滾動條,預設為False。當資料視窗比較寬,要顯示水平滾動條時,建議將該屬性設定為True。

▲RightToLeft
該屬性為True時表示資料視窗中的所有字元都從右向左顯示。預設為False。當設定該屬性為True時,還必須要作業系統的支援,該屬性才能起作用。

▲Resizeable
使用者是否可以調整資料視窗的大小,預設為False。

▲Border
是否顯示邊框,預設為True,只有在True的情況下BorderStyle才起作用

▲BorderStyle
取值為列舉型,用來定義資料視窗邊框樣式。有四個取值:StyleBox!、StyleLowered!、StyleRaised!、StyleShadowBox!,預設邊框型別為StyleLowered。

▲Icon
用來給資料視窗指定標題條左上角的圖形,預設為Windows標誌圖。


【事件】

◆Clicked
滑鼠左鍵在資料視窗控制元件上任意位置單擊時觸發該事件。該事件中有4個引數,可以在指令碼中直接使用。
xpos:表示和資料視窗最左側的距離的整數。
ypos:表示和資料視窗最上部的距離的整數,不包括標題條。
row:表示使用者所單擊的行號的long型數。
dwo:使用者單擊物件,是DWObject型別。
在該事件的指令碼中使用這些引數,可以給使用者一些提示資訊或者獲取使用者單擊內容的資訊。
返回值:0表示繼續處理,這是預設值。1表示停止處理。
*當選擇和當前行不同的資料行時可以觸發ItemFocusChanged和RowFocusChanged事件,當單擊當前行的其他欄位時可以觸發ItemFocusChanged事件。DoubleClicked事件也可以觸發該Clicked事件。

◆DBError
在資料視窗控制元件中發生資料庫錯誤時觸發該事件。該事件有以下引數。
SQLdbcode:long型別的錯誤程式碼,具體含義由DBMS指定。當DBMS沒有指定錯誤程式碼時,SQLdbcode提供4個錯誤程式碼,-1表示事務物件引數錯誤而不能聯結到資料庫,-2表示不能聯結到資料庫,-3表示因為其他使用者的修改導致用來進行檢索或修改的鍵值在資料庫中已經不存在而產生錯誤,-4表示向資料庫中寫blob物件時失敗。
SQLerrtext:string型別,資料庫指定的錯誤資訊。
SQLsyntax:string型別,當錯誤發生時,傳送到資料庫的SQL語句。
buffer:DWBuffer列舉型,表示導致錯誤的資料所在的緩衝區。
row:long型別,導致錯誤的資料的行號。
返回值:可以用return語句任意指定返回什麼資料。有特定含義的返回值是0和1。0表示顯示錯誤資訊,1表示不顯示錯誤資訊。

◆DoubleClicked
滑鼠左鍵在資料視窗控制元件中雙擊時觸發該事件。該事件中的4個引數和Clicked事件中的名稱及含義完全相同,也可以直接在該事件的指令碼中直接使用。
該事件的返回值可以用return指定。有特殊函式的返回值是0,表示繼續處理。

◆EditChanged
在資料視窗控制元件的編輯框中每次按鈕都觸發該事件。一般很少在該事件下編寫指令碼。該事件提供三個引數。
row:long型別,當前編輯的行號。
dwo:DWObject型別,正在編輯的物件。
data:String型別,當前編輯框中的內容。
返回值:可以用return指定任意返回值,0表示繼續處理。
*每次編輯時觸發

◆Error
當資料視窗物件中的資料或者表示式錯誤時觸發該事件,在分散式系統中聯結髮生錯誤時也會觸發該事件。和DBError事件不同的是,該事件在沒有和資料庫互動時就有可能觸發,而DBError事件觸發時肯定和資料庫發生了互動。通常在該事件中編寫指令碼,提供對錯誤的處理。該事件提供了很多引數。
errornumber:unsigned integer型別,由PowerBuilder指定的錯誤程式碼號。
errortext:string型別,由PowerBuilder指定的錯誤資訊。
errorwindowmenu:string型別,造成錯誤的指令碼所在物件的父物件的名稱。
errorobject:string型別,造成錯誤的指令碼所在的物件的名稱。
errorscript:string型別,造成錯誤的語句所在的指令碼的全部內容。
errorline:unsigned integer型別,造成錯誤的語句在其指令碼中所佔的行號。
action:在Error事件下的程式碼執行完後,該引數取值由指令碼設定。可以指定的值有:ExceptionFail!表示錯誤處理失敗(執行該值有可能觸發應用的SystemError事件);ExceptionIgnore!表示忽略錯誤繼續執行(要謹慎使用該取值,因為忽略錯誤有可能將再次導致其他錯誤);ExceptionRetry值只能用於OLE,對於資料視窗控制元件,沒有該取值,該取值表示再次執行剛才造成錯誤的功能;ExceptionSubstituteReturnValue!表示使用引數returnvalue的返回值,而不是返回OLE伺服器或資料視窗控制元件的錯誤程式碼,並且取消錯誤狀態。
returnvalue:當Action指定為ExceptionSubstituteReturnValue!時返回該引數的取值。
*對於資料視窗控制元件來說,如果在運算資料或屬性表示式時發生了錯誤,將進行如下的錯誤處理過程:
a.觸發Error事件;
b.如果Error事件中沒有指令碼或者Action變數設定成ExceptionFail!,則觸發應用的SystemError事件;
c.如果SystemError事件下也沒有指令碼,便會發生應用程式錯誤,然後終止應用程式。
所以,在該事件或者應用的SystemError事件下應該編寫指令碼。這樣才不至於退出應用程式,使使用者沒有處理的機會,甚至錄入了半天的資料連個儲存的機會也沒有了。
返回值:該事件沒有返回值,也不在該事件中使用return語句。

◆ItemChanged
當某單元(行和列的交叉點叫做單元)編輯後(內容改變),游標要離開時觸發該事件,如使用了Enter按鈕、單擊了Tab按鈕、使用了游標鍵、在其他欄位上單擊了滑鼠左鍵等。當編輯完一個單元的內容而沒有離開該單元,這時資料視窗失去焦點,這種情況不會觸發該事件(所以在LoseFocus事件中要使用函式AcceptText)。三個引數row、dwo和data的含義和EditChanged事件的三個引數完全相同。
返回值:可以使用return語句返回任意值。0表示接受剛剛修改的資料,該值是預設值;1表示放棄剛才的修改,不允許焦點離開;2表示放棄剛才的修改,允許焦點離開。
*編輯框內容有變化並離開此編輯框時觸發;注意:當editchanged事件下有程式碼,編輯框內容有變化且離開此編輯框時,不會觸發此事件

◆ItemError
當某單元被編輯後游標要離開時,如果單元中的新資料不能通過有效性校驗,則觸發該事件。(同ItemChanged:當編輯完一個單元的內容而沒有離開該單元,這時資料視窗失去焦點,這種情況不會觸發該事件)該事件在ItemChanged事件之前觸發,該事件觸發就不能再觸發ItemChanged事件了。該事件中的三個引數和ItemChanged事件中的三個引數完全相同。
返回值:可以使用return語句返回任意數值, 0表示放棄修改的資料,並顯示錯誤資訊,焦點不離開該單元,該取值是預設值;1表示放棄修改的資料但不顯示錯誤資訊提示,焦點不離開該單元;2表示接受剛剛修改的錯誤資料;3表示放棄剛剛修改的資料,並且焦點不離開該單元。

◆ItemFocusChanged
當焦點離開某單元時觸發該事件(不管內容有沒有改變)。該事件提供了row和dwo兩個引數,含義和前面介紹的完全相同。可以使用return語句返回任意數值,0表示繼續處理。
*不管編輯框中的內容有沒有改變,離開編輯框時觸發該事件,注意:當離開資料視窗時不觸發

◆PrintEnd
當列印工作完成時觸發該事件。引數PagesPrinted可以在指令碼中直接使用,是一個long型別的變數,表示已經被列印的頁數。

◆PrintPage
在資料視窗每頁進行列印格式處理之前觸發該事件。引數Copy和PageNumber在指令碼中可以直接使用,表示該頁要列印的份數和當前頁的頁號。返回值0表示不要跳過當前頁,1表示跳過當前頁。一般在該事件下編寫指令碼顯示列印進度資訊,例如:
st_1.text="正在列印第"+String(pageNumber)+ "頁……"
也可以在該事件中決定是否真正要列印該頁。例如,下面的指令碼只打印偶數頁碼的頁面:
If Mod(pagenumber,2) = 0 Then
return 0
Else
return 1
End If

◆PrintStart
資料視窗列印開始時觸發該事件。該事件中的引數PagesMax是一個long型變數,表示將要被列印的總頁數(不包括跳過的頁)。返回0表示繼續處理。

◆RetrieveEnd
當資料視窗檢索完畢時觸發該事件。引數rowcount是一個long型變數,表示檢索完後檢索到的記錄數。

◆RetrieveRow
每檢索到一條記錄時都觸發該事件。引數row是long型別變數,記錄當前檢索到的資料的序號。返回值0表示繼續檢索,1表示停止檢索。檢索大量資料之前可以設定中斷標誌,讓使用者在檢索過程中可以停止檢索。

◆RetrieveStart
當資料視窗的檢索操作將要開始時觸發該事件,該事件中沒有引數。返回值0表示繼續執行,該值是預設值,1表示不執行檢索,2表示在檢索之前不清除資料行和快取區。通常不在該事件下編寫指令碼,即使編寫指令碼,一般也是利用返回值2的特性來控制檢索操作不清除快取區,這樣可以將檢索到的資料新增到資料視窗中,並且在資料視窗中保留檢索之前的資料。

◆RowFocusChanged
當前行改變時觸發該事件。CurrentRow引數是一個long型別變數,儲存當前記錄號。該事件下的典型程式設計是修改當前行標識,將當前行明顯地標識出來,可以讓使用者清楚地知道要對哪行進行操作,在該事件和其他事件的配合下共同修改當前行標識。
*不管內容有沒有改變,當前行改變時觸發;在離開資料視窗時不觸發
*RowFocusChanging:當前行改變前觸發;引數currentrow觸發前所在行,newrow觸發後當前行;rowfocuschanged的currentrow等於rowfocuschanging的newrow

◆ScrollHorizontal
當使用游標鍵、Tab按鈕、滾動條等等在資料視窗中進行水平滾動時觸發該事件。很少在該事件上編寫指令碼。

◆ScrollVertical
當在資料視窗中使用游標鍵、滾動條、Tab鍵等進行上下滾動時觸發該事件。通常在該事件中編寫指令碼來改變當前行。因為當上下滾動資料視窗時,如果當前行不在當前顯示的區域內,則容易給使用者造成錯覺,可以在該事件中編寫指令碼將當前頁面的第一行資料設定為當前行。使用Describe和Evaluate函式可以實現該功能

◆SQLPreview
當執行函式Retrieve、ReselectRow和Update時,SQL語句要提交到DBMS,這時觸發該事件。該事件的引數比較複雜。
request:取值為PreviewFunctionReselectRow!、PreviewFunctionRetrieve! 或PreviewFunctionUpdate!分別代表觸發該事件的函式是ReselectRow、Retrieve和Update。 SQLtype:引起該事件的SQL語句型別。取值為PreviewDelete!、PreviewInsert!、PreviewSelect!、PreviewUpdate! 分別表示是Delete 、Insert、Select、Update語句。
SQLsyntax:string型別,取值為提交到DBMS的SQL語句。
buffer:當前SQL語句所涉及到的資料所在的快取區,取值為列舉型,Delete!、Filter!、Primary!分別表示刪除快取區、過濾快取區和主快取區。
row:long型別變數,表示該事件中涉及到的記錄數。
返回值0表示繼續處理,1表示停止處理,2表示處理下一個SQL請求。

◆UpdateEnd
當從資料視窗控制元件傳送來的對資料庫的修改都完成後觸發該事件。該事件的三個引數RowsInserted、RowsUpdated、RowsDeleted都是long型別的變數,分別表示插入、修改和刪除的記錄數。

◆UpdateStart
在呼叫了update函式之後、開始修改之前觸發該事件,該事件沒有引數。返回值0表示繼續處理,1表示停止修改。

◆LoseFocus
資料視窗失去焦點時觸發。
該事件中編寫指令碼,主要是保證使用者在資料視窗中最後輸入的內容不丟失。資料視窗中的輸入內容只有當焦點改變時才真正轉交給資料視窗,否則只是儲存資料視窗的編輯控制元件。指令碼比較簡單:this.AcceptText()
*GetFocus:資料視窗得到焦點時觸發。


【函式】

★SetTransObject
語法:dwcontrol.SetTransObject ( transaction )
功能:給資料視窗或者datastore控制元件dwcontrol設定事務物件transaction,預設事務物件是SQLCA。
返回值:成功設定事務物件則返回1,執行過程中發生了錯誤則返回-1,有任意引數為Null時返回Null。

★Retrieve
語法:dwcontrol.Retrieve ( {, argument, argument . . . } )
功能:使用資料視窗控制元件的當前事務物件檢索資料庫中的資料。如果資料視窗控制元件對應的資料視窗物件定義了檢索引數,則應該在該函式中指定檢索引數,引數的個數和資料視窗物件的檢索變數個數相等,對應的資料型別相相容。
返回值:返回資料視窗控制元件主快取區(PrimaryBuffer)中的記錄數,如果檢索資料時發生錯誤則返回-1,如果任意引數為Null則返回Null
*該函式的引數和資料視窗物件定義的引數的順序要相同,型別要相容。個數不能少於資料視窗物件定義的引數,即可以等於和多於資料視窗物件定義的引數,多的引數忽略。

★DeleteRow
語法:dwcontrol.DeleteRow ( row )
功能:刪除資料視窗dwcontrol中的第row行資料,如果row為0則表示刪除當前行的資料。
返回值:執行成功則返回1,執行錯誤則返回-1,如果任意引數為Null則返回Null。
*該函式執行後只是將被刪除的資料從資料視窗的主快取區移放到Deleted緩衝區,在資料庫中並沒有真正刪除資料,當正確執行了Update函式並且使用commit語句提交了事務後,才真正從資料庫中刪除該資料

★InsertRow
語法:dwcontrol.InsertRow ( row )
功能:在資料視窗dwcontrol的第row行前插入一行空白資料。當指定row為0時,表示在當前行之前插入一行空白資料。
返回值:返回插入的資料的行號,如果執行過程中發生錯誤則返回-1,如果任意引數為Null則返回Null

★Update
語法:dwcontrol.Update ( { accept {, resetflag } } )
功能:提交資料視窗或者datastore中的資料。如果accept為True,表示在提交資料之前自動執行AccpetText函式,否則不執行該函式,該引數預設為True;如果resetflag為True,表示資料提交後自動清除修改標識,該引數預設為True。
返回值:執行成功則返回1,發生錯誤則返回-1,如果dwcontrol為Null則返回Null

★AcceptText
語法:dwcontrol.AcceptText ( )
功能:該函式執行時,首先對當前編輯框中的內容進行對應欄位的校驗規則,能夠通過校驗規則,則儲存在對應欄位中,否則顯示校驗資訊提示錯誤。需要執行該函式的原因是,當在某欄位上的編輯框中輸入內容而沒有移動游標到別的欄位上時,其他控制元件獲得焦點,此時編輯框中的內容不能被儲存到欄位中,所以就應該在資料視窗失去焦點時執行該函式。
返回值:執行成功則返回1,執行過程中發生錯誤則返回-1,如果dwcontrol為Null則返回Null。
*該函式在資料視窗的ItemChanged事件中不起作用,因為專案改變是發生在接受編輯框中內容之後

★ModifiedCount
語法:dwcontrol.ModifiedCount ( )
功能:獲取資料視窗或者Datastore中被修改過但還沒有提交到資料庫中的記錄數。
返回值:返回long型別的資料視窗控制元件中被修改過的記錄數,如果沒有記錄被修改過或者修改後都已經儲存到了資料庫中則返回0,執行過程中如果發生錯誤則返回-1,如果dwcontrol為Null則返回Null。
*該函式獲得的修改過的記錄數包括主快取區和Filter快取區的被修改過的和新新增到資料視窗中的記錄數

★DeletedCount
語法:dwcontrol.DeletedCount ( )
功能:獲取資料視窗控制元件或者datastore控制元件dwcontrol中被刪除的記錄數。
返回值:返回long型別的已經被刪除但還沒有提交到資料庫中的記錄數,如果執行過程中發生了錯誤則返回-1,如果dwcontrol為Null則返回Null,如果沒有刪除過記錄則返回0

★RowsMove
它可以將資料從一個緩衝區移動到另外緩衝區中。該函式的語法是:
dwcontrol.RowsMove ( startrow, endrow, movebuffer, targetdw, beforerow,   targetbuffer )
其中,dwcontrol是進行移動操作的源資料視窗;startrow和endrow是要移動資料的範圍(包括這兩個行號的資料);movebuffer指要從哪個快取區移出資料,可以是Primary!、Delete!、Filter!;targetdw是目標資料視窗控制元件名稱;beforerow表示在目標資料視窗的哪一行之前插入移入的資料,如果該數值比目標資料視窗的行數大,則在最後插入移入的資料;targetbuffer是目標快取區,取值同movebuffer一樣。

★GetItemStatus和SetItemStatus
使用函式dwcontrol.GetItemStatus ( row, column, Primary! )可以獲取該緩衝區內指定單元的狀態,當引數column為0時,表示讀取整個行的修改狀態。有以下狀態。
NotModified! :指定單元的資料和原始資料相同,沒有修改過。
DataModified!:指定單元的資料和原始資料不同,修改過。
New!:該資料行是新增加的,但還沒有在該行上輸入資料。
NewModified!:該資料行是新增加的,並且已經在該行上錄入了資料。
這些修改標識都是由資料視窗自動維護的,一般情況下沒有必要編寫指令碼修改這些標記,但並不是說就不能修改。PowerBuilder提供了函式SetItemStatus,它的語法是:
dwcontrol.SetItemStatus ( row, column, dwbuffer, status )
其中,row引數指定將要修改狀態的行;column引數指定將要修改狀態的列(可以是整型的列號,也可以是string型別的列名),當列號為0時表示要修改row指定的整行的狀態;dwbuffer指定要修改哪個緩衝區(肯定不能是original),status為上面的四個取值中的一個,但不是任意的取值,因為有些狀態不能用該函式設定成另外一種狀態,必須是能夠轉換的狀態。下面列出了能夠轉換的狀態。
    期望的狀態 New!   NewModified! DataModified! NotModified!
當前狀態
New!   \   Yes   Yes   No
NewModified! No   \   Yes   New
DataModified! NewModified! Yes   \   Yes
NotModified! Yes   Yes   Yes   \
表中的Yes表示可以使用SetItemStatus進行該狀態設定,No表示不會產生預期的狀態,如果標明瞭某個特定的狀態,則說明是新的狀態,而不是期望的狀態。例如,資料視窗dw_1的第1行第1列的當前狀態為DataModified!,使用函式dw_1.SetItemStatus(1,1,New!)後,第1行第1列的狀態改變為NewModified!。同樣對於該資料視窗dw_1,如果使用函式dw_1.SetItemStatus(1,1,NotModified!),則會將其狀態改變為NotModified!。當從一種狀態不允許轉變到另一種狀態時,可以修改成其他一箇中間狀態,然後再進行一次轉換。例如,要從new!改成NotModified,應該首先轉換到DataModified!

★GetItemX
讀取資料視窗中的資料
dwcontrol.GetItemX( row, column {, dwbuffer, originalvalue } )
其中的X可以替換成Date、DateTime、Decimal、Number、String、Time,所以讀取資料的函式有6個。引數row表示要讀取哪行的資料,是一個long型別數值。column代表列,可以是string型的列名,也可以是整型的列號。dwbuffer是DWBuffer列舉型,取值Primary!、Delete!、Filter!分別代表主緩衝區、刪除緩衝區和過濾緩衝區。originalvalue為Boolean型,表示是否讀取最近一次檢索時檢索到的初始值,當指定dwbuffer時必須指定該引數,該引數和dwbuffer都是可選的。函式正確執行則返回對應型別的資料,執行過程中發生錯誤則返回空值(""),任何引數為Null則返回Null

★SetItem和SetText
函式SetItem的語法格式是:
dwcontrol.SetItem ( row, column, value )
各個引數的含義如下。
dwcontrol:資料視窗或datastore控制元件名稱。
row:要設定的資料所在行。
column:要設定的資料所在的列。可以用整型列號,也可以用string型列名。
value:要設定的值,應該和要設定的列的型別一致。
函式正確執行則返回1,這時資料視窗中row行column列顯示的資料是剛剛用該函式設定的資料,如果函式執行過程中發生錯誤則返回-1。注意,該函式執行時僅僅檢查函式中指定資料的型別和欄位的型別是否一致,不會進行有效性校驗,包括在資料視窗中設定的校驗規則、在ItemChanged事件中編寫的校驗規則、在ItemChanged呼叫的校驗規則都不會執行。
函式SetText的語法格式是:
integer dwcontrol.SetText ( string text )
功能是設定當前編輯框中的內容。注意,當編輯框離開當前單元時要進行有效性校驗,如果校驗資料正確,則當前欄位接受該資料,否則觸發ItemError事件。所以,可以使用該函式給帶有校驗規則的欄位設定資料。
EG:
int li_i
dw_1.SetColumn("name")     //使name列成為當前列
For li_i = 1 To dw_1.RowCount()
         dw_1.SetRow(li_i)                //使第I行成為當前行
                  dw_1.SetText("屁")               //向當前編輯框中寫入內容
Next
dw_1.SetColumn("sex")                 //選中性別列,保證最後一個也要通過校驗規則

★SetColumn、SetRow和GetColumn、GetRow和GetClickedColumn、GetClickedRow和GetColumnName
設定當前列
integer dwcontrol.SetColumn ( string column)
integer dwcontrol.SetColumn ( integer column)
設定當前行
integer dwcontrol.SetRow ( long row )
得到當前列
integer dwcontrol.GetColumn ( )
得到當前行
long dwcontrol.GetRow ( )
得到使用者單擊的列
integer dwcontrol.GetClickedColumn ( )
得到使用者單擊的行
long dwcontrol.GetClickedRow ( )
得到當前列的名
string dwcontrol.GetColumnName ( )

★SetFilter、Filter和Find
這兩個函式必須配對使用,首先使用函式SetFilter設定過濾規則,然後用函式Filter進行過濾。過濾規則是boolean型別的表示式,能夠使用過濾規則的,將表示式為True的資料行顯示在資料視窗中,使其為False的資料行被移送到資料視窗的Filter!快取區。在設計資料視窗物件時也可以定義過濾規則,使用這兩個函式可以根據需要來動態改變過濾規則。在設計時,指定了過濾規則的資料視窗可以使用這兩個函式再進行過濾。每次過濾都是對資料視窗的Original!快取區進行的,而不是在前一次過濾出來的資料基礎上再次過濾。
函式SetFilter的語法是:
dwcontrol.SetFilter ( format )
其中,dwcontrol是要進行過濾的資料視窗控制元件名稱。format是過濾規則,string型別。過濾規則是由欄位、常量、運算子、函式構成的boolean表示式。需要取消過濾規則顯示所有的資料時,可以指定過濾規則為空(""),如果讓使用者可以隨便指定過濾規則,則可以使用Null的過濾表示式,這時PowerBuilder提供一個和資料視窗設計時相同的過濾規則指定視窗。該函式正確執行返回1,否則返回-1。執行完後,資料視窗中顯示的資料沒有發生變化,只有當執行了Filter函式後才按照剛剛指定的過濾規則顯示資料。
該函式的語法是:
dwcontrol.Filter ( )
dwcontrol是和SetFilter中同名的資料視窗控制元件名稱。該函式執行正確則返回1,否則返回-1,如果dwcontrol為Null則返回Null。
函式Find也可以用來進行查詢。該函式可以在資料視窗中的指定範圍查詢符合某些條件的資料。該函式的語法格式是:
dwcontrol.Find ( expression, start, end )
其中,dwcontrol是要進行查詢的資料視窗控制元件名稱,expression是表示式,含義和注意事項同SetFilter中的完全相同。start和end都是long型別變數,用行號表示的查詢範圍,它們之間沒有大小約束。函式返回的是在指定範圍內找到的第一個符合條件的記錄號,如果沒有找到或發生了錯誤則返回0,如果引數有Null的則返回Null

★SetSort和Sort
資料的排序可以在資料視窗物件設計時就指定排序規則,也可以在指令碼中動態指定。使用函式SetSort和Sort可以完成這一任務,它們和SetFilter、Filter一樣也必須配對使用。函式SetSort設定排序的規則,不改變資料的顯示,只有當執行了函式Sort時,資料才真正進行重新排列。
函式SetSort的語法是:
dwcontrol.SetSort ( format )
其中,dwcontrol為要進行排序的資料視窗控制元件的名稱;format為排序規則,是string型別,由欄位、函式、ASC或DESC、邏輯聯結符、常數構成。可以使用欄位名,也可以使用欄位號來表示欄位,欄位號的格式是#X,其中X為正整數。該函式正確執行返回1,否則返回-1。
和SetFilter函式類似,當指定format為空("")時,可以取消排序,當指定format為Null時,可以由使用者指定排序規則。
使用函式SetSort後,再使用Sort函式才能重新排列資料。
該函式的格式是:
dwcontrol.Sort ( )
其中,dwcontrol是和SetSort中同名的資料視窗控制元件名稱。該函式正確執行則返回1,否則返回-1,如果引數dwcontrol為Null,則返回Null。

★SelectRow 
選中指定的行
dwcontrol.SelectRow ( row, boolean )
其中,dwcontrol是資料視窗控制元件的名稱;row是行號,該引數為0則表示是對資料視窗中的所有資料行進行操作;boolean表示是否選中,如果是True,表示選中行號row的資料行,如果是False則取消。該函式正確執行返回1,發生錯誤返回-1,如果引數有Null則返回Null。

★PrintSetup、Print、PrintOpen、PrintDatawindow、PrintClose、PrintCancel
PrintSetup():
列印設定
PrintOpen():
啟動列印作業
PrintOpen函式用來開啟一個作業,並返回當前可以使用的列印作業號,該列印作業號可以標識當前的列印工作。該函式的語法是:
PrintOpen ( { jobname } )
如果發生錯誤,該函式返回-1。列印作業名稱是可選的,名字在列印佇列中。在列印作業的最後必須關閉列印作業,使PowerBuilder和Windows清除列印作業所佔用的所有資源。因此,每個啟動作業的語句都有一個關閉作業的語句相對應。
PrintClose()、PrintCancel():
關閉列印作業
有兩個函式可以用來關閉列印作業。PrintClose()函式把當前頁傳送給印表機,並關閉當前列印作業。語法格式為:
       PrintClose(printjobnumber)
函式PrintCancel()取消列印作業並刪除當前的列印檔案。這個函式可以與Print或者PrintDataWindow()函式組合使用。用於PrintDatawindow()的語法是:
DatawindowControl.PrintCancel()
用於Print()的語法是:
       PrintCancel(printjobnumber)
PrintClose()函式和PrintCancel()函式是互相排斥的,成功呼叫過一個以後,不要在沒有再次開啟列印作業時呼叫另一個函式。
PrintDatawindow():
該函式是以單個列印作業的形式列印資料視窗控制元件中的內容。PowerBuilder使用資料視窗物件中定義的字型和佈局進行列印。用這個函式可以在一個列印作業中列印多個數據視窗,但是每個資料視窗控制元件都從新的一頁開始列印;如果要讓幾個資料視窗列印在同一頁中,則需要利用底層的列印函式或將要列印在同一頁中的資料視窗,建立成一個composite顯示樣式的資料視窗。PrintDatawindow函式的語法是:
PrintDatawindow(printjobnumber,datawindow)
其中,printjobnumber是PrintOpen函式返回的列印作業號,datawindow是要列印的資料視窗控制元件的名稱。除了能夠和Printopen()、PrintClose()函式共同使用外,其他函式都不能和PrintDatawindow共同使用。下面是一個完整地使用函式PrintDatawindow()進行資料視窗列印的例子,該例子中同時列印三個資料視窗:
Long ll_job
Ll_job = PrintOpen("資料視窗列印")
PrintDatawindow(ll_job,dw_1)
PrintDatawindow(ll_job,dw_2)
PrintDatawindow(ll_job,dw_3)
PrintClose(ll_job)                  //關閉列印作業
Print():
該函式是一個通用的函式,可以用來列印PowerBuilder中許多可視物件。下面介紹列印資料視窗時的語法,格式如下:
datawindowname.Print ( { canceldialog } )
datawindowname為要列印的資料視窗控制元件名稱,canceldialog是一個boolean型變數,指示在列印時是否顯示一個無模式的可以隨時取消列印的視窗,該變數預設為True。該函式正確執行則返回1,執行過程中發生錯誤則返回-1。
*雖然該函式和PrintDatawindow一樣都可以列印資料視窗,但是它們之間是有區別的。Print函式使用設定在資料視窗物件的列印規範來列印資料視窗,而PrintDatawindow函式使用印表機當前的設定來列印資料視窗。