为您推荐:
精华内容
最热下载
问答
  • 浅议PB中数据窗口缓冲区与数据修改状态,filter,delete之后不想修改之方法 置顶2014年12月14日 21:34:17luoxiya521阅读数:4495 --引用 摘 要:文章描述了PowerBuilder中数据窗口缓冲区,详细介绍了数据窗口...

    浅议PB中数据窗口缓冲区与数据修改状态,filter,delete之后不想修改之方法

    置顶 2014年12月14日 21:34:17 luoxiya521 阅读数:4495

    --引用

     

    摘 要:文章描述了PowerBuilder中数据窗口缓冲区,详细介绍了数据窗口中行与列的修改状态以及PowerBuilder提供的相关函数,并给出了几则应用实例。

    关键词:PowerBuilder 数据窗口 缓冲区

    中图分类号:TP311.131

    文献标识码:A

      PowerBuilder是当今最先进的数据库开发工具之一,它以 开放性、可移植性以及易用性而闻名于世。PowerBuilder的突出特点是给应用开发人员提供了非常方便的开发环境和工具,而数据窗口技术则是其中最 耀眼的闪光点。利用数据窗口,开发人员可以完成绝大多数数据操作任务。本文从数据窗口中数据的修改状态的角度出发,介绍利用数据窗口进行应用开发的一些技 巧。

      1 数据窗口缓冲区

    在应用中,每个数据窗口控件都要检索4个内存缓冲区,它们是:

      ·主缓冲区(PrimaryBuffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。

      ·过滤缓冲区(FilterBuffer):存放从主缓冲区中过滤掉的数据。

      ·删除缓冲区(DeleteBuffer):存放从主缓冲区中删除掉的数据。

      ·原始缓冲区(OriginalBuffer):存放从数据库里检索到的原始数据,它由PowerBuild在内部维护,可以利用该缓冲区中的数据进行数据恢复,在应用程序中实现Undo功能。

      2 行与列的修改状态

    行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,它们包含: ·NotModified!:指定行或列处的信息与最初检索出的相同。 ·DataModified!:指定列或行中某列处的信息在检索出后发生了改变。

      ·New!:指定行是新行,但此行的列并未赋值。本状态只适用于行,不适用于单个列。

      ·NewModified!:指定行是新行且行中的列已经赋值。新行的状态成为NewModified!,既可能是用户输入或使用SetItem函数造成的,也可能是由于它的某列具有缺省值。本状态只适用于行,不适用于单个列。

      数据窗口中行或列的修改状态决定Update()函数将为该行或该列产生何种类型的SQL语句。 对主缓冲区和过滤缓冲区中的行,Update为状态是NewModified!的行产生Insert语句,为状态是DateModified!的行产生 Update语句,只有状态是DataModified!的列才会包含在Update语句中。对删除缓冲区中的行,若其状态是New!或 NewModified!,则Update语句不会为其产生Update语句。

      利用函数GetItemStatus可获得某行或某列的修改状态,利用函数SetItemStatus可改变某行或某列的修改状态。

      语法:

      dwcontrol.GetItemStatus(row,column,dwbuffer)

      dwcontrol.SetItemStatus(row,column,dwbuffer,status)

      对于如何改变状态,PowerBuilder有一些限制,表1给出了这种限制,其中Yes表示可把初始状态改变为指定状态,No则表示不可以。

    表1数据修改状态设置约束

    初始状态指定状态
    New!NewModified!DataModified!NotModified!
    New!——YesYesNo
    NewModified!No——YesNew!
    DataModified!NewModified!Yes——Yes
    NotModified!YesYesYes——

      通过观察表1,我们可以发现这样一种情况:假设某个记录的状态为New!,那么不能直接改为NotModified!但可先将它改为DataModified!,然后再改为NotModified!。

      利用函数RowsCopy、RowsMove可以在不同DataWindow控件(或DataStore对象)之间或同一DataWindow控件(或DataStore对象)的不同缓冲区之间复制、移动数据行。

      语法:

      dwcontrol.RowsCopy(startrow,endrow,copybuffer,targetdw,beforerow,targetbuffer)
    dwcontrol.RowsMove(startrow,endrow,movebuffer,targetdw,beforerow,targetbuffer)

      当某行在删除缓冲区中时,或者在主缓冲区或过滤缓冲区中,并且状态为NewModified!或 DataModified!时,其更新标志被设置。函数ResetUpdate清除DataWindow或DataStore中主缓冲区和过滤缓冲区中的 更新标志并清空其删除缓冲区。清除更新标志后,所有行的状态为NotModified!或New!。

      语法:dwcontrol.ResetUpdate()

      3 应用举例

    (1)在数据窗口中,某些列常具有缺省值,或我们在执行了InsertRow操作后立即使用 SetItem函数为某些列赋值。如果用户执行了一个插入操作后立即关闭窗口会触发closequery事件,这时会提示用户记录已经被修改,但用户并没 有感觉到对数据的修改。为避免出现这种情况,可作如下处理:

      intli_new_row
    li_new_row=dw_l.InsertRow(0)
    //通过SetItem函数为列赋值
    dw_l.SetItem(……)
    //将新行的修改状态置为NotModified!
    dw_l.SetItemStatus(li_new_row,0,primary!,NotModified!)

      (2)在应用程序中提供Undo功能,将实现很好的用户友好效果。本例中将数据窗口dw_l中的当前行、当前列的显示值置为从数据库中检索出的原始值:
    string ls_ori_val
    ls_ori_val=dw_l.GetItemString(dw_l.GetRow(),dw_l.GetColumn(),
    &Primary!,True)
    dw_l.SetText(ls_ori_val)

      (3)在协调两个DataWindow对象dw_l、dw_2的更新时,若其中一个更新失败,应阻止重设更新标志,以便回滚事务,一旦所有数据窗口都已成功更新,就可使用COMMIT结束该事务,并使用ReSetUpdate重新设置数据窗口的状态标志。
    Int li_ret_code
    li_ret_code=dw_l.Update(True,False)//阻止重设更新标志
    If li_ret_code=l then
    li_ret_code=dw_2.Update(True,False)//阻止重设更新标志 
    lf li_ret_code=l then
    dw_l.ResetUpdate()//清除更新标志
    dw_2.ResetUpdate()//清除更新标志
    COMMIT;
    Else
    ROLLBACK;
    Endif
    Endif
    (4)将数据行从删除缓冲区移到主缓冲区,实现取消删除的功能。
    dw_l.RowsMove(l,dw_l.DeletedCount(),Delete!,dw_l,l,Primary!)

    (5)讲filter缓冲区的修改状态改为未修改,更新时候不保存filter缓冲区内的数据

    举例

      if tab_1.tabpage_2.rb_cq.checked   then 
    for li_i = 1 to tab_1.tabpage_2.dw_lymx.FilteredCount() 
    tab_1.tabpage_2.dw_lymx.SetItemStatus(li_i, 0,Filter!, NotModified!)
    next 
    end if 
    ll_yzxh = tab_1.tabpage_2.dw_lymx.object.jlxh[i]
    ll_find1 = dw_tj02_copy.find("yzxh = "+string(ll_yzxh),1,dw_tj02_copy.rowcount())
    if ll_find1 > 0 then
    tab_1.tabpage_2.dw_lymx.Object.sybz[i] = 1
    end if

    RowsDiscard 方法

    功能:datawindow中移除行操作,一旦行被移除则改行不能修改或保存,除非再次从数据库中retrieve。

    语法:integer dwcontrol.RowsDiscard (long startrow, long endrow, DWBuffer buffer )

    参数:dwcontrol 数据窗口

    startrow 将要移除的开始行

    endrow 将要移除的结束行

    buffer 缓存区的值(Primary! ,Delete! ,Filter! )

    示例:dw_1.RowsDiscard(1, dw_1.DeletedCount(), Delete!)

    将dw_1中从第1行到DeletedCount()行移除到Delete!缓冲区中,则dw_1调用update()方法时,以上被移除的行不会发生变化。[1] 


    举例

     

    for i = 1 to tab_1.tabpage_2.dw_lymx.rowcount()
    ll_pspb = tab_1.tabpage_2.dw_lymx.object.pspb[i]
    ll_psjg = tab_1.tabpage_2.dw_lymx.object.psjg[i]
    ll_ypyf = tab_1.tabpage_2.dw_lymx.object.ypyf[i]
    if ll_pspb = 0 then continue
    if ll_ypyf = ii_psyp_ypyf and ll_psjg <> 1 then continue //皮试用,非阳性
    if ll_psjg = 0 or ll_psjg = 1 then
    tab_1.tabpage_2.dw_lymx.deleterow(i)
    i --
    end if
    next
    tab_1.tabpage_2.dw_lymx.rowsdiscard( 1, tab_1.tabpage_2.dw_lymx.deletedcount(), Delete!)

     

    分享缓冲区常识

     

    一、 DataWindow的四个缓冲区

     

    缓冲区

    作用

    Primary Buffer   (主缓冲区)

    存放检索出来的数据,但不包括过滤掉和删除掉的数据。数据窗口控件只显示主缓冲区中的数据。

    Delete Buffer    (删除缓冲区)

    存放从Primary Buffer中删除掉的数据。在数据没有提交到数据库之前,可以从该缓冲区中将数据恢复出来。数据提交后,该缓冲区中的数据清空。  

    Filter Buffer     (过滤缓冲区)

    存放从Primary Buffer中过滤掉的数据。

    Original Buffer   (原始缓冲区)

    存放从数据库里检索到的原始数据

     

    二、四个缓冲区的相关函数

    函数格式

    功能

    参数

    说明

    Retrieve({arg,arg….})

    检索数据,满足条件的数据放到数据窗口的主缓冲区,不满足条件的数据放到数据窗口的过滤缓冲区

    arg—在数据窗口对象中定义的检索参数。成功时返回检索出的数据行数,失败返回-1

    常用方法:

    Retrieve()如果数据窗口对象定义的检索参数为学号,则对某个学号的检索为:

    dw_1.Retrieve(1234)

    DeleteRow(row)

    删除行, 将被删除的数据从数据窗口的主缓存区移放到删除缓冲区

    row—要删除的行号,row=0时,删除当前行。成功时返回1,失败时返回-1

    在数据窗口的主缓冲区中删除一行。例如删除数据窗口控件的dw_1中的第10行:

    dw_1.DeleteRow(10)

     

    RowsMove(startrow, endrow, movebuffer, targetdw, beforerow, targetbuffer )

    将数据从一个缓冲区移动到另外缓冲区中

    startrow和endrow是要移动数据的范围;movebuffer指要从哪个缓冲区移出数据, targetdw是目标数据窗口控件名称;beforerow表示在目标数据窗口的哪一行之前插入移入的数据, targetbuffer是目标缓存区

    例如:

    dwcontrol.RowsMove

    (l,dw_l.DeletedCount(),

    Delete!,dw_l,l,Primary!)

    将数据行从删除缓冲区移到主缓冲区,实现取消删除的功能。

    RowsCopy(startrow, endrow, movebuffer, targetdw, beforerow, targetbuffer )

     

    将数据从一个缓冲区复制到另外缓冲区中

    startrow和endrow是要复制数据的范围;movebuffer指要从哪个缓冲区复制数据, targetdw是目标数据窗口控件名称;beforerow表示在目标数据窗口的哪一行之前插入复制的数据, targetbuffer是目标缓存区

     

    SetFilter(format)

    设置数据窗口的过滤条件

    format—表示过滤条件的字符串,可以使用字段名或字段号定义条件。成功返回1,失败返回-1

    例如:

    dw_1.setfilter(“age>25 and age<45”)

    取消过滤条件:

    dw_1.setfilter(“ ”)

    Filter()

     

    对数据窗口的Original!缓存区进行过滤,不符合条件的数据行被移送到数据窗口的Filter!缓存区

    成功返回1,失败返回-1

    例如:

    dw_1.Filter()

    GetItemStatus(row,column,dwbuffer,)

     

    获取指定字段的状态

    row—指定数据行的行号

    column—指定的数据列

    dwbuffer—指定读取数据的缓冲区,默认主缓冲区,返回一个

    dwItemStatus枚举量

    例如:取数据窗口dw_1第5行work字段在Filter缓冲区的状态:

    dwItemStatus1_status

    1_status=dw_1.GetItemStatus(5,”work”, Filter!)

    SetItemStatus(row,column,dwbuffer,

    status)

     

    设置指定字段的状态

    row—指定数据行的行号

    column—指定的数据列

    dwbuffer—指定读取数据的缓冲区

    status—dwItemStatus枚举量

    例如:设置dw_1第5行party字段在主缓冲区的状态为NotModIFied:

    dw_history.SetItemStatus

    (5,”Salary”,Primary!,NotModIFied!)

     

    ★GetItemStatus和SetItemStatus的基本功能与说明已在上述表格中给出,其中

    1、行与列的修改状态为dwItemStatus枚举类型值,它们包含:

    状态标志

    意义

    NotModified!

    指定单元的数据和原始数据相同,没有修改过。

    DataModified!

    指定单元的数据和原始数据不同,修改过。

    New!

    该数据行是新增加的,但还没有在该行上输入数据

    NewModified!

    该数据行是新增加的,并且已经在该行上录入了数据。

    2、status为上面的四个取值中的一个,但不是任意的取值,因为有些状态不能用该函数设置成另外一种状态,必须是能够转换的状态。下面列出了能够转换的状态:

    期望状态

    当前状态

    New! 

    NewModified!

    DataModified!

    NotModified!

    New!

    \    

      Yes 

    Yes 

    No

    NewModified!

    No

    \

    Yes 

    New

    DataModified!

    NewModified!

    Yes 

    \  

    Yes 

    NotModified!

    Yes 

    Yes 

    Yes 

    \  

    注意:表中的Yes表示可以使用SetItemStatus进行该状态设置,No表示不会产生预期的状态,如果标明了某个特定的状态,则说明是新的状态,而不是期望的状态。

     

     

    三、pb Update Properties 详细介绍

     

    1. Allow Updates

    a) 名词解释:数据是否只读,如果把该选项关闭,那么在程序中的任何删、改操作都无法生效。

    b) 注意事项:如果数据获取之后只是显示用,就不需要设置该属性

    2. Table to Update

    a) 名词解释:设置可更新的表,即可调用数据窗口的update函数

    b) 注意事项:一次只能设置一张表具有更新属性

    3. Where Clause or Update/Delete:

    a) 名词解释:如何构建Update/Delete的where语句

    b) 3个选项的解释

    1) Key Columns(默认值): 用主键构建where语句,值来自原始缓冲区。主键允许是复合主键。

    2) Key and Updatable Columns:用主键和所有可更新列构建where语句,值来自原始缓冲区。“可更新列”详见“Updatable Columns”选项来设置

    3) Key and Modified Columns:用主键和真正发生变化的列构建where语句,值来自原始缓冲区。

     

    4. Key Modification

    a) 名词解释:如何完全本次删、改操作

    b) 两个选项

    1) Use Delete then Insert(默认值):先删除,再插入。 

    1. 注意:如果该表的主键值自动(触发器等)产生,且该主键作为另外表的外键,则不能采用这种方式。

    2) Use Update:被修改字段通过Update语句更新回数据库。建议使用。

     

    5. Updatable Columns

    a) 名词解释:设置哪些字段被修改后可更新到数据库

    b) 注意事项:Key and Updatable Columns对应,没有选中的列将不会出现在Update语句的where语句中,值与原始缓冲区里的值相同,防止并发操作。 

     

    6. Unique Key Columns

    a) 名词解释:设置哪个字段具有唯一值,可以起到主键的作用。

    展开全文
    u010561878 2019-04-18 11:23:46
  • PB 缓冲区 pb 四个缓冲区: original! : retrieve后存放数据 primary! :当前数据 delete! : 删除的未update前的数据 filter! : 过滤掉的数据 Primary! Primary 0 The data in the primary ...
    PB 缓冲区

    pb 四个缓冲区:

    original! : retrieve后存放数据
    primary! :当前数据
    delete! : 删除的未update前的数据
    filter! : 过滤掉的数据

    Primary! Primary 0 The data in the primary buffer, meaning data that has not been deleted or filtered out. (Default value when argument is optional.)
    Delete! Delete 1 Data in the delete buffer, meaning data that has been deleted from the DataWindow but has not been committed to the database.
    Filter! Filter 2 Data in the filter buffer, meaning data that has been removed from view.
    Web DataWindow In Web DataWindow methods, you can use a string value with or without the exclamation point for a DataWindow buffer. For example, you could use
    Primary or Primary! to specify the primary buffer.

    DATAWINDOW的四个缓冲区

      在PowerBuilder中,DataWindow是用户前端用来存储、操纵数据的对象。在每一个DataWindow对象中有4个二维表作为数据缓冲区,用来存储查询到的数据。用户在DataWindow中对数据处理系统内部的操作实际上都是将数据在这几个缓冲区中进行的修改和移动,最后在用户提交数据库时,系统根据这四个缓冲区中的信息形成SQL的IN-SERT,UPDATE,DELETE等语句。这四个缓冲区是:

      1、Primary Buffer

      这个缓冲区是存放填充窗口中DataWindow控件中数据的,调用DataWindow的Retrieve()函数和InsertRow()函数可以将数据填入这个缓冲区中。当使用有关DataWindow删除和过滤函数时,相应记录将从这一缓冲区中删除。而在执行DataWindow的Update()函数时,PowerBuilder将查看这一缓冲区中的记录,以形成SQL INSERT和UPDATE语句。

      2、Delete Buffer

      这个缓冲区保存的是用DeleteRow()函数从Primary Buffer中删除的记录,执行Update()函数时,系统根据这一缓冲区的记录形成DELETE语句。

      3、Filter Buffer

      这个缓冲区存储的是从Original Buffer使用Filter()函数过滤到Primary Buffer中后剩余的记录。

      4、Original Buffer

      这一缓冲区存储的是DataWindow最初执行retrieve()函数时得到的全部记录。当提交数据库时,根据Primary Buffer生成的UPDATE语句和根据Delete Buffer生成的DELETE语句都要依据这一缓冲区来构造这些SQL语句中的Where子句。

      Original Buffer由PowerBuilder内部维护,Power-Builder所提供的任何函数都无法改变它的值,不过通过PowerBuilder所提供的GetItem…系列的函数可以读出DataWindow最初从数据库中查到的原始值。通过这些函数我们可以编程实现所谓的"Undo"功能,并且得到在使用乐观锁时形成提交数据库的WHERE子句。

      如果您当前使用的DataWindow没有设置修改的权力,您将不能对Delete缓冲区和Original缓冲进行操作,而且当调用Update()时也将引起系统错误。

      数据缓冲区的状态值

      Primary Buffer和Delete Buffer都有行级和列级的状态值,这个状态值是一个枚举类型。在提交时由该行的状态值来决定是否要产生SQL语句,其中Primary Buffer产生的是IN-SERT和UPDATE语句,而Delete Buffer产生的是DELETE语句。我们用GetItemStatus()函数和SetItemStatus()函数可以对这一状态值作操纵。这一枚举状态有以下四种:

      ·NotModified!———该行或行的值为查询所得,没有发生改变。

      ·DataModified!———该行或列的值为查询所得,发生了改变。

      ·New!———该行或列为一插入的新行,数据没有发生改变(数据为空或缺省值)。

      ·NewModified!———该行或列为一插入的新行,数据发生改变。改变是通过用户键盘输入或调用了SetItem()函数。

     

     

    PB中数据窗口缓冲区与数据修改状态

    摘 要:文章描述了PowerBuilder中数据窗口缓冲区,详细介绍了数据窗口中行与列的修改状态以及PowerBuilder提供的相关函数,并给出了几则应用实例。 关键词:PowerBuilder 数据窗口 缓冲区

    中图分类号:TP311.131
    文献标识码:A
      PowerBuilder是当今最先进的数据库开发工具之一,它以 开放性、可移植性以及易用性而闻名于世。PowerBuilder的突出特点是给应用开发人员提供了非常方便的开发环境和工具,而数据窗口技术则是其中最 耀眼的闪光点。利用数据窗口,开发人员可以完成绝大多数数据操作任务。本文从数据窗口中数据的修改状态的角度出发,介绍利用数据窗口进行应用开发的一些技 巧。
      1 数据窗口缓冲区
    在应用中,每个数据窗口控件都要检索4个内存缓冲区,它们是:
      ·主缓冲区(PrimaryBuffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。
      ·过滤缓冲区(FilterBuffer):存放从主缓冲区中过滤掉的数据。
      ·删除缓冲区(DeleteBuffer):存放从主缓冲区中删除掉的数据。
      ·原始缓冲区(OriginalBuffer):存放从数据库里检索到的原始数据,它由PowerBuild在内部维护,可以利用该缓冲区中的数据进行数据恢复,在应用程序中实现Undo功能。
      2 行与列的修改状态
    行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,它们包含: ·NotModified!:指定行或列处的信息与最初检索出的相同。 ·DataModified!:指定列或行中某列处的信息在检索出后发生了改变。
      ·New!:指定行是新行,但此行的列并未赋值。本状态只适用于行,不适用于单个列。
      ·NewModified!:指定行是新行且行中的列已经赋值。新行的状态成为NewModified!,既可能是用户输入或使用SetItem函数造成的,也可能是由于它的某列具有缺省值。本状态只适用于行,不适用于单个列。
      数据窗口中行或列的修改状态决定Update()函数将为该行或该列产生何种类型的SQL语句。 对主缓冲区和过滤缓冲区中的行,Update为状态是NewModified!的行产生Insert语句,为状态是DateModified!的行产生 Update语句,只有状态是DataModified!的列才会包含在Update语句中。对删除缓冲区中的行,若其状态是New!或 NewModified!,则Update语句不会为其产生Update语句。
      利用函数GetItemStatus可获得某行或某列的修改状态,利用函数SetItemStatus可改变某行或某列的修改状态。
      语法:
      dwcontrol.GetItemStatus(row,column,dwbuffer)
      dwcontrol.SetItemStatus(row,column,dwbuffer,status)
      对于如何改变状态,PowerBuilder有一些限制,表1给出了这种限制,其中Yes表示可把初始状态改变为指定状态,No则表示不可以。

    表1数据修改状态设置约束

    初始状态指定状态New!NewModified!DataModified!NotModified!New!——YesYesNoNewModified!No——YesNew!DataModified!NewModified!Yes——YesNotModified!YesYesYes——  通过观察表1,我们可以发现这样一种情况:假设某个记录的状态为New!,那么不能直接改为NotModified!但可先将它改为DataModified!,然后再改为NotModified!。
      利用函数RowsCopy、RowsMove可以在不同DataWindow控件(或DataStore对象)之间或同一DataWindow控件(或DataStore对象)的不同缓冲区之间复制、移动数据行。
      语法:
      dwcontrol.RowsCopy(startrow,endrow,copybuffer,targetdw,beforerow,targetbuffer)
    dwcontrol.RowsMove(startrow,endrow,movebuffer,targetdw,beforerow,targetbuffer)

      当某行在删除缓冲区中时,或者在主缓冲区或过滤缓冲区中,并且状态为NewModified!或 DataModified!时,其更新标志被设置。函数ResetUpdate清除DataWindow或DataStore中主缓冲区和过滤缓冲区中的 更新标志并清空其删除缓冲区。清除更新标志后,所有行的状态为NotModified!或New!。
      语法:dwcontrol.ResetUpdate()
      3 应用举例
    (1)在数据窗口中,某些列常具有缺省值,或我们在执行了InsertRow操作后立即使用 SetItem函数为某些列赋值。如果用户执行了一个插入操作后立即关闭窗口会触发closequery事件,这时会提示用户记录已经被修改,但用户并没 有感觉到对数据的修改。为避免出现这种情况,可作如下处理:
      intli_new_row
    li_new_row=dw_l.InsertRow(0)
    //通过SetItem函数为列赋值
    dw_l.SetItem(……)
    //将新行的修改状态置为NotModified!
    dw_l.SetItemStatus(li_new_row,0,primary!,NotModified!)

      (2)在应用程序中提供Undo功能,将实现很好的用户友好效果。本例中将数据窗口dw_l中的当前行、当前列的显示值置为从数据库中检索出的原始值:
    string ls_ori_val
    ls_ori_val=dw_l.GetItemString(dw_l.GetRow(),dw_l.GetColumn(),
    &Primary!,True)
    dw_l.SetText(ls_ori_val)

      (3)在协调两个DataWindow对象dw_l、dw_2的更新时,若其中一个更新失败,应阻止重设更新标志,以便回滚事务,一旦所有数据窗口都已成功更新,就可使用COMMIT结束该事务,并使用ReSetUpdate重新设置数据窗口的状态标志。
    Int li_ret_code
    li_ret_code=dw_l.Update(True,False)//阻止重设更新标志
    If li_ret_code=l then
    li_ret_code=dw_2.Update(True,False)//阻止重设更新标志
    lf li_ret_code=l then
    dw_l.ResetUpdate()//清除更新标志
    dw_2.ResetUpdate()//清除更新标志
    COMMIT;
    Else
    ROLLBACK;
    Endif
    Endif
    (4)将数据行从删除缓冲区移到主缓冲区,实现取消删除的功能。
    dw_l.RowsMove(l,dw_l.DeletedCount(),Delete!,dw_l,l,Primary!)


    展开全文
    ww502 2012-06-09 11:20:28
  • DATAWINDOW的四个缓冲区  在PowerBuilder中,DataWindow是用户前端用来存储、操纵数据的对象。  在每一个DataWindow对象中有4个二维表作为数据缓冲区,用来存储查询到的数据。  用户在DataWindow中对数据处理...

    DATAWINDOW的四个缓冲区  


      在PowerBuilder中,DataWindow是用户前端用来存储、操纵数据的对象。

      在每一个DataWindow对象中有4个二维表作为数据缓冲区,用来存储查询到的数据。

      用户在DataWindow中对数据处理系统内部的操作实际上都是将数据在这几个缓冲区中进行的修改和移动,最后在用户提交数据库时,

      系统根据这四个缓冲区中的信息形成SQL的IN-SERT,UPDATE,DELETE等语句。这四个缓冲区是: 


      1、Primary Buffer  主缓冲区

      这个缓冲区是存放填充窗口中DataWindow控件中数据的,

      调用DataWindow的Retrieve()函数和InsertRow()函数可以将数据填入这个缓冲区中。

      当使用有关DataWindow删除DeleteRow()和过滤函数用Filter()时,相应记录将从这一缓冲区中删除。

      而在执行DataWindow的Update()函数时,PowerBuilder将查看这一缓冲区中的记录,以形成SQL INSERT和UPDATE语句。 


      2、Delete Buffer  删除缓冲区

      这个缓冲区保存的是用DeleteRow()函数从Primary Buffer中删除的记录,

      执行Update()函数时,系统根据这一缓冲区的记录形成DELETE语句。

     

      3、Filter Buffer  过滤缓冲区

      这个缓冲区存储的是从Original Buffer使用Filter()函数过滤到Primary Buffer中后剩余的记录。 



      4、Original Buffer 原始缓冲区

      这一缓冲区存储的是DataWindow最初执行retrieve()函数时得到的全部记录。

      当提交数据库时,根据Primary Buffer生成的UPDATE语句和根据Delete Buffer生成的DELETE语句都要依据这一缓冲区来构造这些SQL语句中的Where子句。 

      Original Buffer由PowerBuilder内部维护,Power-Builder所提供的任何函数都无法改变它的值,

      不过通过PowerBuilder所提供的GetItem…系列的函数可以读出DataWindow最初从数据库中查到的原始值。

      通过这些函数我们可以编程实现所谓的"Undo"功能,并且得到在使用乐观锁时形成提交数据库的WHERE子句。 

      如果您当前使用的DataWindow没有设置修改的权力,您将不能对Delete缓冲区和Original缓冲进行操作,而且当调用Update()时也将引起系统错误。 

      

      数据缓冲区的状态值 

      Primary Buffer和Delete Buffer都有行级和列级的状态值,这个状态值是一个枚举类型。

      在提交时由该行的状态值来决定是否要产生SQL语句,

      其中Primary Buffer产生的是IN-SERT和UPDATE语句,

      而Delete Buffer产生的是DELETE语句。

      我们用GetItemStatus()函数和SetItemStatus()函数可以对这一状态值作操纵。这一枚举状态有以下四种: 

      ·NotModified!———该行或行的值为查询所得,没有发生改变。 

      ·DataModified!———该行或列的值为查询所得,发生了改变。 

      ·New!———该行或列为一插入的新行,数据没有发生改变(数据为空或缺省值)。 

      ·NewModified!———该行或列为一插入的新行,数据发生改变。改变是通过用户键盘输入或调用了SetItem()函数。

     

             https://www.cnblogs.com/kuailewangzi1212/archive/2006/03/31/363293.aspx

    展开全文
    u19xiaolr 2018-10-26 16:59:17
  • PB-数据窗口缓冲区与数据修改状态   1--缓冲区的介绍   在应用程序运行时,用户对数据窗口进行的操作情况是很复杂的,删除、插入、修改等操作有可能都会发生。记录哪些数据修改过、哪些数据需要删除、哪些数据...

    PB-数据窗口缓冲区与数据修改状态

     

    1--缓冲区的介绍

     

    在应用程序运行时,用户对数据窗口进行的操作情况是很复杂的,删除、插入、修改等操作有可能都会发生。记录哪些数据修改过、哪些数据需要删除、哪些数据是新增加的等等,都是很重要的工作,以便数据保存时能够正确修改数据库。这些工作都是由数据窗口缓冲区来完成的。

     

    在每一个DataWindow对象中有4个二维表作为数据缓冲区,用来存储查询到的数据。用户在DataWindow中对数据处理系统内部的操作实际上都是将数据在这几个缓冲区中进行的修改和移动,最后在用户提交数据库时,系统根据这四个缓冲区中的信息形成SQL的IN-SERT,UPDATE,DELETE等语句。

     

    数据窗口在运行时要创建四个缓冲区,分别是主缓冲区、删除缓冲区、过滤缓冲区和原始缓冲区,这四个缓冲区各司其职、共同配合,来保证数据窗口对数据的正确处理。下面分别加以介绍。

     

    1.主缓冲区[Primary Buffer]--存放检索出来的数据,但不包括过滤掉和删除掉的数据。

    最重要的一个缓冲区,保存的是当前显示在数据窗口中的所有数据以及它们的修改状态,函数中的缓冲区参数缺省也是该缓冲区,这个缓冲区是存放填充窗口中DataWindow控件中数据的,调用DataWindow的Retrieve()函数和InsertRow()函数可以将数据填入这个缓冲区中。当使用有关DataWindow删除和过滤函数时,相应记录将从这一缓冲区中删除。而在执行DataWindow的Update()函数时,PowerBuilder将查看这一缓冲区中的记录,以形成SQL INSERT和UPDATE语句

    2.删除缓冲区[Delete Buffer]--存放从主缓冲区中删除掉的数据。

    该缓冲区保存的是用DeleteRow()或者dw_1.rowsmove(1,3,primary!,dw_1,1,delete!)函数从Primary Buffer中删除的记录,执行Update()函数时,系统根据这一缓冲区的记录形成DELETE语句。在数据没有提交到数据库之前,可以从该缓冲区中将数据恢复出来,数据提交后,该缓冲区中的数据清空。

    3.过滤缓冲区[Filter Buffer]--存放从主缓冲区中过滤掉的数据。

    该缓冲区中保存的是没有通过【过滤条件】的所有数据,这些数据在存储时同主缓冲区的数据一起生成相应的insert或update语句。存储的是从Original Buffer使用Filter()函数过滤到Primary Buffer中后剩余的记录。

    4.原始缓冲区[Original Buffer]--存放从数据库里检索到的原始数据。

    这一缓冲区存储的是DataWindow最初执行retrieve()函数时得到的全部记录。当提交数据库时,根据Primary Buffer生成的UPDATE语句和根据Delete Buffer生成的DELETE语句都要依据这一缓冲区来构造这些SQL语句中的Where子句。它由PowerBuilder内部维护,PB所提供的任何函数都无法改变它的值,不过通过PowerBuilder所提供的GetItemX系列的函数可以读出DataWindow最初从数据库中查到的原始值。通过这些函数我们可以编程实现所谓的Undo”功能,并且得到在使用乐观锁时形成提交数据库的WHERE子句。如下:

     

    String LName,LName1

    LName = dw_2.GetItemString(1, "name", Primary!, TRUE)原始缓冲区数据

    LName1 = dw_2.GetItemString(1, "name", Primary!, false) 修改后的主缓冲区数据

     

    或用 点状表示法

    LName=string(dw_top.object.name.ORIGINAL[1])原始缓冲区数据    

     

    修改后的主缓冲区数据

    LName1=string(dw_top.object.name.Primary[1])或string(dw_top.object.name.CURRENT[1])

     

    综上所述,不管我们对缓冲区数据做任何处理,只要没有执行UPDATE()时,就不会对后台数据库有影响。

    ----如果您对当前使用的DataWindow没有设置修改的权力,您将不能对Delete缓冲区和Original缓冲进行操作,而且当调用Update()时也将引起系统错误。

     

    2--数据缓冲区的状态值

     

    1,所有这些数据的移送无需脚本的干预,只管使用相应的函数即可。

     

    日常使用中很多数据窗口函数经常对这四个缓冲区进行操作【original缓冲区在脚本中很少使用】,默认缺省的缓冲区为Primary!。这三个[original除外]缓冲区,除了保存相应的数据外,都自动维护这些数据的修改标志,它们之间的协作也是自动维护的。例如,当使用过滤函数时,没有通过过滤条件的数据自动从Primary缓存区移送到Filter缓存区;执行删除操作时,数据自动从Primary缓存区移送到Delete缓存区。

     

    2,一些特殊情况下需要人工干预,特别是在需要数据恢复时。

     

    经常使用的方法是,专门建立一个数据窗口用来显示缓冲区的数据,使用函数RowMove,它可以将数据从一个缓冲区移动到另外缓冲区中,在两个数据窗口之间移动数据。该函数的语法是:

    dwcontrol.RowsMove ( startrow, endrow, movebuffer, targetdw, beforerow,targetbuffer )

    其中,dwcontrol是进行移动操作的源数据窗口;startrow和endrow是要移动数据的范围(包括这两个行号的数据);movebuffer指要从哪个缓存区移出数据,可以是Primary!、Delete!、Filter;targetdw是目标数据窗口控件名称,可以是与dwcontrol相同的数据窗口控件,也可以是不同的数据窗口控件beforerow表示在目标数据窗口的哪一行之前插入移入的数据,如果该数值比目标数据窗口的行数大,则在最后插入移入的数据;targetbuffer是目标缓存区,取值同movebuffer一样。

     

    如:

    dw_1.rowsmove(1,3,primary!,dw_1,1,delete!)//将要删除的行 移动到 删除缓冲区 然后再UPDATE

    dw_cur.RowsMove(dw_cur.GetRow(),dw_cur.GetRow(),Primary!,dw_del,dw_del.RowCount() + 1,Primary!)

     

    3,另外一种情况是直接修改缓冲区数据修改标识

     

    行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,使用函数dwcontrol.GetItemStatus ( row, column, Primary! )可以获取该缓冲区内指定单元的状态,当参数column为0时,表示读取整个列的修改状态。有以下四种状态。

    NotModified! :指定行或列处的数据和原始数据相同,没有修改过。

    DataModified!:指定行或列处的数据和原始数据不同,修改过。

    New!:该数据行是新增加的,但还没有在该行上输入数据(数据为空或缺省值),只适用于行,不适用于单个列。

    NewModified!:该数据行是新增加的,并且已经在该行上录入了数据,改变是通过用户键盘输入或SetItem()函数,也可能是由于它的某列具有缺省值,本状态只适用于行,不适用于单个列。

    insertrow后,具有默认值的行,是什么状态?

     

    数据窗口中行或列的修改状态决定Update()函数将为该行或该列产生何种类型的SQL语句。

    • 对主缓冲区和过滤缓冲区中的行,状态为NotModified和New!的行将被忽略而不产生SQL语句,状态是NewModified!的行产生Insert语句;状态是DataModified!的行产生Update语句,只有状态是DataModified!的列才会包含在Update语句中。
    • 对删除缓冲区中的行,若其状态是New!或NewModified!,则Update语句不会为其产生Update语句。

     

    这些修改标识都是由数据窗口自动维护的,一般情况下没有必要编写脚本修改这些标记,但并不是说就不能修改。PowerBuilder提供了函数SetItemStatus,它的语法是:dwcontrol.SetItemStatus ( row, column, dwbuffer, status )

    其中,row参数指定将要修改状态的行;column参数指定将要修改状态的列(可以是整型的列号,也可以是string类型的列名),当列号为0时表示要修改row指定的整行的状态;dwbuffer指定要修改哪个缓冲区(肯定不能是original),status为上面的四个取值中的一个,但不是任意的取值,因为有些状态不能用该函数设置成另外一种状态,必须是能够转换的状态。对于如何改变状态,PowerBuilder有一些限制,表1给出了这种限制。

     

    1数据修改状态设置约束

    初始状态

    指定状态

    New!

    NewModified!

    DataModified!

    NotModified!

    New!

    ——

    Yes

    Yes

    No

    NewModified!

    No

    ——

    Yes

    New!

    DataModified!

    NewModified!

    Yes

    ——

    Yes

    NotModified!

    Yes

    Yes

    Yes

    ——

     

     

    表中的Yes表示可以使用SetItemStatus进行该状态设置,No表示进行该状态设置是无效的,不会产生预期的状态,如果标明了某个特定的状态,则说明是新的状态,是该状态是对您指定的状态的替代,而不是期望的状态。例如,数据窗口dw_1的第1行第1列的当前状态为DataModified!,使用函数dw_1.SetItemStatus(1,1,New!)后,第1行第1列的状态改变为NewModified!。同样对于该数据窗口dw_1,如果使用函数dw_1.SetItemStatus(1,1,NotModified!),则会将其状态改变为NotModified!。当从一种状态不允许转变到另一种状态时,可以修改成其他一个中间状态,然后再进行一次转换。例如,要从new!改成NotModified,应该首先转换到DataModified!,然后再改成NotModified!状态

     

     

      利用函数RowsCopy、RowsMove可以在不同DataWindow控件(或DataStore对象)之间或同一DataWindow控件(或DataStore对象)的不同缓冲区之间复制、移动数据行。

     

     

      当某行在删除缓冲区中时,或者在主缓冲区或过滤缓冲区中,并且状态为NewModified!或DataModified!时,其更新标志被设置。函数dw_control.ResetUpdate(),清除DataWindow或DataStore中主缓冲区和过滤缓冲区中的更新标志,并清空其删除缓冲区。清除更新标志后,所有行的状态为NotModified!或New!。

     

     

      dw_control.retrieve()之后,主缓冲区、过滤缓冲区中和原始缓冲区中状态是?

    使用DataWindow的Reset()函数和Retrieve()函数以及改变DataObject属性时,系统将重置这几个缓冲区。

    当用户插入一个新行时,编程者往往要自动在新插入行中的某些列中插入一些缺省的数据值。这时,用户并没有对数据作任何修改。可是在用户要关闭这一窗口时,如果在CloseQuery事件中用ModifiedCount()函数查看数据是否修改,得到的结果显然是有所改变。用户将得到一个提示信息框:"是否打算保存所作的修改?是/否/取消"——这显然是不适合的:而且如果用户选择的是保存时,这些原应是空记录的行也成为了有内容的行,系统将其形成SQL的INSERT语句提交数据库,这样的结果更为恶劣。为改变这一状况,我们可以用SetItemStatus()函数将该行的状态改为New!。即当有新行插入并且设置了缺省值之后,置该行的状态值为New!。下面的程序就可以得到如上的功能。

    ∥Insertanewrowindw_1

    Long l_Row

    l_Row=dw_1.InsertRow(dw_1,GetRow())

    dw_1.SetItem(l_Row,"discount_pct",0,10)

    ---∥SetthrowstatustoNew!sothattheCloseQuerycheckwillonlydetectuserentries.

    dw_1.SetItemStatus(l_Row,0,Primary!,New!)

     

     

    3--应用举例

     

    (1)在数据窗口中,某些列常具有缺省值,或我们在执行了InsertRow操作后立即使用SetItem函数为某些列赋值。如果用户执行了一个插入操作后立即关闭窗口会触发closequery事件,这时会提示用户记录已经被修改,但用户并没有感觉到对数据的修改。为避免出现这种情况,可作如下处理:

     

      intli_new_row

      li_new_row=dw_l.InsertRow(0)

      //通过SetItem函数为列赋值

      dw_l.SetItem(……)

      //将新行的修改状态置为NotModified!

      dw_l.SetItemStatus(li_new_row,0,primary!,NotModified!)

     

    (2)在应用程序中提供Undo功能,将实现很好的用户友好效果。本例中将数据窗口dw_l中的当前行、当前列的显示值置为从数据库中检索出的原始值:

      string ls_ori_val

         ls_ori_val=dw_l.GetItemString(dw_l.GetRow(),dw_l.GetColumn(),Primary!,True)

         dw_l.SetText(ls_ori_val)

     

    (3)在协调两个DataWindow对象dw_l、dw_2的更新时,若其中一个更新失败,应阻止重设更新标志,以便回滚事务,一旦所有数据窗口都已成功更新,就可使用COMMIT结束该事务,并使用ReSetUpdate重新设置数据窗口的状态标志。

      Int li_ret_code

      li_ret_code=dw_l.Update(True,False)//阻止重设更新标志

      If li_ret_code=l then

        li_ret_code=dw_2.Update(True,False)//阻止重设更新标志

        lf li_ret_code=l then

          dw_l.ResetUpdate()//清除更新标志

          dw_2.ResetUpdate()//清除更新标志

          COMMIT;

        Else

           ROLLBACK;

        Endif

      Endif


    Updates the database with the changes made in a DataWindow control or DataStore. Update can also call AcceptText for the current row and column before it updates the database.
    integer dwcontrol.Update ( { boolean accept {, boolean resetflag } } )
    accept true-update之前执行accepttext操作,并且如果the data fails validation,update操作将取消
     false-不执行accepttext操作
    resetflag 是否允许dwcontrol自动reset the update flags

     

    (4)将数据行从删除缓冲区移到主缓冲区,实现取消删除的功能。

         dw_l.RowsMove(l,dw_l.DeletedCount(),Delete!,dw_l,l,Primary!)

    展开全文
    tlammon 2016-03-01 15:55:36
  • 38KB cm2019 2011-03-07 09:14:17
  • weixin_33734785 2011-01-21 13:37:57
  • 79KB weixin_38743506 2019-09-18 14:52:31
  • banfei8624 2019-09-20 22:14:16
  • 393KB weixin_42136826 2021-05-05 15:32:17
  • 10KB weixin_42123237 2021-02-16 10:20:56
  • 5KB weixin_42143161 2021-05-15 21:19:38
  • 84KB weixin_42131443 2021-04-05 17:34:44
  • 154KB weixin_42099942 2021-02-02 18:09:31
  • luoxiya521 2014-12-14 21:34:17
  • bear_79 2014-02-09 12:36:38
  • 18KB weixin_42149153 2021-06-04 17:46:15
  • Albert_1000 2018-12-12 21:16:16
  • 1MB weixin_42134143 2021-02-06 05:10:04
  • 1.23MB weixin_42108778 2021-01-31 19:07:37
  • 82KB weixin_42118423 2021-07-05 19:45:25
  • 57KB weixin_42128676 2021-05-19 17:05:59
  • weixin_35719402 2021-01-13 04:50:41
  • 58KB weixin_42179184 2021-05-23 21:50:44
  • a78782295 2012-02-17 10:51:53
  • weixin_44453694 2021-02-01 11:35:57
  • douan9541 2019-04-19 22:33:36

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,054
精华内容 3,621
关键字:

pb缓冲区