數據窗口的數據保護

PB數據窗口的數據保護

 


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

  可以把數據的保護分爲三種情況:

  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))

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

分享: 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章