在PB中如何控制DATAWINDOW列的修改屬性[轉貼]

在編制管理信息應用系統中,一般都會遇到一個共同問題,那就是如何根據不同情況去控制表中的數據列,比如對於同一DATAWINDOW不同的用戶有不同的操作(如對於數據錄入人員可以更改數據,而對於查詢人員一般不能更改數據),下面就以一個簡單的工資表爲例來說明利用PB如何在DATAWINDOW中控制列的修改方式。
工資表基本列如下:
代碼 姓名 工作時間 基礎工資 浮動工資 崗位工資 知識分子補貼 其它工資
code name workdata basesa movesa stationsa bt othersa
char varchar char decimal decimal decimal decimal deciaml

在PB中有兩種方式可控制列屬性,一是靜態方式,另一種是動態方式實現。所謂靜態方式就是在列的屬性上通過選項實現。所謂動態方式就是利用編程實現。現分別給予介紹:
一、靜態方法
(1)在datawindow中選中某列後點MOUSE右鍵,選“properities”後系統彈出一標籤,選中“Edit”標籤,將“Display Only”選項製爲有較;
(2)或者選中“Expression”標籤,在“Protect Express”中填入“1”;
(3)或者選中“Expression”標籤,在“Protect Express”中填入條件表達式,如工作時間不滿一年的人員不能修改,則寫入“if (daysafter(date(workdate),today()) <= 365,1,0)”;
(4)在datawindow中,將某列的Tab Order 值製爲0,則該列因得不到焦點而不能被修改;
(5)在DataWindow Painter 狀態下選取Rows菜單,再選取Update Properties,彈出Specify Update Properties對話框,將Allow Updates 設爲空。
二、動態修改方法
(1)將整個Datawindow設置爲保護方式:利用DataWindow Object的ReadOnly 屬性可以將整個Datawindow 設置爲保護方式。
語法爲:dw_1.Object.DataWindow.ReadOnly=value 或 dw_1.Modify(“DataWindow.ReadOnly{=value}”),其中:value表示Datawindow是否爲只讀(read-only)狀態,它有兩個取值:Yes 和No。Yes表示使Datawindow爲read-only;No 則相反,默認值是No。例如:如果要使Datawindow設置爲保護方式,可以在相應事件的腳本中包含下列代碼:
dw_1.Modify(“DataWindow.ReadOnly=Yes”) 或者爲:
dw_1.Object.DataWindow.ReadOnly=Yes
(2)只保護Datawindow的某些列
方法一:利用列的Protect屬性
語法爲:dw_1.Object.name.Protect=integer 或 dw_1.Modify(“columnname.Protect{=integer}”)。
參數說明:cloumnname:爲要保護的列名;integer:爲該列的保護狀態,值爲0或False時該列不受保護;值爲1或True時該列受到保護。例如,要將列name設置爲保護狀態,則相應的代碼爲:dw_1.Object.name.Protect=1 或者爲:dw_1.Moidfy(“name.Protect=1”)
方法二:利用列的TabSequence屬性,在程序執行時可以根據需要將該列的TabOrder置爲0,從而達到保護的目的。
語法爲:dw_1.Object.name.TabSequence= number或dw_1.Modify(“columnname.TabSequence{=number}”)
參數說明:columnname:要保護的列名;number:該列的TabOrder值(0-32000)。
例如,要將列name設置爲保護狀態,相應的代碼爲:
dw_1.Object.name.TabSequence=0
或者:dw_1.Modify(“name.Tabsequence=0”)
方法三:利用修改列的ED99v屬性中的DisplayOnly屬性值。
語法爲:dw_1.Object.columnname.Edit.DisplayOnly=value 或 dw_1.Modify(“columnname.Edit.DisplayOnly{=value}”)
參數說明:columnname:要保護的列名;
value:表示該列是否爲只顯示(DisplayOnly)狀態,它有兩個取值:Yes和No。Yes表示不允許用戶輸入數據(只顯示):No則相反,默認值是No。
例如:如果要使列name設置爲只顯示,可以在相應事件的腳本中包含下列代碼:
dw_1.Object.name.Edit.DisplayOnly=Yes
或者:dw_1.Modify(“name.Edit.DisplayOnly=Yes”)
用該方法時列雖不能被修改,但該列能得到焦點,上述的其它方法則不能。
三、有選擇的保護某些行
上述方法將對DataWindow的所有行起作用,但要想只保護其中的某些行,則需要用列的保護(Protect)屬性(取值同上述方法二),但這是在建立DataWindow時實現的。方法爲:在DataWindow畫板(Painter)中,雙擊相應的列,彈出Column Object 對話框,選取Expressions頁,在Protect後的框中寫入if(條件表達式,1,0)。靈活運用條件表達式可以獲得多種保護效果。
(1)只允許修改新插入的行
在一個DataWindow中,有時會有這樣的需要:已有的數據只能瀏覽不允許修改,只有用戶新輸入的數據才允許修改,此時表達式爲:
if(isrownew(),0,1),或者if(not isrownew(),1,0)
2)某一列的保護情況要根據其它列的數據進行
如在員工工資管理中,只有工作年限大於5年時才允許輸入知識分子補貼(bt),則列bt的Protect後的框中輸入:if(integer(mid(string(today(),’yyyymmdd’),1,4)) – integer(mid(workdata,1,4))>5,0,1)
(3)要保護的行只有在執行時才能確定,並且不斷變化例如在員工工資管理中,假設工資的修改只有該工資的輸入者是變化的,且一般情況下只有在執行時才能確定條件需要一個變量,這就需要在建立DataWindow時爲其指定一個檢索數據的參數(如flag),然後在可修改列的Protect後的框中輸入(user_name是該DataWindow中的一列,代表輸入者的名稱):
if (user_name=flag,0,1)
在實際應用時還要注意參數的實際類型。
(4)在表中增加一個標誌列
上述方法基本上均要求要保護的行有一定的規律可循,當這些行沒有規律時,可以在相應的表中專門增加一個標誌列(設列名爲flag),取值爲1和0,然後在其它列的Protect後的框中直接輸入flag的表達式。運行時若該行的flag=1,在該行相應的列處於保護狀態。對於標誌列值的修改,可以由數據管理員修改或根據某種情況在程序中靈活設置。

原貼:http://www.99v.com.cn/Article/softtech/program/Powerbuilder/ck/200505/24874_2.html

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