PB常用函數


彈出窗口:messagebox()

基本寫法:Messagebox('標題','內容')

完整寫法: MessageBox ( '標題','內容',圖標,按鍵,默認值)
           

(1)其中標題與內容為要顯示的字符串,不可省略,但可以省略,即什么也不顯示,例如Messagebox('','')這樣也是正確的單里面的東西一樣也不能少!
   (2)圖標可選值: Question!或None! 或Information!或 StopSign! 或 Exclamation!(默認圖標) 
   (3)按鍵可選值: OK! (默認方式)或 OKCancel! 或 YesNo! 或YesNoCancel! 或RetryCancel! 或AbortRetryIgnore!
   (4)默認值為可選: 1 (默認選擇)或 2 或 3(即彈出消息框時的默認選擇按鈕)

該函數有返回值,1,2,3對選擇的按鍵。

基本寫法事例: MessageBox('此處為標題,'此處為內容')
完整寫法事例: 
if MessageBox('提示信息','是否刪除?',&Question! ,OKCancel! , 1 ) = 1 then//選擇確定
MessageBox('提示信息', '你選擇了刪除')
else//選擇取消
   MessageBox('提示信息','你選擇了不刪除')
end if

設置焦點:setfocus()
對象名.setfocus
sle_1.setfocus()

用format菜單下的tab order命令可以修改焦點順序。把用戶名和密碼框分別設為10,20,確定按鈕設為30就行了。也可以用控件的setfocus()方法設置焦點。

觸發事件:triggerevent()
對象名.triggerevent()
(1)函數作用:觸發指定對象的指定事件,並且立即執行該事件中的腳本。注意該函數和PostEvent的區別。PostEvent不是立即執行,TriggerEvent是立即執行觸發事件的腳本。
(2)函數語法:objectname.TriggerEvent ( event{, word, long } )
     z objectname:PB中任何對象或者控件,只要有可以觸發的事件就可以。
     z event:要觸發的事件。可以是枚舉類型或者String類型。PB提供的事件可以使用枚舉或者String類型來表示,比如Clicked!或者‘Clicked’都可以代表Clicked事件;自定義的用戶事件只能使用String來表示。需要注意的是,這里的事件應該提供了腳本。
     z word:該參數不是必需的。當需要傳遞數據給被觸發的事件時使用word和long參數。這兩個參數都可以傳遞long類型的數據,但是參數long還可以傳遞string類型的數據,而該參數僅能傳遞long類型的。如果使用了該參數,在被觸發的事件中使用Message.WordParm接收傳遞過去的數據。如果不使用該參數傳遞數據而是使用參數long進行傳遞,則將該參數設置為0。
    z long:該參數也不是必須的,用來傳遞long或者string類型的數據。使用Message.LongParm接收傳遞的數據。當傳遞string類型的數據時,對象Message.LongParm中保存的是所傳數據的存儲地址,必須使用string(XX,’address’)來讀取該地址中的string類型數據。
返回值:Integer類型。如果返回1,表示該函數執行成功;如果指定事件中沒有腳本或者

函數執行錯誤,則返回-1。當任意參數為Null時,函數返回Null。
代碼實例:
例子1,觸發缺省事件:
cb_1.TriggerEvent(Clicked!)
等價於:
cb_1.TriggerEvent(“Clicked”)
例子2,觸發用戶自定義事件:
w_main.TriggerEvent(“ue_open”)
例子3,傳遞信息和接收信息:
w_main.TriggerEvent(“ue_open”,0,’test’)
在用戶自定義事件ue_open中接收數據:
string ls_msg
ls_msg = String(Message.LongParm,’address’)
例子4,傳遞long數據:
w_main.TriggerEvent(‘ue_open’,100,0)
在用戶自定義事件ue_open中接收數據:
long ll_msg
ll_msg = Message.WordParm

 

關閉窗口:Close()和CloseQuery()
   這兩個事件是比較重要的事件,尤其對於進行數據處理的窗口。在這兩個事件中編寫腳本可以避免用戶因疏忽退出窗口而丟掉在數據窗口中的修改數據。

Close事件在觸發Deconstructor之前所執行的最后一個事件,CloseQuery事件在Close事件觸發之前發生。設置CloseQuery事件是為了增強可靠性。通常在CloseQuery事件中判斷某些工作是否完成,並顯示一個提示窗口詢問用戶,根據用戶的確認,返回一個值來決定是否觸發窗口的Close事件。返回值為1,表示取消關閉動作;返回值為0,表示繼續執行Close事件。

比如,可以在CloseQuery事件中編寫如下腳本,判斷是否保存了數據窗口中的修改,並詢問用戶是否保存數據,根據用戶的回答決定是否觸發Close事件。在“關閉”按鈕上編寫腳本Close(parent),然后在CloseQuery中編寫如下腳本:

Int li_flag

//如果數據窗口中沒有修改,則允許執行Close,直接返回

If dw_1.ModifiedCount() <= 0 Anddw_1.DeletedCount() <= 0 Then Return 0

         //如果數據窗口有修改,詢問用戶是否保存

         li_flag = MessageBox("提示","數據已經修改,是否保存?",Question!,YesNoCancel!,1)

Choose Caseflag_i                //根據用戶選擇執行

                   Case1                 //用戶選擇要保存數據

                            Ifdw_1.Update() = 1 Then            //如果修改數據成功

                                     Commit;                                 //提交

                            Return0                                 //繼續執行Close事件

                            Else            //修改數據不成功

                                     rollback;              //回退事務

                                     li_flag= MessageBox("提示","數據錯誤,是否繼續關閉!",&

Question!,YesNoCancel!,2)         //顯示錯誤

                                     Ifli_flag = 1 Then

Return0                  //允許關閉

                                     Else

                                               Return1              //不允許關閉

                                     EndIf

                            EndIf

                   Case2                 //用戶選擇不保存數據

                            Rollback;             //回退事務

                            Return0              //允許執行Close事件

                   Case3                 //用戶選擇取消

                            Return1              //不允許關閉

         EndChoose         //用戶所有的選擇情況處理完畢

 

通過上面的腳本,可以為用戶提供一個很健壯的數據處理窗口。即使直接關閉該窗口,在數據窗口中所做的數據修改也不會丟失,除非用戶自己想放棄。

       另外,需要注意的是,在其他事件中調用或者觸發(使用TriggerEvent函數、PostEvent函數或者是對象名稱.Event 事件名稱格式調用事件)Close事件,都只是執行該事件中的腳本,並不真正關閉窗口。也就是說,應該區別事件和事件處理腳本,這兩者雖然有很多的聯系但並不相同。 PB中的所有事件和事件處理腳本都是有區別的。

默認數據庫鏈接變量:sqlca
dw_name.settransobject(sqlca)鏈接數據庫
sqlca.sqlcode = 0 有數據\\ = 100 無數據
鏈接數據庫
connect;一般用於程序open的時候,跟在數據庫鏈接代碼后面
打開窗口:open( )
open(windowname)
在Application中聯上數據庫。。
// Profile djerp1
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=djerp;UID=sa;PWD=djerp'"
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox("提示","數據庫連接錯誤!")
Return

Elseif SQLCA.sqlcode = 0 Then
  Open(w_main) //打開主操作窗口
end if

關閉應用:halt close()
halt close

halt 直接結束應用程序

halt close 會執行application對象中的Close 事件的代碼,會在結束應用程序,前釋放所有的實例
從ini配置文件中提取string數據
profilestring('文件名,可以包含路徑','主要字節','在主要字節下的關鍵字','如果找不到數據則返回的數據')

斷開鏈接
disconnect;一般用於程序close的時候
是否修改過:isrowmodified()
if dw_1.modifiedcount()+dw_1.deletedcount()>0 then
.......//數據窗口處於修改狀態
end if

是否新增的:isrownew()
數據窗口中的if函數
if(true\false,'為true時返回的值','為false時返回的值',)
如:if(isrownew(),'新',if(isrowmodified(),'改','舊'))

插入空行:insertrow(0)
dw_name.insertrow(0)   
通常配合插入行使用的是滾動行  
dw_name.scrolltorow(dw_name.insertrow(0)) \\滾動到插入行
比如:int row

row = dw_1.insertrow(0)

//顯示

dw_1.scrolltorow(row)

//使用

dw_1.object.column[row]

從數據窗口中提取數據:getitem( )
dw_name.getitem\\string\date\......(row,'數據來源控件名')
string dwcontrol.GetItemString ( long row,integer column {, DWBuffer dwbuffer, boolean originalvalue } )

String dwcontrol.GetItemString ( long row, string column {,DWBuffer dwbuffer, boolean originalvalue } )

getitem首先根據數據窗口不同的字段類型,有不同的函數。比如對於字符型使用getitemstring,對於數字,getitemnumber,對於日期gettiemdatetime。

設置數據窗口的數據:函數setItem()
   (1).dw_name.setitem(row,'要設置的控件名','要設置進去的數據')
   (2).函數作用:給指定的數據窗口或者Datastore中的、指定單元設置數據,通過行和列來確定哪個單元。該函數直接修改緩沖區中的數據,而不是針對顯示界面進行修改,修改成功之后,數據窗口控件上會自動反映出最新的內容來。而函數SetText則針對顯示界面進行修改,如果能夠通過字段的校驗規則,才能夠進入到數據窗口對應的緩沖區中。注意這兩個函數的區別。

(3).函數語法:integer dwcontrol.SetItem (long row, integer column, any value )

integer dwcontrol.SetItem ( long row, string column,any value )

dwcontrol:要設置數據的數據窗口控件、DataStore或者子數據窗口的名稱。

row:要設置數據的行,為long類型。

column:要設置數據的列,可以是string類型的列名稱,也可以是integer類型的列號。

lvalue:要設置的數據。類型根據數據列而定,兩者的數據類型應該保持一致。

返 回 值:integer類型,1表示函數執行成功,-1表示函數執行失敗。如果有任意一個參數為Null,則函數返回Null。

(4).代碼實例:

例子1,下面腳本在第一行的hire_date列中設置數據:

dw_order.SetItem(1, "hire_date", 1993-06-07)

例子2,當用戶在數值類型的字段中輸入內容,然后又刪除后要離開該單元時,數據窗口嘗試着將‘’賦值給該單元,這時會導致內容不能通過校驗規則而產生錯誤。解決的辦法就是在數據窗口控件的ItemError事件中編寫下面的腳本:

integer li_Null

String ls_type

ls_type = This.Describe(dwo.name + '.ColType')

ls_type = Left(Lower(Trim(ls_type)),3)

choose case ls_type

case 'dec','int','lon','num','rea','ulo'

This.SetItem(Row,integer(dwo.ID),li_Null)

end choose

return 2

窗口與窗口之間的傳值,子窗口
closewithreturn(主窗口,'返回給主窗口的值')
接收子窗口返回的值 = message.stringparm

string as_cpbh 
long ll_row 
ll_row=dw_1.getrow() 
if ll_row>0 then 
as_cpbh=dw_1.object.cpbh[ll_row] 
openwithparm(w_ylxx,as_cpbh) 
else 
messagebox("系統提示","請選擇記錄!") 
end if 
接收窗口的open事件如下: 
string as_cpbh 
as_cpbh=message.StringParm 
//is_cpbh=as_cpbh 
DW_1.Settransobject(sqlca) 
dw_1.retrieve(as_cpbh)

轉換大小寫:Lower()&Upper()
lower(string)轉換為小寫的;upper(string)轉換為大寫的;
(1)函數功能:將字符串中的大寫字母轉換為小寫字母。

(2)函數語法Lower  (   string   )

參數string:要將其中的大寫字母轉換為小寫字母的字符串返回值String。函數執行成功時返回將大寫字母轉換為小寫字母后的字符串,發生錯誤時返回空字符串("")。如果string參數的值為NULL,Lower()函數返回NULL。

(1)   功能將字符串中的小寫字母轉換為大寫字母。

(2)   語法Upper(   string   )

參數string:要將其中的小寫字母轉換為大寫字母的字符串返回值String。函數執行成功時返回將小寫字母轉換為大寫字母后的字符串,發生錯誤時返回空字符串("")。如果string參數的值為NULL,Upper()函數返回NULL。   

為數據窗口設置事物對象
dw_name.settransobject(sqlca\也可以是自己定義的)
settrans():用指定的事務對象來設置數據窗口控件內部事務對象的值。
settransobject():給數據窗口控件設置事務對象,並提供控制事務的能力,包括程序中提交事務的能力

清零數據:reset()
dw_name.reset()
dw_1.reset():  將數據窗口控件dw_1中的數據清除。

檢索數據:retrieve()
dw_name.retrieve(里面可以有參數變量不過要與數據窗口中定義的類型與順序一樣)
dw_1.retrieve():強制dw_1數據窗口控件從數據庫讀數據,即從數據庫中檢索數據。

注:retrieve之前要settransobject()和reset()一下datawindow
過濾數據:setfilter(),filter()
dw_name.setfilter(string類型\\"name ='"+ls_name+"'")
dw_name.filter()
(1)函數作用:為DataWindow或者DataStore指定數據過濾規則。通常在調用該函數前使用函數Retrieve將數據檢索到客戶端,該函數可以決定檢索到客戶端的這些數據哪些可以顯示,哪些不能顯示。該函數對客戶端的數據進行操作,和后台數據庫沒有任何關系。在設置完過濾規則后使用函數Retrieve檢索數據是不合理的,每次設置過濾規則后都檢索數據,這樣的執行效率很低。需要注意的是,該函數緊緊是設置過濾規則,並不進行過濾。函數Filter是進行過濾的,使用最近設置好的過濾規則對數據進行過濾。
(2)函數語法:integer dwcontrol.SetFilter ( stringformat )
(3)ldwcontrol:要為其設定過濾規則的DataWindow、DataStore或者下拉子數據窗口控件的名稱;
lformat:作為過濾規則的表達式,該表達式的返回值應該是Boolean類型,或者是True、或者是False。如果表達式返回值為Null,則在執行函數Filter時自動彈出對話框讓用戶指定過濾規則。在表達式中可以使用數據窗口對象函數、列名、列號、數字、字符串等。如果用到了列號,則應該以‘#’開頭、后面緊跟數字來表示。多個條件可以使用邏輯運算符進行聯結,一個非常良好的習慣是每個條件都應該使用括號。這樣既可以保證表達式的清晰,又可以避免一些Bug。后面的代碼實例中會講到。
返回值:數字類型,1表示執行成功,-1表示執行失敗。該函數的返回值沒有多大意義,很少在程序中使用該返回值。
(4)代碼實例:
例1:使用列名進行過濾。
string ls_filter

ls_filter ="cust_qty > 100 and cust_code >30"
dw_Employee.SetFilter(ls_filter)
dw_Employee.Filter( )
例2:必須使用括號的情況。下面的腳本在邏輯上看起來沒有什么問題:
String ls_filter

ls_filter =“(name like ‘張%’) and (article_title like ‘%計算機%’)”
dw_1.SetFilter()
dw_1.Filter()

例3:取消過濾規則。下面兩個語句都能實現:
語句1:dw_1.SetFilter(“”)
語句2:dw_1.SetFilter(“1=1”)
例4:下面的語句在運行時可以讓用戶自己指定過濾規則:
String ls_null

SetNull(ls_null)
dw_1.SetFilter(ls_null)
dw_1.Filter()
例5:下面腳本可以判斷數據窗口中是否有主鍵重復的數據。假設數據窗口中的主鍵是dept_id:
string ls_fieldname//主鍵名稱
long ll_rc//數據窗口中總的數據行數

ls_fieldname ="dept_id"
dw_1.SetFilter("1=1")//取消過濾規則,顯示全部的數據
dw_1.Filter()//過濾
ll_rc = dw_1.RowCount()//保存數據行數
dw_1.SetSort(ls_fieldname + " A")//用主鍵進行排序
dw_1.Sort()

//下面語句是核心語句。該過濾規則的含義是:只顯示相鄰行不同的數據。
dw_1.SetFilter(ls_fieldname + " <> " + ls_fieldname +"[-1] or GetRow() =1")
dw_1.Filter()
if dw_1.RowCount() < ll_rc then
MessageBox("提示",ls_fieldname + "列中存在重復的數據!",StopSign!)
end if

注:取消過濾為dw_name.setfilter("1=1")
數據排序:setsort(),sort()
dw_name.setsort(string類型\\"name a\d" :其中a為升序,的d為降序)
dw_name.sort()
(1)函數語法:dwcontrol.SetSort ( format )

z dwcontrol:數據窗口控件名

z format:string 類型,其值是有效的排序條件。排序條件中可以使用列名或列號,使用列號時,在列號前加上個#符號。如果 format 參數的值為 NULL,那么程序運行時 PowerBuilder 會提醒用戶輸入排序條件

返回值: Integer。函數執行成功時返回 1,發生錯誤時返回-1。

使用說明:在定義數據窗口對象時,可以同時定義排序條件。當使用函數 SetSort()定義新的

排序條件后,新的排序條件將取代原有的排序條件。但是,執行 SetSort()函數后,數據窗口並沒有真正排序數據。要完成排序工作,需要執行數據窗口控件的對象函數 Sort()。

按某列排序時,在排序條件中放上列名或列號,后跟上“A”或“D”指明排序方式。其中“A”表示升序,“D”表示降序。要按多個列排序時,在每個列的排序條件之間用逗號(,)分隔。下面是兩個排序條件示例:

"emp_lname A" "emp_lnameA, dept_id D" 如果想讓用戶在程序運行時指定排序條件,那么可以這樣做:以空值作為

SetSort() 函數的參數來調用 SetSort() 。程序運行時, PowerBuilder 會顯示“SpecifySortColumns”對話框,讓用戶指定排序方式。之后調用 Sort()函數完成實際排序。

代碼實例:

例 1. 下面的語句為數據窗口控件 dw_employee 定義排序條件,該條件的意義為:按 emp_status 列升序排序,按emp_salary 列降序排序:

dw_employee.SetSort("emp_status A,emp_salary D")

示例 2. 下面的語句為數據窗口控件 dw_emp 設置了按 emp_status 列升序排序、按 emp_salary 列降序排序的排序條件,然后調用 Sort()函數完成實際排序工作:

string ls_newsort

 

數據分組:groupcalc()
dw_name.groupcalc()重新分組一般都是在filter()或sort()后面,以確保分組的正確性
當應用程序使用FILTER()函數過濾帶有分組的數據窗口后,如果想繼續保持分組特性,那么需要執行FILTER()函數后調用GroupCalc() 函數。 
當用戶或者應用程序在數據窗口控件中增加了某些行或者修改了某些數據后,原有的分組情況可能不在符合現有的分組原則了,此時,應用程序可以調用GroupCalc () 函數來強制數據窗口重新分組。 
GroupCalc () 函數在重新分組之前並不重新排序數據,因此,如果數據窗口沒有定義排序方式,那么在執行GroupCalc ()函數之前應該首先執行數據窗口控件的Sort()對象函數進行排序。

如:

dw_stat.SetRedraw(false)   
dw_stat.setsort("acptsiteid,mophonecode") 
dw_stat.sort() 
dw_stat.GroupCalc()//重新計算分組   
dw_stat.SetRedraw(true)

 

防止刷新,提高效率
dw_name.setredraw(false)
dw_name.reset()\retrieve()\filter()\sort()\groupcalc():中間是數據操作
dw_name.setredraw(true)
校驗數據:accepttext()
dw_name.accepttext() = 1為通過檢驗 <>1為不通過
一般寫在要對數據窗口進行操作取數的時候,寫在這些動作前面
AcceptText()
功能
 將“漂浮”在數據窗口控件上編輯框的內容放入到數據窗口控件的當前項中(主緩區中)。在將數據放入到當前項之前,編輯框中的數據必須通過有效性規則檢查
語法
  dwcontrol.AcceptText ( )
參數
  dwcontrol:數據窗口控件名返回值
  Integer。函數執行成功時返回1,出現錯誤(比如數據不滿足有效性規則)時返回-1。
  如果dwcontrol為NULL,則AcceptText()函數返回NULL。用法當用戶在數據窗口中從一個項移動到另一個項時,數據窗口檢查用戶輸入或修改數據項數據值的有效性並把這些數據放入到數據窗口控件的主緩沖區中。如果用戶修改了數據窗口的某個數據項后立刻把輸入焦點移動到同一個窗口的其它控件,那么數據窗口控件並沒有把用戶新修改的數據放入到數據窗口控件的主緩沖區,這些數據依然保存在“漂浮”在數據窗口控件當前項上面的編輯框中。這種情況下,使用AcceptText()函數把用戶新修改的數據放入到數據窗口控件的主緩沖區中。調用AcceptText()函數的典型地方是在用戶自定義事件中,該事件可通過在數據窗口控件的LoseFocus事件處理程序中調用PostEvent()函數來觸發。
   需要注意的是,不要在數據窗口控件的ItemChanged事件處理程序中調用AcceptText()函數。AcceptText()函數還可能觸發數據窗口控件的ItemChanged或ItemError事件。
示例1. 下面的代碼是命令按鈕Clicked事件處理程序的一部分,它讀入用
戶對數據窗口控件dw_Emp中當前數據的修改,並計算balance列值大於0的行數:
integer i, 
Countdw_employee.AcceptText()  //接收編輯控件中用戶修改的數據
FOR i = 1 to dw_employee.RowCount()
  IF dw_employee.GetItemNumber(i,'balance') > 0 THEN
     Count = Count + 1
  END IF
NEXT

修改的行數:modifiedcount()
dw_name.modifiedcount()
ModifiedCount()函數是確定DataWindow中被修改的行數(包括插入行),比如:dw_text.ModifiedCount() 如果自前一次更新(如果沒有更新,則從上一次檢索)后沒有修改行或插入行,則返回0,出錯返回-1

刪除的行數:deletedcount()

如果deletedcount()+modifiedcount()> 0 則表明數據窗口有操作

統計行數:.rowcount()
dw_name.rowcount()

(1)函數作用:返回數據窗口控件當前可用行數(提取的所有行數減去刪除的行數,加上插入的 行數,再減去過濾掉的行數,即當前主緩沖區中數據行數)。

(2)函數語法: dwcontrol.RowCount()

參數: dwcontrol:數據窗口控件名

返 回 值: Long。函數執行成功時返回主緩沖區中數據行數,發生錯誤時返回-1。如果

dwcontrol 的值為 NULL,則 RowCount()函數返回 NULL。

使用說明:數據窗口控件主緩沖區中的數據行顯示在數據窗口中,用戶能夠操作或打印它們。 這部分數據的數據行數可以使用 RowCount()函數得到。主緩沖區中數據的行數等 於提取的所有行數減去刪除的行數,加上插入的行數,再減去過濾掉的行數。刪 除的數據行和過濾掉的數據行分別保存在數據窗口控件的刪除緩沖區和過濾緩沖 區中。

(3)代碼實例:

例 1. 下面的代碼得到數據窗口控件 dw_Employee 中當前可用行的行數:

long NbrRowsNbrRows = dw_Employee.RowCount()

例 2. 下面的代碼檢測用戶是否已經滾動到數據窗口控件的末尾。它通過將數據窗 口主緩沖區中的行數與數據窗口對象的 LastRowOnPage 屬性相比較來得到:

dw_1.ScrollNextPage()

IF dw_1.RowCount() = Integer(dw_1.Describe( &

 

"DataWindow.LastRowOnPage")) THEN

 . . . //  所需的其它處理

END IF

保存數據:update()
if dw_name.update()=1 then \\= 1為成功
  commit using sqlca; --提交數據
else
  rollback using sqlca; --回滾數據
end if   
選擇行:selectrow()
dw_name.selectrow(row,true\false)
(1)函數作用:選中或者取消選中數據窗口、DataStore中的一行或者所有行數據。該函數的執行不會改變當前數據行。也就是說,如果第2行是當前數據行,執行完該函數,比如dw_1.SelectRow(5),第2行仍然是當前數據行。

 

(2)函數語法:integer dwcontrol.SelectRow ( long row, boolean select)

ldwcontrol:數據窗口、DataStore或者子數據窗口。

lrow:long類型,要選中或者取消選中的數據行行號。如果該參數為0,表示對所有的數據行進行操作。

lselect:Boolean類型,取值為True表示要選中指定的數據行(不管在執行函數之前是否是選中的);取值為False表示要取消選中指定的數據行(不管執行函數之前是否沒有選中)。

返 回 值:函數執行成功返回1,執行錯誤返回-1,任何參數為空則返回Null。

(3) 代碼實例:

例1:數據窗口中多行選中程序。

首先定義窗口實例變量:

long il_LastSelectedRow = 1

然后開始編寫多行選中程序。程序算法描述如下:

1)、如果按下了Control鍵,如果是在選中行上,取消該行,否則,選中該行,記錄當前到窗口實例變量中

