PB數據窗口控件-datawindow

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函數使用打印機當前的設置來打印數據窗口。

發佈了93 篇原創文章 · 獲贊 9 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章