在編制管理資訊應用系統中,一般都會遇到乙個共同問題,那就是如何根據不同情況去控制表中的資料列,比如對於同一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表示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」)。
引數說明: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」)
引數說明: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」)
引數說明: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,在該行相應的列處於保護狀態。對於標誌列值的修改,可以由資料管理員修改或根據某種情況在程式中靈活設定。
在PB中如何控制DATAWINDOW列的修改屬性
在編制管理資訊應用系統中,一般都會遇到乙個共同問題,那就是如何根據不同情況去控制表中的資料列,比如對於同一datawindow不同的使用者有不同的操作 如對於資料錄入人員可以更改資料,而對於查詢人員一般不能更改資料 下面就以乙個簡單的工資表為例來說明利用pb如何在datawindow中控制列的修改方...
在PB中如何控制DATAWINDOW列的修改屬性
在編制管理資訊應用系統中,一般都會遇到乙個共同問題,那就是如何根據不同情況去控制表中的資料列,比如對於同一datawindow不同的使用者有不同的操作 如對於資料錄入人員可以更改資料,而對於查詢人員一般不能更改資料 下面就以乙個簡單的工資表為例來說明利用pb如何在datawindow中控制列的修改方...
在PB中利用DDE
powerbuilder 以下稱pb 是一種強有力的企業級資料庫應用系統開發工具,利用它可以方便地開發出資料庫系統的前台應用軟體。但由於用pb所開發的報表具有一定的侷限性 報表的表頭 列寬等都不能在應用程式中由使用者來進行調整,所以若使用者報表的格式有所變動,則必須在原程式中對報表進行調整,這在很大...