2)、如果按下了Shift鍵,取消所有選中行,選中上次點擊行和當前行之間的所有數據,記錄當前到窗口實例變量中

3)、如果沒有按鍵,如果點擊行為選中行,不執行任何操作, 否則,取消所有選中行,選中當前行,記錄當前到窗口實例變量中

比如,我們在窗口dw_1的Clicked事件中編寫該腳本,程序如下:

long ll_Start, ll_End, ll_index

if Row < 1 then return

if KeyDown(KeyControl!) then

 ifThis.IsSelected(Row) then

   This.SelectRow(Row,False)

 else

  This.SelectRow(Row,True)

 end if

elseif KeyDown(KeyShift!) then

 if Row <il_LastSelectedRow then

   ll_Start =Row

   ll_End =il_LastSelectedRow

 else

   ll_Start =il_LastSelectedRow

   ll_End = Row

 end if

已選擇行:isselected( )
dw_name.isselected(用循環語句檢查每一行是否被選擇li_row)
實例:
integer li_currow
boolean lb_result

li_currow = dw_name.getrow()
lb_result = dw_name.isselected(li_currow)
if lb_result then
  dw_name.selectrow(li_currow,false)
else
  dw_name.selectrow(li_currow,true)
end if
當前行:getrow()
dw_name.getrow()
刪除行:DeleteRow(row)
(1)函數功能:刪除行, 將被刪除的數據從數據窗口的主緩存區移放到刪除緩沖區

