資料視窗的資料保護

2021-08-21 05:36:19 字數 2727 閱讀 7822

【在實際的應用中,開發人員經常希望自己提供給使用者的資料有選擇性地被修改,這就要求開發人員能夠對資料進行保護,通過程式約束使用者的修改範圍。當然靠使用者自己識別哪些可以修改哪些不能修改也能保證資料的選擇性修改,但這樣會降低應用程式的可靠性。

可以把資料的保護分為三種情況:

1、某些字段不論什麼條件下使用者都不能修改,一般只是用來顯示資料的;

2、已有資料不讓修改,新資料中的部分或全部允許修改;

3、符合某種條件的資料允許修改,不符合該條件的資料不允許修改。

下面對以上幾種資料保護分別討論。

一、無條件修改部分字段

在什麼條件下都不允許修改的字段一般可以通過程式設定,比如系統日期、依賴於其他欄位的字段及按次序產生的序號等,這樣的字段讓使用者修改就不容易保證資料的一致性和正確性,並且使用者也沒有必要修改,可以用以下三種方法將這樣的字段設定為使用者不可修改的字段:

1、在資料視窗設計時將這些欄位的taborder值置為0,以使該字段不能獲得焦點,使用者無法選中和編輯該欄位。

2、將字段的displayonly屬性設定為true。該欄位可以獲得焦點,可以選中該欄位,還可以拷貝複製該字段中的內容,但不能編輯該字段中的內容。

3、設定欄位的protect屬性。欄位的protect屬性如果設定為「1」,則該字段的taborder值即使不是0也不會得到焦點。使用該屬性可以保護一些重要的資料。

例如,只允許使用者修改新增加行中的資料,可以在字段的protect屬性中輸入

if (isrownew(),0,1),也可以在程式執行時在適當的事件中修改欄位的protect屬性:

dw_1.modify("column_name_here.protect='1~tif(isrownew(),0,1) '")

多使用者下的、值按次序產生的關鍵字段可設定為不可修改。因為是關鍵字段,必須保證其惟一性。多個使用者可能在同時修改該欄位,靠前台就很難保證惟一性,只能通過後台修改,所以這樣的字段需要設定為不可修改。在資料視窗畫板中選擇視窗選單rows中的update properties命令,把需要後台產生的字段在左下角的updateable  columns中去掉,並在後台將該字段設定為序列字段即可。

二、已有資料不允許修改,只能修改新資料

這種情況可通過程式設計實現。程式設計思想是:判斷當前行的狀態,如果是新增加的資料行則允許修改,否則不允許修改。是否可以修改可以通過設定欄位的protect屬性來實現,當然還可以有更多的方法。是否是新增加的資料可以通過使用函式getitemstatus判斷行的狀態來得知。具體程式設計如下:

1、為了恢復欄位的protect屬性,定義乙個例項變數,型別為整型變長陣列:

int ii_protect  //儲存欄位的protect屬性

2、在視窗的open事件中儲存資料視窗所有欄位的protect屬性:

int li_columncount

long ll_index

li_columncount = dw_1.object.datawindow.column.count

for ll_index = 1 to li_columncount

ii_protect[ll_index] = dw_1.describe("#" +string(ll_index) +  ".protect")

next

3、在資料視窗的rowfocuschanged事件中程式設計如下:

long li_columncount

int li_index

if currentrow <= 0 then return

dw_1.setredraw(false)

li_columncount = integer(dw_1.object.datawindow.column.count)

if dw_1.getitemstatus(currentrow,0,primary!) = new! or &

dw_1.getitemstatus(currentrow,0,primary!) = newmodified!then//新資料

for li_index = 1 to li_columncount

dw_1.modify("#" + string(li_index) + ".protect =" + string(ii_protect[ll_index]))

next

else//舊資料,不允許修改

for li_index = 1 to li_columncount

dw_1.modify("#" + string(li_index) + ".protect =1")

next

end if

dw_1.setredraw(true)

4、在clicked事件中程式設計如下:

this.triggerevent(rowfocuschanged!)

三、有條件修改

符合某些條件的行才允許修改,可以在資料視窗設計中實現。在資料視窗設計時修改欄位的protect屬性為條件判斷表示式。比如,當崗位工資大於180時允許修改,可使用如下表示式:

if (gwgz > 180,0,1)

但是使用者如何知道哪行可修改哪行不可以呢?可以使用前面章節介紹的標識特定條件的資料技術來標識這些不能修改的資料。例如,把可修改行的背景顏色改為紅色,不可修改的背景改為灰色,可以在字段的backgroudcolor屬性中輸入表示式:

if(gwgz <= 180,rgb(192,192,192),rgb(255,0,0))

至此,有條件地修改某行的所有欄位已介紹完畢。相信聰明的讀者能夠在此基礎上改進一步,比如,如何有條件地修改某行中的部分欄位等。

分享: 

資料的保護

一般資料保護條例 gdpr 歐盟通用資料保護條例 gdpr 取代資料保護指令95 46 ec,旨在協調整個歐洲的資料隱私法律,保護所有歐盟公民的資料隱私,並重塑整個地區在儲存和處理隱私資料上的管理方式。由於違反gdpr的規定,組織可能會被罰款高達全球年營業額的4 或2000萬歐元。比如,如果沒有客戶...

共用資料的保護

一 常物件 類名 const 物件名 實參表列 const 類名 物件名 實參表列 如果乙個物件被宣告為常物件,則不能呼叫該物件的非const型成員函式,目的是為了防止這些函式會修改常物件中資料成員的值。常成員函式的宣告 void get const 如果一定要修改常物件中的某乙個資料成員的值,則應...

共享資料的保護

一 常物件 1 常物件 它的資料成員值在物件的整個生存期間內不能被改變 也就 是說,常物件必須初始化,而且不能被更新 宣告常物件的語法形式 const 型別說明符 物件名 例如 class a private int x int y const a a 1,2 a是常物件,不能被更新 二 用cons...