数据窗口的数据保护

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

  至此,有条件地修改某行的所有字段已介绍完毕。相信聪明的读者能够在此基础上改进一步,比如,如何有条件地修改某行中的部分字段等。

分享: 

 

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