dw_name.deleterow(row\\當前行的話為0,其它的為行數)
row—要刪除的行號,row=0時刪除當前行。成功時返回1,失敗時返回-1

(2)實例:刪除數據窗口控件的dw_1中的第10行: dw_1.DeleteRow(10)

去掉數據兩邊的空格:Trim()
trim(string) //trimw()為有中英雙字節輸入的時候用的
(1)功能:刪除字符串首部和尾部的空格。

(2)語法:Trim ( string )

參數string:

      string類型,指定要刪除首部和尾部空格的字符串返回值String。函數執行成功時返回刪除了string字符串首部和尾部空格的字符串,發生錯誤時返回空字符串("")。如果任何參數的值為NULL,Trim()函數返回NULL。

獲得字符長度:Len()
len(string) 
(1)功  能:得到Blob類型變量的數據長度,以字節為單位。 
 (2)語  法:Len ( blob ) 
(3)參  數:blob:Blob類型變量。
返回值:Long。函數執行成功時返回blob變量的長度,發生錯誤時返回-1。如果任何參數的值為NULL,則Len()函數返回NULL。
(4)用  法:如果在說明Blob類型的變量時指定了變量長度,那么對該變量來說,Len()函數得到的就是這個指定的長度。如果在變量說明時未指定變量長度,那么PowerBuilder在賦值時調整長度,未賦值Blob類型變量的長度為0。

