PowerBuilder DataWindow:数据更新与缓冲技术解析

版权申诉
0 下载量 102 浏览量 更新于2024-08-12 收藏 54KB DOC 举报
"本文主要探讨了PowerBuilder中的DataWindow组件在数据更新技术上的应用,特别是如何利用数据缓冲机制实现对非数据源表的即时更新操作。DataWindow是PowerBuilder的核心功能之一,它提供了便捷的数据处理、显示、编辑和打印功能。在DataWindow的数据管理中,存在主记录缓冲区、删除记录缓冲区和过滤记录缓冲区,每个缓冲区又分为当前缓冲区和原来缓冲区,用于跟踪数据的状态变化。当调用Update函数时,会根据数据的状态生成相应的SQL语句,如UPDATE、INSERT或DELETE。对于非数据源表的即时更新,开发者可以利用这些机制来实现对数据的动态操作和管理。" 在深入讨论DataWindow的数据更新技术之前,我们先理解一下DataWindow的基本概念。DataWindow是一个强大的数据访问对象,它可以用来显示、编辑、检索和打印数据库中的数据。它的设计使得开发者能够创建复杂的用户界面,而无需编写大量的底层代码。 DataWindow的数据缓冲机制是其核心特性之一。主记录缓冲区(Primary)存储从数据库获取的原始数据,删除记录缓冲区(Deleted)用于存放被标记为删除的记录,而过滤记录缓冲区(Filter)则用于保存满足特定条件的记录。数据行的状态分为NotModified(未修改)、DataModified(已修改)、New(新记录)和NewModified(新修改的记录),列的状态则有NotModified和DataModified两种。这些状态决定了在调用Update函数时,系统将如何处理这些数据。 当数据发生变化时,DataWindow会自动维护这些状态。例如,如果用户编辑了一个记录,那么该记录的状态就会从NotModified变为DataModified。如果记录被新增,其状态会变为New或NewModified。当调用Update时,PowerBuilder会根据这些状态生成适当的SQL语句,如UPDATE用于更新已存在的记录,INSERT用于插入新记录,而DELETE则用于移除标记为删除的记录。 对于非数据源表的数据即时更新,开发者可以利用DataWindow的数据缓冲技术,先将数据加载到DataWindow中,然后通过编程控制数据的状态,比如模拟插入、更新或删除操作,最后调用Update函数将这些操作提交到数据库。这种方法在处理临时数据或者非持久化数据时非常有效,可以提高开发效率并简化代码。 总结来说,PowerBuilder的DataWindow数据更新技术通过数据缓冲和状态管理,提供了一种灵活的方式来处理数据库操作,特别是对于非数据源表的即时更新,开发者可以通过巧妙地利用这些机制来实现高效的数据管理。这种技术的应用可以大大简化开发过程,提高应用程序的性能和用户体验。
2010-08-19 上传
当数据存在主次表时,当更新了次表数据后,主表数据在后台有更变时。可利用刷新主表当前行的方法重显主表数据。 /************************************************************ 函数名称: f_refresh_currentrow(adw) 功 能: 刷新DW当前行数据,不可刷新NO update or 带arguments的DW 参数说明: adw 目标DW 返 回 值: integer 成功返回1,失败返回-1 作 者: sean 创建时间: 2010年8月18日 ************************************************************/ string ls_dataobject string ls_keys[] //key Column Name string ls_dbname[] //key field Name string ls_coltype[] //field style string ls_tablenm //table name string ls_condition //sql Condition long ll_currentrow //Current Row numeric long ll_column //Column count integer i datawindow ldw datastore ldatastore ldw=adw if ldw.rowcount( )=0 then return -1 elseif trim(ldw.describe( "datawindow.table.arguments"))<>'?' then messagebox('','刷新数据窗口当前行失败!,数据窗口需要参数',exclamation!) return -1 else ll_currentrow=ldw.getrow( ) FOR ll_column = 1 TO long(ldw.object.datawindow.column.count)//key names If ldw.Describe("#"+string(ll_column)+".key") ='yes' Then i++ ls_keys[i]=ldw.Describe("#"+string(ll_column)+".name") ls_dbname[i]=ldw.Describe("#"+string(ll_column)+".dbname") ls_coltype[i]=ldw.Describe("#"+string(ll_column)+".coltype") End If NEXT if upperbound(ls_keys[])=0 then messagebox('','刷新数据窗口当前行失败!,没有主键',exclamation!) return -1 else ls_tablenm=left(ls_dbname[1],pos(ls_dbname[1],'.') -1) //table name for i=1 to upperbound(ls_keys[]) if pos('numb,deci,long,',LeftA(ls_coltype[i],4) +',')>0 then ls_condition+="and "+ls_dbname[i]+"="+string(f_getitem(ldw,ll_currentrow,ls_keys[i])) else ls_condition+="and "+ls_dbname[i]+"='"+string(f_getitem(ldw,ll_currentrow,ls_keys[i]))+"'" end if next ls_condition=mid(ls_condition,4) //sql Condition ldatastore=create datastore ldatastore.dataobject=ldw.dataobject ldatastore.settransobject( sqlca) if f_addwhere_retrieve(ldatastore,ls_condition)=1 then if ldatastore.rowcount( )=1 then ldw.object.data[ll_currentrow]=ldatastore.object.data[1] ldw.setitemstatus( ll_currentrow, 0, primary!, NotModified!) //if ldw.getrow( )<>ll_currentrow then ldw.scrolltorow( ll_currentrow) end if else messagebox('','刷新数据窗口当前行失败!,条件语法错误',exclamation!) return -1 end if destroy ldatastore end if end if