獲得指定字符--string
mid('string//為要從獲取數據的來源','從第幾個字符開始','要獲得的字符長度')
midw()為有中英雙字節輸入的時候用的
替換指定字符:replace( )
replace('string//被替換的','開始的地方','替換的長度','string//要替換的內容')
注:如果開始的地方大於被替換的字符,則在被替換的字符后面加上要替換的內容
(1) 功  能:將一個字符串中指定個數的字符串替換為另一個字符串。

(2) 語  法:Replace ( string1, start, n, string2 )

(3) 參  數:string1:string類型,指定要使用string2替換其中一部分內容的字符串;

start:long類型,指定要從哪個字符位置開始替換字符串,字符串中第一個字符的位置為1;

n:long類型,指定要替換多少個字符;

string2:string類型,指定用哪個字符串替換string1的部分字符。

返回值:String。函數執行成功時返回替換后的字符串,發生錯誤時返回空字符串("")。如果任           何參數的值為NULL,Replace()函數返回NULL。

(4) 代碼實例:把Name變量的值”春眠不倔小”替換為”春眠不覺曉”。

        Stringname

         Name= ”春眠不倔小”

         Name= Replace(Name , 7 , 4 , “覺曉”)

從左邊獲得指定字符:Left ()
left('string\\來源','長度')
leftw()為有中英雙字節輸入的時候用的
(1) 功能:得到字符串左部指定個數的字符。

(2)語法:Left ( string, n)

(3)參數  string:string類型,指定要提取子串的字符串。 

n:long類型,指定子串長度。

函數執行成功時返回string字符串左邊n個字符,發生錯誤時返回空字符串("")。如果任何參數的值為NULL,Left()函數返回NULL。如果n的值大於string字符串的長度,那么Left()函數返回整個string字符串,但並不增加其它字符。

(4) 示例1. 下面的代碼返回“ABCD”

       Left("ABCD EFGH", 4)

從右邊獲得指定字符:Right()

right('string\\來源','長度')
rightw()為有中英雙字節輸入的時候用的

(1) 功能從字符串右端取指定個數字符。

(2) 語法Right ( string, n )

(3) 參數string:string類型,指定要提取子串的字符串n:long類型,指定子串長度返回值String。

函數執行成功時返回string字符串右邊n個字符,發生錯誤時返回空字符串("")。如果任何參數的值為NULL,Right()函數返回NULL。如果n的值大於string字符串的長度,那么Right()函數返回整個string字符串,但並不增加其它字符。
在一字符中找另一字符的位置:Pos()  
pos('string\\要從這個字符中尋找','stirng\\這個字符是要尋找的內容',long\\起始位置從第幾個字符開始找)
(1) 功能在1個字符串中查找所包含的另1個字符串的起始位置。

(2) 語法Pos ( String1,String2 {, start } )

(3) 參數String1:String類型,指定要從中查找子串String2的字符串String2:String類型,指定要在String1中查找的字符串start:long類型,可選項,指定從String1的第多個字符“開始”查找。缺省值為1返回值Long。函數執行成功時返回在start位置后String2在String1中第一次顯現的起始位置。假如在String1中按指定要要未找到String2、或start的值超過了String1的長度,那么Pos()函數返回0。假如任何參數的值為NULL,Pos()函數返回NULL。用法Pos()函數在字符串查找時區分大小寫,因此,""aa""不匹配""AA""。

在規定的時間內觸發某事件
idle(60) \\如果60秒沒有操作的話就觸發application對象的idle事件
timer(60) \\每隔60秒就觸發一次窗口的timer事件
判斷是否為空
isnull(any) \\為空 not isnull(any)\\不為空 setnull(any)\\設置為空
類型轉換: String( )
要轉換類型(被轉換的類型)如string(any)
還可以定義格式如string(date,'yyyy-mm-dd')
(1)函數作用:該函數有兩種用法,一種是進行類型轉換,見語法格式二;另一種是進行類型轉換的同時還進行數據格式的轉換,見語法格式一。重點是格式一的學習和理解。

(2) 函數語法: 格式一:String ( data, { format } )

   格式二:String ( Blob )

data:要進行類型和格式轉換的數據;可以是date、DateTime、數字類型、time或者string類型。

format:格式串,用來指定參數data的顯示格式。根據參數data的數據類型的不同而不同。當參數data為String類型時,該參數是必需的,否則就沒有必要使用該函數了。

返 回 值: String。函數執行成功時返回以字符串方式表示的指定數據,如果data參數的數據類型與format參數指定的格式不匹配、format參數指定的格式無效、或data參數不是前面提到的適宜數據類型時,String()函數返回空字符串("")。

使用說明:format是個用掩碼表示的字符串,參數data的類型不同有不同的用法:

對data參數為數值類型的情況來說,格式為:

正數格式;負數格式;零的顯示格式;

(4)代碼實例:

例1、下面的語句將指定日期轉換為: Jan 1,1998的格式:

string(1998-01-31,”mmmm dd,yyyy”)

例2、下面的語句把DateTime類型的值轉換為:Jan 1,1998 6 hrs and 8 min的字符串:

string(DateTime(1998-01-31,06:08:00),’mmmm dd,yyyy h“hrs and” m ”min”’)  

例3、下面的語句把string1設置為0123:

integer li_num = 123  

string ls_temp

ls_temp = string(li_num,”0000;(000);****;空”)  

滾動頁
dw_name.scrollpriorpage() \\向前滾動一頁
dw_name.scrollnextpage() \\向后滾動一頁
獲得數據窗口有多少個列:
dw_name.object.datawindow.column.count
實例:獲得數據窗口的列名
integer li_index
for li_index = 1 to integer(dw_name.object.datawindow.column.count)
 messagebox(stirng(li_index),dw_name.describe("#"+string(li_index)+".name"))
next
獲得數據窗口的對象描述
dw_name.describe(datawindow.table.select) \\獲得數據窗口的sql語句
dw_name.Describe( "Evaluate( 'LookupDisplay(列名) ', 行數) " ) //獲得下拉數據窗口的顯示值
......
獲得與數據窗口中列相對應的數據表中的字段名稱dbname
integer li_index
for li_index = 1 to integer(dw_name.object.datawindow.column.count)
 messagebox(stirng(li_index),dw_name.describe("#"+string(li_index)+".dbname"))
next
獲得數據窗口的sql語句
dw_name.getsqlselect()
設置數據窗口的sql語句
dw_name.setsqlselect()
注:重設sql語句的時候列與類型必須要與原來的一樣,where與group by和order by可以不一樣
實例:
ls_oldsql = dw_name.getsqlselect()
ls_newsql = left(ls_oldsql,pos(lower(ls_oldsql),'where')) +'NewWhereSql'......
dw_name.setsqlselect(ls_newsql)
dw_name.retrieve()
另存為:.saveas( )
dw_name.saveas(名字可含路徑,另存為的類型,是否顯示列標題)
如:dw_name.saveas("g:\1.txt",Text!,false)

53.動態數據窗口syntaxfromsql
sqlca.syntaxfromsql(sqlselect一條sql語句,窗口風格,報錯信息)
創建create()
動態創建數據窗口對象:
ls_syntax = 動態數據窗口syntaxfromsql
dw_name.create(ls_syntax,自定義報錯信息)
創建非可視系統對象類型:
transaction dbtrans
dbtrans = create transaction
dbtrans.dbms = 'odbc'
釋放destroy
由create創建非可視系統對象類型用完以后要及時釋放,讓內存資源得到更好的使用
destroy dbtrans
修改數據窗口: modify( )
dw_name.modify(string\\"name = '"+Tom+"'") \\更多例子請看pb幫助
移動行rowsmove( )
dw_name.rowsmove(開始行,結束行,緩沖區,要移動到的另一窗口名,在哪一行前面插入,插入哪個緩沖區)
rowsmove還可以在同一數據窗口的不同緩沖區進行移動行
如從刪除緩沖區移動行到主緩沖區實現恢復功能:
dw_name.rowsmove(1,dw_name.deletedcrount(),delete!,dw_name,1,primary!)
復制行rowscopy( )--基本用法和移動行差不多
dw_name.rowscopy(開始行,結束行,緩沖區,要復制到的另一窗口名,在哪一行前面插入,插入哪個緩沖區)
獲得數據窗口的狀態getitemstatus
dw_name.getitemstatus(row\\第幾行,哪一列,哪個緩沖區)
緩沖區有三種:應該有四種的,不過另一種原始緩沖區不常用
primary! delete! filter!
狀態有四種:
datamodified! new! newmodified! notmodified!
設置數據窗口狀態setitemstatus
dw_name.setitemstatus(row\\第幾行,哪一列,哪個緩沖區,設置為哪個狀態)
共享數據:sharedata()
CONNECT USING SQLCA;
dw_employee.SetTransObject(SQLCA)
dw_employee.Retrieve()
dw_employee.ShareData(dw_dept)
要結束共享數據用sharedataoff()

  共享數據窗口的概念,共享數據窗口的實現非常簡單,只需一條Shar eData()。例如在Window對象上的兩個數據窗口dw-p和dw-s,則可以用dw-p.ShareDat a(dw-s)實現二者的數據共 享,dw-p稱為主數據窗口,而dw-s稱為從數據窗口。從原理上講,二者實際上所共享的是數據的緩沖區。緩沖區中的數據首先要從數據庫中檢索(通過數據窗口Retrieve()函數),而數據庫的檢索是一種較為" 昂貴"的操作,它會加重數據庫和網絡傳輸的負荷。在共享數據窗口情況下,只有主數據窗口檢索數據,而從數據窗口通過共享獲得數據,無須再檢索數據庫,

  在下拉數據窗口中的應用

  下拉數據窗口(DropDownDatawindow)作為一種編輯風格在數據窗口中有着廣泛的應用,如果將數據窗口字段的編輯網絡設為下拉數據窗口,則執行數據窗口的Retrieve()函數時,如果其所包含的下拉數據窗口為空(RowCount()=0),則自動為所含下拉數據窗口檢索數據。如果一個數據窗口中包含多個下拉數據窗口字段,則在其每次打開關閉時(如常用的查詢界面),所包含的下拉數據窗口都重復檢索數據庫。

  考慮到包含下拉數據窗口的字段內容在一次應用中通常是不變的 ,所以多次檢索數據庫也是不必要的。這一問題可以通過共享數據窗口解決,具體做法是:先建立一個專用的窗口對象w-ddw完成預先檢索任務,即在w-ddw上放置一個數據窗口dw-1,其字段為下拉數據窗口編輯風格,對應於后面用到的下拉數據窗口。w-ddw的open事件腳本 為:

  //w-ddw's open event

  dw-1.DataObject="dw-ddw"

  dw-1.Retrieve()

  其中dw-ddw是包含下拉數據窗口的數據窗口對象,這樣為后面所要用到的下拉數據窗口檢索到數據,后續的數據窗口包含下拉數據窗口時,下拉數據窗口可以共享這一檢索結果而無須再對數據庫檢索。

  考慮到對象的通用性,將w-ddw設計為一個專用對象,在其窗口級設計了一個函數wf-ddw-load(dw-app,col-src,col-dst),用於實現某一數據窗口(dw-app)中某字段所對應的下拉數據窗口的共享 。

  //wf-ddw-load function

  DataWindowsChild dwc-src,dwc-dst

  dw-1.GetChild(col-src,dwc-src)

  dw-app.GetChild(col-dst,dwc-dst)

  if dwc-src.ShareData(dwc-dst)=-1 then

   MessageBox("錯誤","數據共享錯誤!")

  end if

  如果考慮到某一字段內容可能更新,再設計一個字段更新函數:

  wf-Update(col)

  //wf-Update()function

  DataWindowChild dwc

  dw-1.GetChild(col,dwc)

  dwc.SetTransObject(SQLCA)

  dwc.Retrieve()

  在應用的開始打開w-ddw,w-ddw設計為不可見的(Visible屬性 為False),如果某一數據窗口(例如名為dw-app)中的下拉數據窗口共享w-ddw中的數據窗口數據,則可以在其所在的window的open事件編寫腳本:

  //This's open event

  dw-app.SetTransObject(SQLCA)

  w-ddw.wf-ddw-load(dw-app,'groups','groups')

  dw-app.Retrieve()

  由於下拉數據窗口通過共享已經裝載數據,所以在以后的多次打開時,dw-app檢索數據庫時不會再為其檢索,在應用的最后關閉w-dd w。

 

  在數據窗口打印中的應用

  數據窗口最簡單的打印方法為:dw.print(),但是在實際應用中, 屏幕上用於顯示的數據窗口通常與打印要求的格式不同,如有兩個數據窗口,dw-1(用於顯示)和dw-2(用於打印),使用數據窗口共享技術可以很簡單地解決問題,否則就必須對dw-2進行數據庫檢索。

    PowerBuilder中的合成式數據窗口(Composite)是處理多數據窗口的有力工具,可以設計一個合成數據窗口dw-prt用於打印。dw-pr t所含兩個數據窗口與dw-1和dw-2兼容。如果采用數據共享方法,dw -prt就不用執行帶參數的Retrieve(parm),可以直接打印當前查詢結果。下面說明具體的實現方法。

  要實現數據共享,就必須能夠引用合成數據窗口中所包含的兩個數據窗口的名字,在數據窗口畫板上雙擊內含Report對象,在出現的Re port Name中輸入名字,假設分別為rpt -1和rpt-2,定義一個用戶事 件ue-print,當觸該事件時執行下列腳本:

  //ue-print

  //dw-1 contains department and dw-2 contains emp

  DatawindowChild dwc-1,dwc-2

  dw-prt.SetTransObject(SQLCA)

  dw-prt.GetChild("rpt-1",dwc-1)

  dw-prt.GetChild("rpt-2",dwc-2)

  dw-1.ShareData(dwc-1)

  dw-2.ShareData(dwc-2)

  dw-prt.Print()

測試是否為有效值:IsDate()
isdate(),isnumber()......有效的話返回true
功能檢測指定的字符串是否包含有效的日期。
語法IsDate (datevalue )
參數datevalue:string類型,指定要檢測的字符串返回值Boolean。如果datevalue包含了有效的日期,則IsDate()函數返回TRUE,否則返回FALSE。如果datevalue參數的值為NULL,則IsDate()函數返回NULL。 

查找數據窗口中第一個被選中的行getselectedrow()
dw_name.getselectedrow(row\\從第幾行開始找,第一行開始的話設為0)
dwo對象
dwo是一個泛指對象,包括文本對象,按鈕對象等等
DWO 全稱 DataWindowObject 。它指的是 DataWindow 中的一個對象。例如一個計算列、Text 框、Picture Box 等等

如:
數據窗口即寫即現
string ls_name,ls_staffcode

choose case dwo.name
  case 'xf_staffcode'
  ls_staffcode = trim(data) 
  If gnv_data.of_HaveValue( ls_staffcode ) Then
  select xf_name into :ls_name
  from xf_staff
   where xf_staffcode = :ls_staffcode
  using itrans_current;
  this.setitem(row,'xf_name',ls_name)
end choose

 

DataWindow常用函數

1、插入一條記錄:dw_1.insertrow(cur_row)其中,dw_1為datawindow控件名,cur_row為一具體的行號,在該行前插入一新行。

例如:dw_1.insertrow(4)表示將在第4行前插入一條空記錄。該函數有一個返回值,該值為新插入這條記錄的行號。

2、刪除一條記錄:dw_1.deleterow(del_row)其中,dw_1為datawindow控件名,del_row為一具體的行,將該行刪除。該函數有一個返回值,刪除成功返回1,出錯返回-1

例如:dw_1.deleterow(23)將第23條記錄刪除。

3、返回當前行行號:dw_1.getrow() 其中,dw_1為datawindow控件名,注意:當前行並不一定就是屏幕上顯示的。比如用戶鼠標點擊了第5行12列中的單元格,然后拖動滾動欄,當前屏幕上顯示第23到45行,可當前行仍然是第5行,除非用戶鼠標點擊了其他行。

4、取出某一單元格子的數據:dw_1.object.col[rownum]其中,dw_1為datawindow控件名,

Object為固定寫法,col為列名,rownum為行號。

例如:需要將第34行列名為xm的值取出來,放在一個字符串變量ls_name中,寫法如下:

String Ls_name 定義一個字符串變量ls_name

Ls_name = dw_1.object.xm[34] 將第34行xm列中的值取出放入Ls_name變量中。

如果需要將對某一單元格子賦值,可以用下面的方法:

比如要將45行xm列的值賦為“張三“

Dw_1.object.xm[45]= “張三“

 5、過濾數據:dw_1.setfilter(ls_tj)其中,dw_1為datawindow控件名.ls_tj為過濾條件字符串。

比如:某數據窗口對象中某一列名為id, 需要將id>5 並且id<12的數據過濾出來

Dw_1.setfilter(“id>5 andic<12”);  設置過濾條件“id>5 and ic<12”

Dw_1.filter( );   過濾

6、排序數據:dw_1.setsort(ls_sort)其中,dw_1為datawindow控件名.ls_sort為排序條件字符串。

比如:某數據窗口對象中某一列名為nl, 需要按nl升序的順序排序。

Dw_1.setsort(“nl asc”);  設置排序條件“nl asc”(升序用asc,降序用desc)

Dw_1.sort( );   過濾

7、返回記錄數:dw_1.rowcount( )其中,dw_1為datawindow控件名.

例如:longll_r     定義一個長整形變量ll_r

      ll_r =dw_1.rowcount( )   得到控件dw_1中datawindow數據總記錄數放入變量ll_r中

8、text、excel、dbase格式文件導入datawindow以及datawindow中的數據導出text、excel、dbase格式文件。導入:dw_1.importfile(type, filename, startrow , endrow, startcolumn, endcolumn, ldwstartcolumn ) 其中,dw_1為datawindow控件名, type為導入的文件類型。Filename為文件名,startrow為該文件的開始行,endrow為該文件的結束行。Startcolumn為該文件的開始列,endcolumn為該文件的結束列,ldwstartcolumn為datawindow的開始列。

例如:將c盤test.txt文件的第2到8行的第3至第6列導入到datawindow中,並且導入數據放到datawindow中的第45行后面。

Dw_1.importfile (Text!,”c:/test.txt”,2,8,3,6,46)

導出:dw_1.saveas(filename,saveastype, colheading ) 其中,dw_1為datawindow控件名, filename為導出的文件名, saveastype為導出的文件類型,colheading為是否保存標題。

例如:將數據窗口中的數據保存到d盤,取名為cs的文件。要求帶標題。

Dw_1.saveas(“d:\cs.txt”,text!,true) true為帶標題。False為不帶標題。

9、數據窗口中數據的保存。Dw_1.update( ) 其中,dw_1為datawindow控件名

例如:數據修改后,需要對數據進行保存。用該語句實現。

Dw_1.update( ) 該語句有返回值,如果返回1表示更新成功,返回-1表示出錯。

10、彈出消息框。MessageBox ( title, text, icon, button, default ),title為標題,text為消息內容,icon為圖標,button為顯示按鈕,delfault表示默認按鈕。

例如:彈出一個消息框,標題為:刪除確認,內容為:確認要刪除該條記錄嗎,圖標為詢問圖標,按鈕為ok和cancel,默認為cancel按鈕。

MessageBox ( “刪除確認”, “確認要刪除該條記錄嗎”,question!,OKCancel!, 2)

11、查找函數。Dw_1.find(expression,start, end), 其中,dw_1為datawindow控件名, expression為查找條件表達式,start為開始行,end為結束行。

例如:查找列名id等於8的記錄,從前10行中查找。

Dw_1.find(“id=8”,1,10) 返回找到行的行號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM