PowerBuilder中数据窗口缓冲区
PowerBuilder第9讲 数据窗口应用
2、建立共享函数 格式: Integer dw_primary.ShareData(dw_secondary) 参数:①dw_primary:主数据窗口的数据窗口控件名。 ②dw_secondary:从数据窗口的数据窗口控件名。 返回值:函数执行成功时返回1,发生错误时函数返回-1。 如果任何参数的值为NULL,则ShareData()函数返回 NULL。 功能:从数据窗口共享主数据窗口中的数据。 说明:
演示一个主从关系数据窗口的实现
添加dw_1和dw_2, 分别连接d_sellerp和d_sellers; 在open事件中添加以下代码 dw_1.setTransObject(SQLCA) dw_2.setTransObject(SQLCA) dw_1.retrieve() dw_2.retrieve() dw_1.setRowFocusIndicator(hand!)
添加删除按钮,其代码如下: long rsm, row row = dw_2.GetRow() rsm = dw_2.RowCount() if row>0 and row<=rsm then dw_2.DeleteRow(row) end if
数据存储用毕之后,需要使用Destroy语 句删除该对象, 例如:DESTROY ids_stock
9.2 主从数据窗口
使用数据窗口技术操作数据库表中数据的常 用方法 回顾几种检索、修改表中数据的方法 数据库信息管理系统中一个很重要的工作就 是检索、修改数据,为了实现这些功能,我 们曾经学习过以下一些方法。
数据存储通常使用在下述四个方面:
PowerBuilder数据窗口技巧
PB数据窗口技巧1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用Column 的Protect 属性可以很方便的做到这一点,方法如下:将每一列的Protect 属性设置为:If( IsRowNew(), 0, 1) )在PowerScript 中可以动态修改Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。
2 如何在DataWindow中实现列的自动折行我们在PowerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自动折行.具体步骤如下:1) 在DataWindow Painter中打开此DataWindow.2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口.3) 选择Position标签, 选中Autosize Height 多选框.4) 选择Edit标签, 不选中Auto Horz Scroll多选框.5) 单击OK按钮, 保存所做的修改.6) 点中Detail Band (即写有Detail的灰色长带), 单击鼠标右键, 选择Properties... 菜单项.7) 选中Autosize Height多选框.8) 单击OK按钮, 保存所做的修改.9) 保存此DataWindow.注意:连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不会自动进行折行.3 在数据窗口中实现动画要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在Timer Interval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。
PowerBuilder相关开发操作总结
Peterevans's Development Notes1.数据窗口中点击相同行同时选中:Long iString ls_testnoDateTime ldt_opstimeIF row <= 0 Or IsNull(row) THENThis.SelectRow(0,False)RETURNEND IFIF row = GetSelectedRow(0) THEN RETURNThis.SelectRow(0,False)ls_Test_No = This.GetItemString(row,"pat_master_index_inp_no")ldt_opstime = This.GetItemDateTime(row,"operation_schedule_scheduled_date_time")FOR i = This.RowCount() To 1 Step -1IF This.GetItemString(i, "pat_master_index_inp_no") = ls_Test_No And This.GetItemDateTime(i, "operation_schedule_scheduled_date_time") = ldt_opstime THENThis.SelectRow(i,True)END IFNEXT2.创建数据通道语句:datastore lds_opslds_ops = Create datastorelds_ops.DataObject = 'd_schedule_arrange'lds_ops.SetTransObject(sqlca)3.在已过滤后的数据基础上对datawindow进行过滤dw_1.setfilter(dw_1.describe("datawindow.table.filter")+your_join+your_new_filter)dw_1.filter()4.在datawindow中显示动态时间建立一个计算域,表达式为string(datetime(today(),now()),'yyyy年mm月dd日 hh点mm分ss秒'),同时设置datawindow的属性dw_1.Object.DataWindow.Timer_Interval=5005.在数据窗口中只显示不同的数据dw_1.filter("isnull(columnname[-1]) and columnname<>columnname[-1]")dw_1.filter()6.统计数据窗口中处于选中状态的行数方法一: long ll_Selected ll_Selected = long(dw_1.describe("evaluate('sum( if(IsSelected(), 1, 0) for all)',1)"))方法二: long ll_Selected ll_Selected = long(dw_1.describe("evaluate('count(IsSelected() for all)',1)"))方法三:upperbound(dw_1.Object.Data.Selected)7.在数据窗口中选定想要打印的几条记录long ll_posdataStore lds_dslds_ds = create dataStorelds_ds.dataObject = dw_1.dataObjectfor ll_pos = 1 to dw_1.rowCount()if dw_1.IsSelected(ll_pos) thendw_1.RowsCopy(ll_pos,ll_pos,Primary!,lds_ds,lds_ds.rowCount()+1,Primary!) end ifnextlds_ds.print()8.单击编辑框选中其中内容自定义事件ue_clicked,代码是:this.selecttext(1,len(this.text)),getfocus事件的代码改为:This.Post Event ue_clicked()。
PowerBuilder数据窗口技巧
PB数据窗口技巧1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用Column 的Protect 属性可以很方便的做到这一点,方法如下:将每一列的Protect 属性设置为:If( IsRowNew(), 0, 1) )在PowerScript 中可以动态修改Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。
2 如何在DataWindow中实现列的自动折行我们在PowerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自动折行.具体步骤如下:1) 在DataWindow Painter中打开此DataWindow.2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口.3) 选择Position标签, 选中Autosize Height 多选框.4) 选择Edit标签, 不选中Auto Horz Scroll多选框.5) 单击OK按钮, 保存所做的修改.6) 点中Detail Band (即写有Detail的灰色长带), 单击鼠标右键, 选择Properties... 菜单项.7) 选中Autosize Height多选框.8) 单击OK按钮, 保存所做的修改.9) 保存此DataWindow.注意:连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不会自动进行折行.3 在数据窗口中实现动画要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在Timer Interval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。
PowerBuilder数据窗口编程技巧十则
PowerBuilder取得巨大成就的原因就是有Datawindow对象,DataWindow是具有功能强大和灵活多变的特点,本人用PowerBuilder开发过一段时间后,总结出一些技巧,以供广大的PB开发者借鉴使用。
一.如何创建一个报表,如下形式Quantity Running Total5,000 5,0002,500 7,5003,000 10,50012,000 22,500对于Running Total列,我们可使用计算列:CumulativeSum(Quantity for all),即可达到逐渐递增求和的功能。
二.数据窗口的数据送缓冲区之前确认的四个步骤判断数据类型是否正确。
如不正确则触发ItemError事件。
判断数据是否符合有效性规则。
如不符合有效性规则,同样触发It emError事件。
判断是否有数据被改动。
判断数据是否通过ItemChanged事件,如果数据和ItemChanged相斥,将触发ItemError事件。
三.如何在DataWindow中用数据类型为Datetime的列为条件进行查找1.当要查找的日期条件是一常数时使用如下表达式:2.当要查找的日期条件是一个变量时使用如下的表达式:3.当要查找的日期条件是一个DateTime数据类型时使用如下表达式:四.设置数据窗口Boolean型属性的三种方法PowerBuilder提供了三种方法设置数据窗口的布尔型属性,分别是True/False, 1/0, ' Yes'/'No'。
例如:PowerBuilder在处理上以字符串的形式保存属性,而不考虑属性值是布尔型、长整型或是字符型。
为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现即使是列的颜色属性它也是使用带双引号的数字来表达。
五.如何在DataWindow中快速删除多行在开发过程中可能经常有要进行多行删除的操作,一般都使用循环语句进行操作:一个快速的删除方法是把要删除的行从主缓冲区中移到删除缓冲区中。
powerbuilder(pb)数据窗口(datawindow)缓冲区与状态解释
PowerBuilder数据窗口缓冲区与状态详解Powerbuilder(pb)的datawindow(数据窗口)的各个缓冲区和状态是pb数据窗口的非常重要的,对这些概念的理解,将有助于我们认识pb数据窗口的优势。
基本概念数据窗口的三个缓冲区:Primary!Delete!Filter!Getitemstatus(row,列名或者列号,缓冲区)当要取整个行的状态时,列名或者列号用0表示数据窗口中数据项状态Notmodified! 从数据retrieve出来后没有改变过Datamodified! 数据retrieve出来后有过改变New! 数据窗口增加了一列但没有录入过数据,该列的状态就是new!Newmodified! 数据窗口增加了一列,同时改列被录入了数据,该列的状态就是newmodified!retrieve出来后,结果如下:所有的行和数据项状态都是notmodified用geitemstatus(行号,列名,primary!)取每一数据项状态用getitemstatus(行号,0,primary!)去行状态001,002,ddd三个格子所在的数据项状态仍旧是notmodifiedAAA(原是Ccc)所在格子的数据项状态是datamodified第一行(001,AAA)的行状态是datamodified第二行(001,ddd)的行状态时notmodified后,如下:2点。
第三行状态就是new!请用getitemstatus(3,0,primary!)取第三行状态第三行的每一项将变为datamodified!开发中实例:表1(因为是举例,请不要考虑数据库设置中的冗余概念,如表2中的姓名没必要等)需求一、删除表1中的数据的同时,把表2的数据也删除,必须删除,不考虑约束条件。
如把表1中001,002删除了,需要把表2中所有001,002的记录删除,(【删除】和【保存】是两个按钮或菜单,就是说【删除】只是删除了前台的内容,不【保存】数据库中数据是没有被删除的,数据库需要【保存】执行的时候才真正执行删除),怎么做?1、可以使用触发器;2、可以在删除之前把表1记录下来,【保存】时对比表1,看那些数据缺少了;3、……..DeletedCount ( )Getitemstring(row,列名,delete!,true)(为什么用true,不用false呢?,true是从数据库取出来的默认值,false是当前值,如果删之前用户修改过编号,但是没有保存,用false就会有问题)需求二、把表1中编号001改为了A01,002改为001,003改为B05,004,005不变(没有任何规律的),要求表二的编号也这么改过来。
PB中数据窗口的数据缓冲区
PB中数据窗口的数据缓冲区在PB中,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最初从数据库中查到的原始值。
PowerBuilder第8讲 数据窗口控件解读
第一页
上一页 下一页
最后 一页
结束 放映
//设置事务对象属性
// Profile stock
SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "ConnectString='DSN=stock;UID=sa;PWD='" //与数据库连接 CONNECT USING SQLCA; //检查连接是否成功
7.2 数据窗口控件与数据库
在窗口画板中,把一个数据窗口对象与一个
数据窗口控件连接后,如果预览该数据窗口, 数据窗口会显示一个没有数据的数据窗口控 件。应用程序是通过数据窗口控件与数据窗 口对象交互的,如果要想在数据窗口控件中 显示数据,必须把定义数据窗口对象的数据 源连接到数据窗口控件中,也就是说要创建 应用程序与数据库的连接。
//清除数据窗口控件dw_1数据窗口中的所有数据。 dw_1.reset( ) //将数据窗口控件dw_1关联的数据窗口对象换成名为d_graph dw_1.dataobject="d_graph" //让数据窗口控件d_graph使用系统缺省的事务对象SQLCA dw_1.settransobject(SQLCA) //让数据窗口控件d_graph从数据库中提取数据。 dw_1.retrieve( )
第一页
上一页 下一页
最后 一页
结束 放映
该函数执行成功时返回一个长整数指示显示的数 据行数(即主缓冲区中的数据行数),失败时 返回-1。如果参数中有空值(NULL),则该 函数返回空值。 例1,语句lrc=dw_1.Retrieve ( )执行无参数检 索,返回值放到long型变量lrc中。 例2,假定数据窗口控件dw_1包含的数据窗口对 象使用下述SQL SELECT语句: SELECT indate, sid, quantity,unit,cost From instock WHERE indate between :a_date1 and :a_date2 其中 :a_date1和:a_date2是数据窗口画板中定 义的参数,对应的检索语句可以为: lrc=dw_1.Retrieve (date(‘2000-01-01’, ‘2001-01效)
pb考试题
5、对窗口上的控件进行齐整性操作,都是以第一个选中的控件为基准的。( )
6、控件中的Tag属性它本身并没有什么特定的用途。( )
三、选择题
1、按照窗口控件的功能特点,窗口控件可分为七类。复选框是属于 类别,多行编辑框是属于 类别,数据窗口控件是属于 类别。
2、 简述PowerScipt中的条件语句和Choose语句、For循环语句和Do循环语句的功能和使用场合。
四、编程题
1、求出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数的本身。例如:153就是一个“水仙花数”,用Messagebox函数显示结果。
2、求出从1到100之间所有的素数,用Messagebox函数显示结果。
A、按钮类 B、显示类 C、输入类 D、对象类 E、分组类 F、装饰类
2、要同时选择多个控件,采用的方法为 。
A、 在窗口中逐个单击要选择的控件。
B、 按快捷键Ctrl+A
C、 先按Shift键,然后逐个单击所要选择的控件。
D、 先按Ctrl键,然后逐个单击所要选择的控件。
3、 简述如何改变窗口中控件的焦点顺序。
4、 如何进行窗口中控件的布局调整?
5、 在PB中表示颜色的方法有哪几种?
练习题六
一、填空题
1、PowerBuilder提供了 、 、 、 、
5种数据源。
2、PowerBuilder的数据窗口提供了12种显示风格。与Excel电子表格的风格相似,行与列之间通过网格线分割的是 风格。常用于数据输入界面用的,一般一屏显示一条记录的是 风格。
PowerBuilder中数据窗口缓冲区
PowerBuilder中数据窗口缓冲区摘要:文章描述了PowerBuilder中数据窗口缓冲区,详细介绍了数据窗口中行与列的修改状态以及PowerBuilder提供的相关函数,并给出了几则应用实例。
PowerBuilder是当今最先进的数据库开发工具之一,它以开放性、可移植性以及易用性而闻名于世。
PowerBuilder的突出特点是给应用开发人员提供了非常方便的开发环境和工具,而数据窗口技术则是其中最耀眼的闪光点。
利用数据窗口,开发人员可以完成绝大多数数据操作任务。
本文从数据窗口中数据的修改状态的角度出发,介绍利用数据窗口进行应用开发的一些技巧。
1 数据窗口缓冲区在应用中,每个数据窗口控件都要检索4个内存缓冲区,它们是:·主缓冲区(PrimaryBuffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。
·过滤缓冲区(FilterBuffer):存放从主缓冲区中过滤掉的数据。
·删除缓冲区(DeleteBuffer):存放从主缓冲区中删除掉的数据。
·原始缓冲区(OriginalBuffer):存放从数据库里检索到的原始数据,它由PowerBuild在内部维护,可以利用该缓冲区中的数据进行数据恢复,在应用程序中实现Undo功能。
2 行与列的修改状态行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,它们包含:·NotModified!:指定行或列处的信息与最初检索出的相同。
·DataModified!:指定列或行中某列处的信息在检索出后发生了改变。
·New!:指定行是新行,但此行的列并未赋值。
本状态只适用于行,不适用于单个列。
·NewModified!:指定行是新行且行中的列已经赋值。
新行的状态成为NewModified!,既可能是用户输入或使用SetItem函数造成的,也可能是由于它的某列具有缺省值。
PowerBuilder10.复习资料
一、单项选择题1. 在PowerBuilder10.0中创建一个应用程序时,应当首先创建:( b )A. 应用ApplicationB. 工作空间WorkSpaceC. 窗口对象WindowD. 菜单对象Menu2. 在新建对话框的页面中,Project 页用于:( c )A. 产生新的工作区B. 产生新的目标C. 应用程序的编译和发布D. 产生新的对象3. PowerBuilder应用程序的入口点是:( a )A. 应用对象B. 窗口C. Main函数D. 主菜单4. 在同一时间内,PowerBuilder开发环境:(a )A. 可以连接到多个数据库,但只能有一个数据库是活动的。
B. 只能连接到一个数据库,且只能有一个数据库是活动的。
C. 可以连接到多个数据库,且可以有多个数据库是活动的。
D. 不能选择数据库的连接。
5. PowerScript 的续行符为:( a )A. &B. //C. *D. **6. 在嵌入式SQL语句中,下列说法正确的是:(d )A. 无需使用续行符,也无需结束符号(;)B. 需要使用续行符C. 不需要结束符号D. 无需使用续行符,但需要结束符号(;)7. 代词Parent 指:()A. 当前控件所在的窗口。
B. 运行时菜单所在的窗口。
C. 父对象D. 对象或控件本身。
8. 指示最近一次SQL语句执行成功的SQLcode的取值为:(d )A. 1B. -1 (失败)C. 100 (空表)D. 0 (成功)9. 按钮的跳转序号为0时,表示:( d )A. 用tab键移动输入焦点时跳过该控件的使用,且不能选择该控件。
B. 该控件不可用C. 该控件最先被选中。
D. 用tab键移动输入焦点时跳过该控件的使用,但可以通过鼠标选择该控件。
10. 在同一个组中,每次只能选中其中一个控件的是下列那一类控件:(a )A. 单选按钮B. 复选框C. 组框D. 编辑框1. 能够从多个表中进行选择的数据源是:(a )A. SQL Select 数据源B. Quick Select 数据源C. Query数据源D. External数据源2. 一般情况下,下列哪种风格的数据窗口用于一屏显示一条记录:(a )A. 自由格式B. Grid格式C. 标签风格D. 列表风格3. 在数据窗口中,tab order为0的对象,含义是:( c )A. 首先被选中B. 永远无法得到输入焦点C. 通过tab键无法选中,但通过鼠标可以选中D. 最后被选中4. 数据过滤针对存放在数据窗口缓冲区中的数据进行,在此过程中:(d )A. 需要访问数据库,且生成新的SQL语句B. 不需要访问数据库,且生成新的SQL语句C. 需要访问数据库,不生成新的SQL语句D. 不需要访问数据库,不生成新的SQL语句5. PowerScript 的续行符为:( a )A. &B. //C. *D. **6. 在嵌入式SQL语句中,下列说法正确的是:( d )A. 无需使用续行符,也无需结束符号(;)B. 需要使用续行符C. 不需要结束符号D. 无需使用续行符,但需要结束符号(;)7. 代词Parent 指:( a )A. 当前控件所在的窗口。
powerbuilder的各类操作
powerbuilder的各类操作1.关闭Form窗体:Close(Parent);2.打开Form窗体:Open(w_main);3.Form窗体分类:1)Main(主窗口)主窗口是窗口对象的标准类型.它可以覆盖其他窗口,也可以被其他窗口所覆盖.主窗口是一种独立的窗口,不依赖于其他任何窗口,即其可以单独打开和关闭.主窗口一般用于应用程序的主界面,或者MDI应用程序的工作表窗口.当创建一个新窗口时,其缺省的窗口类型即为主窗口.2)Child(子窗口)子窗口不能独立存在,必须从作为其父窗口的主窗口或弹出式窗口中打开,打开的位置相对于其父窗口而不是整个屏幕.子窗口仅可以在其父窗口内移动,当其一部分移出父窗口时,不显示该部分.3)MDI Frame(多文档界面框架窗口)4)MDI Frame with MicroHelp(带微帮助的多文档界面框架窗口)5)Popup(弹出式窗口)弹出式窗口从其父窗口或应用程序的Open事件中打开,并随父窗口关闭.弹出式窗口可以移到其父窗口的外面,但不能被父窗口覆盖.6)Response(响应式窗口)响应式窗口由其父窗口激活,一般要求用户输入信息.当其打开时,成为活动窗口.此时只有用户响应后方可关闭.否则不能切换到应用程序的其他窗口.4.数据窗口的使用:在窗体的Open事件中加入:connect;dw_1.settransobject(sqlca)dw_1.retrieve()注:1)connect;该行语句表示使用PB缺省的对象SQLCA连接数据库.2)dw_1.settransobject(sqlca)该行语句为dw_1数据控件指明数据窗口对象,应当从SQLCA事物对象中获取数据库的有关信息.3)dw_1.retrieve()该行语句指定数据窗口对象要获取数据,应当执行创建数据窗口对象时所定义的SELECT语句.5.在定义数据控件中的SELECT语句时,在WHERE中用到参数时:(步骤如下)1)在主窗口的"Design"下拉菜单中选择"Retrieval Arguments"选项,显示"Specify Retrival Arguments"对话框;2)在WHERE子句中使用上面定义的获取参数获取特定的记录,定义WHERE子句的步骤如:一.激活WHERE子句窗口;二.在Value项中输入参数名.注意在该参数前必须有一个":".冒号表明这是一个变量,可以在SQL语句中使用.三.在程序运行时,可对该参数动态赋值:connect;dw_1.settransobject(sqlca);dw_1.retrieve(参数名);6.数据控件的增删改查基本操作:1)增加记录:dw_1.Reset();//清除数据窗口dw_1dw_1.InsertRow(0);//在数据窗口中添加新的一行记录2)删除记录:dw_1.DeleteRow(0);//删除当前行3)更新记录:if dw_1.update()=1 thenCOMMIT;ElseROLLBACK;End if7.菜单编项中关闭:Close(ParentWindow);8.创建应用程序的可执行文件:(步骤)1)单击主窗口中工具栏的"NEW"按钮,打开"NEW"对话框,选择其中的"Project"(工程)选项卡.2)选择"Application"图标,单击"OK"按钮,打开"Project"画板.3)在"Executable File Name:"编辑框中键入可执行文件的名称,或者单击该编辑框右边的浏览按钮,选择保存可执行文件的路径.4)选择"Prompt For Overwrite"复选框和"Machine Code" 复选框.5)单击主窗口工具栏的"Build"(创建)按钮,或者选择"Design"菜单中的"Build Project"选项,创建可执行文件.9.游标的使用:string id,name//定义变量DECLARE idAndName CURSOR FOR//声明游标SELECT DISTINCT id,namefrom userORDER BY id asc;OPEN idAndName;//打开游标do//循环取值fetch idAndName into:id,:name;lb_1.additem(trim(id)+"|"+trim(name))loop while sqlca.sqlcode=0;close idAndName;10.子数据控件的运行:datawindowchild dw_child//定义子数据窗口dw_1.getchild("dw_1",dw_child)//获取子数据窗口connect;dw_child.settransobject(sqlca)//运行子数据窗口dw_child.retrieve(参数列表)11.数据控件中控件的赋值:dw_1.object.t_1.text="您好"//给数据控件中标签赋值12.显示打印机选项:printsetup()13.事务对象:是一个不可视的对象,驻留在内存中.事务对象包含了与数据库连接所必需的相关属性参数.在操纵数据库时,填写连接时所需的信息到该对象中,才可工作.当操作结束后,显示其返回值.1)缺省事务对象SQLCA:SQLCA(SQL Communication Area)即SQL通信区.SQLCA是不全局变量,可以在应用程序的任何事件中使用.应用程序开始运行时,SQLCA被自动创建.如果只用到一个事务对象,则可直接使用SQLCA.如果连接多个数据库,则需创建自己的事务对象.创建事务对象:Transaction First_transFirst_trans=Create Transaction注:使用事务对象后,应在脚本中删除该对象.Destroy First_trans但:不必删除SQLCA对象,因为它是PB自动完成的.2)事务对象的属性:其属性共有15项,可分为两组,第1组用于设置数据库连接参数,包括DBMS,连接的数据库,服务器名等;第2组用于返回给用户的信息,如有关数据库的状态,执行命令等.第1组属性中:一.AutoCommit:布尔值,用于指定是否自动提交(Commit).当该值为True时,则每次操作数据库后自动提交,其缺省值为False.二.Database:字符串型,当前事务对象所连接的数据库名.三.DBMS:字符串型,当前PB所使用的数据库管理系统名,如Oracle,Sybase等.四.DBParm:字符串型,DBMS所需的特定的连接参数.五.DBPass:字符串型,连接数据库时所需的口令.六.Lock:字符串型,数据库的隔离级别.七.LogID:字符串型,用户登陆到数据库服务器的用户ID.八.LogPass:字符串型,用户登录到数据库服务器所需的口令.九.ServerName:字符串型,数据库服务器名.十.UserID:字符串型,连接到数据库所需的用户名.第2组为返回信息参数,其中:一.SQLCode:长整型,返回用于判断SQL命令是否执行成功的代码:0:表示操作成功.-1:表示操作失败.100:表示没有出错,但未检索到可用数据.二.SQLRows:长整型,返回受前面的SQL命令影响的行数.三.SQLDBCode:长整型,返回数据库连接的错误代码.不同的DBMS返回的代码不同.四.SQLErrText:字符串型,返回数据库连接的错误信息,该信息与SQLDBCode错误码相对应.五.SQLReturnData:字符串型,返回DBMS指定的其他信息.3)设置属性:一.人工设置:SQLCA.DBMS="ODBC"SQLCA.Database="MyDB"SQLCA.LogID="HCS"SQLCA.LogPass="MyPassWord"SQLCA.ServerName="Sea"SQLCA.AutoCommit=False二.使用函数设置:可以使用ProfileString()函数从系统的.INI文件中提取有关属性信息,将其赋值给事务对象.ProfileString()函数的语法规则如下:ProfileString(file,section,key,default)其中:file:指定文件名.section:指定文件中某一节.key:相应节的变量.default:当所取值为空时,将该缺省值赋给相应的事务对象.在PB.INI文件中的Database节中保存了上次应用程序与数据库连接时的连接属性.下例从PB.INI文件中读取应用程序在上次数据库连接时所用的事务对象属性值.SQLCA.DBMS=ProfileString("PB.INI","Database","DBMS","") SQLCA.Database=ProfileString("PB.INI","Database","Databas e","")SQLCA.LogID=ProfileString("PB.INI","Database","LogID","")SQLCA.LogPass=ProfileString("PB.INI","Database","LogPass", "")SQLCA.ServerName=ProfileString("PB.INI","Database","Serv erName","")/doc/6c15778729.html,erID=ProfileString(" PB.INI","Database","UserId","")SQLCA.DBPass=ProfileString("PB.INI","Database","DBPass"," ")SQLCA.Lock=ProfileString("PB.INI","Database","Lock","")SQLCA.DbParm=ProfileString("PB.INI","Database","DbParm", "")14.连接数据库:1)建立连接:连接数据库使用内嵌的SQL的CONNECT命令,其语法格式为:connect(using TransactionObject);因为CONNECT是SQL语句,所以在其结尾处要加一个分号,以示区别.参数"USING TranscationObject"是可选项,如果未指定使用的事务对象,PB认为使用的是缺省的事务对象SQLCA.一般情况下,即使使用SQLCA事务对象,也应该在脚本中使用USING子句,以便于阅读.如:CONNECT USING SQLCAT该语句连接数据库,如下语句通过SQLCA的返回参数SQLCode的值判断连接是否成功.如果返回小于0,则为失败,并显示错误信息,然后使用Halt命令停止程序执行.If SQLCA.SQLCode<0 thenMessageBox("Fail","Can`t Connect Database.")HaltEnd if2)断开连接:在访问数据库任务结束以后,应及时断开与数据库的连接,为此使用如下SQL语句:Disconnect Using SQLCA;if SQLCA.SQLCode<0 thenMessageBox("Fail","Can`t Disconnect Database")HaltEnd if3)分配事务对象:创建事务对象并与数据库连接之后,要使数据窗口控件可以访问数据库,还应当将该事务对象分配给数据窗口控件,为此使用SetTransObject函数,该函数的调用格式为:dw_1.SetTransObject(Transaction)其中:dw_1:数据窗口控件名.Transaction:缺省或用户定义的事务对象名.该函数返回一个整型值,若调用成功,则返回1;若调用失败,则返回-1.例:Integer Tr_1Tr_1=dw_1.SetTransObject(SQLCA)15.缓冲区和可编辑控件函数1)缓冲区一.Primary Buffer(主缓冲区)保存显示在数据窗口控件中的所有数据行以及数据行和各个列的状态信息.当调用数据检索函数Retrieve()检索数据时,检索到的数据保存在Primary Buffer中.当插入数据时,插入的数据也保存在其中.二.Delete Buffer(删除缓冲区)保存被删除的数据行.当调用DeleteRow()函数删除数据行时,被删除的数据行Primary Buffer 保存到Delete Buffer.三.Filter Buffer(过滤缓冲区)Filter Buffer用于保存被过滤的数据行.执行数据过滤命令后,被过滤掉的数据行保存到Filter Buffer中.四.Original Buffer(原始缓冲区)保存数据窗口从数据库中检查的原始数据.在应用程序中可以调用数据窗口控件函数访问指定的缓冲区.调用如下语句可以引用Delete Buffer:String del_sexdel_sex=dw_1.GetItem(8,"sex",Delete!)执行上述语句后,从Delete Buffer中提取第8行数据的Sex列的内容,将其赋值给定符串变量del_sex.16.数据窗品控件可编辑控件的一些函数:1)GetText()获取可编辑控件中的数据.2)AcceptText()在数据窗口控件的LoseFocus事件中使用,其功能是检验可编辑控件中的文本数据后存入当前缓冲区.3)SetText()设置当前可编辑控件中的文本.17.数据窗口控件的一些函数1)Retrieve()函数从数据库中检索数据并将其保存到数据窗口控件中显示,其调用格式如下:dw_1.Retrieve({,参数1,参数2...})Retrieve()函数常用于在连接数据库之后检索数据库中的数据,并将其显示在数据窗口中.例:... ...If SQLCA.SQLCode<0 thenMessageBox("失败","无法连接数据库")HaltEnd ifInteger retri_1retri_1=dw_1.SetTransObject(SQLCA)dw_1.Retrieve()如果调用Retrieve()函数成功,则返回检索显示的记录行数,即主缓冲区中的数据行数;否则返回值为-1.2)Update()函数将数据窗口控件中数据的变化保存到数据库中,调用格式如下:dw_1.Update({accept{,resetflag}})其中参数accept是一个布尔值型的值.当取值为True时,表示在执行数据库更新之前调用函数AcceptT ext().参数resetflag也是布尔型的值.确定更新数据库操作后是否自动重置编辑状态标记.如果该函数调用成功,则返回值为1;否则返回值为-1.例:integer upda_1upda_1=dw_1.Update()If upda_1=1 thenCOMMIT;ELSEMessageBox("出现错误","无法保存数据库")ROLLBACK;End if在上例中,首先调用Update()函数,然后检查其返回值.若返回值为1,则表示该函数调用成功,进一步调用COMMIT命令执行数据库的更新操作;否则执行ROLLBACK命令,取消Update()函数的结果,并显示错误信息,通知用户.由于COMMIT和ROLLBACK命令都是SQL命令,所以在执行后还可以通过检查SQLCode的值判断是否执行成功.3)InsertRow()函数在数据窗口的主缓冲区中插入一行空记录,格式如下:dw_1.InsertRow(row)其中参数row表示插入行前面一行的行号.当row的值为0时,则在数据窗口的最后一行插入一行空记录.例:dw_1.InsertRow(5)表示在数据窗口的第6行插入一空行记录.4)DeleteRow()函数在数据窗口的主缓冲区中删除一行记录,并将该行记录移到删除缓冲区中.调用Update()函数之后,被删除的行才从数据库中实际删除.格式如下:dw_1.DeleteRow(row)参数row表示删除行的行号,为0时,表示要删除当前行.例:dw_1.DeleteRow(3)表示在数据窗口中删除第3行.5)ScrolltoRow()函数将当前行改变到参数row指定的行号.格式:dw_1.ScrolltoRow(row)例:dw_1.ScrolltoRow(7)将数据窗口的当前行改变到第7行.6)GetRow()函数返回当前行号,格式:dw_1.GetRow()7)GetColumn()函数返回当前列号,格式:dw_1.GetColumn()8)GetItem()函数从指定的行,列中提取数据.对于行,列不同数据类型,都有一个相应类型的GetItem()函数完成相应的功能,如GetItemDate(),GetItemnumber(),GetItemString()等.以GetItemDate()函数为例,其格式:dw_1.GetItemDate(row,column)其中参数row,column分别为行,列号,也可以为行,列名的字符串.如:String txlu_nameNumber txlu_numbertxlu_name=GetItemString(8,"Name")txlu_number=GetItemNumber(4,"Number")9)SetItem()函数为数据窗口中指定的行,列的字段赋值,格式:dw_1.SetItem(row,column,value)其中参数row,column分别为行,列号,也可以为行,列的字符串.10)SetSort()函数与Sort()函数排序当前数据窗口中的数据,前者用于指定排序的列及排序标准,而后者执行排序操作.SetSort()函数的格式:dw_1.SetSort(format)其中参数format是用于表示排序标准的字符串,它可以引用列名和排序标准.列名必须放在单引号内,而排序标准用字母A和D表示,其中A表示升序,D表示降序.例:dw_1.SetSort("'txlu_id'A")dw_1.Sort()11)SetFilter()函数与Filter()函数过滤数据窗口的数据,前一个函数用于指定过滤标准,而后一个函数执行过滤操作.SetFilter()函数的格式:dw_1.SetFilter(format)其中参数format用于指定过滤条件表达式,例:dw_1.SetFilter("emp_number>45 or emp_sex='F'")dw_1.Filter()上述代码过滤出编号大于45,以及性别为女的人员.。
2024年PB培训教程(提高篇)-(多场景)
PB培训教程(提高篇)-(多场景)PB培训教程(提高篇)一、引言随着我国经济的快速发展,企业对人才的需求日益增长,专业技能培训成为了提升员工素质的重要途径。
PB(PowerBuilder)作为一款优秀的客户端/服务器应用程序开发工具,具有强大的数据处理能力和灵活的界面设计功能,广泛应用于企业级应用开发。
为了帮助广大PB爱好者提高开发技能,本教程将从实战角度出发,详细讲解PB的高级应用技巧。
二、PB开发环境介绍1.PB简介PowerBuilder(简称PB)是美国Sybase公司推出的一款客户端/服务器应用程序开发工具。
它采用面向对象的编程思想,支持多种数据库,具有强大的数据处理能力和灵活的界面设计功能。
PB在我国的企业级应用开发领域具有广泛的应用。
2.PB开发环境搭建(1)安装PB开发工具:并安装PB开发工具,根据提示完成安装过程。
(2)配置数据库连接:安装并配置数据库软件(如Oracle、SQLServer等),建立数据库连接。
(3)创建PB项目:在PB开发环境中创建新项目,配置项目属性,为后续开发做好准备。
三、PB高级应用技巧1.数据窗口应用(1)数据窗口简介:数据窗口是PB中用于数据显示和编辑的重要组件,具有强大的数据处理能力。
(2)数据窗口设计:掌握数据窗口的设计方法,包括数据源设置、列属性设置、样式设置等。
(3)数据窗口事件处理:了解数据窗口的事件处理机制,掌握常见事件(如Click、DoubleClick等)的编写方法。
(4)数据窗口与数据库交互:学习如何使用数据窗口进行数据的增、删、改、查操作。
2.PB与Web技术结合(1)Web开发简介:了解Web开发的基本概念,掌握、CSS、JavaScript等基本技术。
(2)PBWeb应用程序:学习如何使用PBWeb应用程序,包括Web数据窗口的使用、Web事件处理等。
(3)PB与WebService交互:掌握PB调用WebService的方法,实现PB与WebService的数据交互。
PowerBuilder中的Data Store的应用n
PowerBuilder中Data Store 的应用一、引言面向对象的开发工具PowerBulider是目前最有代表性的数据库前端开发工具之一,它占有全球客户/服务器前端开发市场的40%份额。
它通过图形化接口的处理和优异的面向对象特性,大幅度的缩短了程序开发的时间和提高了效率。
数据窗口(Datawindow)是PowerBuilder提供的独一无二的对象,它是用户(User)和数据库服务器(DataBase Server)之间的一个操作接口,通过这个接口,用户可以进行数据维护、报表处理和统计图形的处理。
而Data Store(数据存储)对象是PowerBuilder 5.0 中新加入的一个不可视的数据窗口控件。
二、Data Store的概念Data Store 是一种不可视的对象,它和数据窗口的功能和支持的函数基本相同,但比数据窗口控件少了显示部分必须占用的资源,因此Data Store 不支持需要看得到才能处理的函数,如GetClickedRow() 。
三、Data Store 的功能Data Store(数据存储)对象主要用于不需要数据窗口控件可视特征(即不需要在屏幕上显示数据处理的过程和结果)的情况下,它可以完成以下功能:1.进行后台数据处理在PowerBuilder 5.0 以前是用把数据窗口隐藏起来的方法来进行后台数据库处理的,这样尽管隐藏了数据窗口,但仍需要显示开销,而使用Data Store 则不需要额外的显示开销,这样就提高了运行效率和速度。
2.为应用程序提供共享数据Data Store 缓冲区可以为应用程序中的一个或多个数据窗口提供共享数据,也可以通过写Script 语句来直接读取Data Store 中的数据。
3.在应用服务器上进行数据处理在PowerBuilder 5.0中开始提供多层次(N-tiers)的客户/服务器结构,即在客户端(Client)和数据库服务器(DataBase Server)中间增加了一个应用程序服务器(Application Server),客户端先连接到应用程序服务器,应用程序服务器进行逻辑运算处理,并将处理结果存回到数据库服务器中。
PowerBuilder数据窗口编程技巧
PowerBuilder 数据窗口编程技巧 取得巨大成就的原因就是有功能强大和灵活多变的对象,本人用开发 过一段时间后,总结出一些技巧,以供广大的开发者借鉴使用。
1、如何创建一个具有逐渐递增求和功能的报表,如下形式 5,0005,0002,5007,5003,00010,50012,00022,500 对于列, 我们可使用计算列, 即可达到逐渐递增求和的功能。
2、数据窗口的数据送缓冲区之前确认的四个步骤如果我们不清楚数 据窗口中的数据在送入缓冲区之前所发生的一切,在保存数据时就不明白 错误发生的原因,找不出错误的根源。
首先判断数据类型是否正确。
如不正确则触发事件。
接着判断数据是否符合有效性规则。
如不符合有效性规则,同样触发事件。
然后判断是否有数据被改动。
最后判断数据是否通过事件,如果数据和相斥,将触发事件。
3、如何在中用数据类型为的列为条件进行查寻 1 当要查找的日期条件是一常数时使用如下表达式_="_=111999"2 当要 查找的日期条件是一个变量时使用如下的表达式_="_="+_+""3 当要查找的 日期条件是一个数据类型时使用如下表达式_="_="+_+""4、设置数据窗口型属性的三种方法提供了三种方法设置数据窗口的布尔型属性,分别 是,10,。
例如_1=0_1=_1=在处理时以字符串的形式保存属性,而不考虑属性值 是布尔型、长整型或是字符型。
为了进一步理解,可以导出一个数据窗口并查看它的原码,可以发现 即使是列的颜色属性它也是使用带双引号的数字来表达。
5、如何在数据窗口中快速删除多行在开发过程中可能经常有要进行 多行删除的操作,一般都使用循环语句进行操作_=1_1_1_这里提供一个快 速的删除方法把要删除的行从主缓冲区中移到删除缓冲区中。
例如, 删除缓冲区中所有的行_1_1,1,_1,!,_1,1,!但需注意的是不要忘了 过滤的行在不同的缓冲区中。
PowerBuilder第9讲 数据窗口应用
数据窗口dw_1
数据窗口dw_2
dw_1数据缓冲区
dw_2数据缓冲区
如何解决这一问题?引出下面内容。 三、共享数据窗口 1、什么是共享数据窗口 如果两个或多个数据窗口共享相同的数据 缓冲区,则称这些数据窗口为共享数据窗 口。 图示如下dw_2
共享数据缓冲区
说明:1、主从数据窗口可以针对一个数 据库表数据,也可以针对多个数据库表; 举例:售货单查询。 售货记录是由一对多的二个表组成,售货 记录主表中的一行数据记录一次销售活动, 而售货记录从表则记录一次销售活动中所 销售的每一种商品。如果我们要查询每次 销售活动的情况,则可以利用主从关系数 据窗口实现相应功能。
数据存储通常使用在下述四个方面:
.进行后台数据库数据处理。 .为多个窗口上共享数据的数据窗口控件服 务。 .避免使用嵌入式SQL语句操纵数据库中数 据。 .在分布式应用的服务器中为客户端准备数 据。
一、数据存储对象的属性
数据存储对象的属性很简单,只有三个(它们也 正是数据窗口控件存储数据所需的属性): 1.DataObject----类型为String,保存与数据存 储对象相关联的数据窗口对象的名称(例如数据 窗口对象d_dept)。 2.Object----类型为dwObject,保存数据窗口 对象、数据窗口对象内对象以及这些对象的所有 属性。数据存储的Object属性用于在代码中直接 访问上述对象的各种属性以及保存在数据存储中 的数据。 3.ClassDefinition----类型为PowerObject, 保存数据存储的类定义信息。
在窗口中用表格风格的数据窗口实现数据库表中 数据的检索、修改等操作; 在窗口中用自由风格的数据窗口实现数据库表中 数据的检索、修改等操作。
PowerBuilder数据窗口错误处理
1 引 言
Pw rule 提供 给 开 发 人 员 快 速 建 立 应 用 程 o eB i r d
和嵌入式 S L Q 语句操作数据库发生错误两种。
2 1 数 据 窗 口操作 数据 库发 生错 误 . 2 1 1 数 据读 取 . .
序的强有力 工具 是数 据 窗 口, 时它也 是 Pw r 同 oe - B ie 与其它数据 库系统客户端开 发工具 的最 主 u dr l 要区别。它独特 的用户/ 数据库 接 口为程序员最大 限度地节省了时间和精力 , 与此同时程序员又 能够 以独具特色的方式灵活运用数据窗 口。
C HEN Mig , n YANG Jn—sn i og (. r g eat etfTnj U i r t,h nh i 0 9 , hn ; 1 Bi eD p r n o ogi n e i S a ga 0 2 C ia d m v sy 2 2 C n nee uai o eeo o iU i rt,h n h i 0 0 2 C /a . ot u dc tnC lg i o l fr , i n e i S ag a 09 , hn )  ̄ v sy 2
i tl r u / 存储 n i e m / t
_ _
由于 Pw rudr oeB i e 是英 文板 , l 在数据 窗 口运行 出错时如果发生错误 , 将输 出英文信息 , 这样最终用
户使用时很困难 , 如何捕获这些信息 , 把它修改为中 文形式 , 对于国内程序员来说至观重要 。更 常见 的 是数据窗 口的许多错误在编译过 程中察觉不到 , 只 有在 运行 过 程 中才 能 显 示 , 错 误 的状 况 发 生 时 , 当 Pw rudr o e ie 会去驱 动数据 窗 口控 件 中的 e o e Bl rr — r vn,Tr vn 中有 一些 参数 , et i et eo e 分别 记录各种不 同
PowerBuilder数据缓冲技术及应用
PowerBuilder数据缓冲技术及应用
金义富
【期刊名称】《信息技术》
【年(卷),期】2001(000)012
【摘要】首先介绍了PowerBuilder的数据缓冲技术,然后结合实例讨论了如何在客户端利用数据窗口缓冲区、行列修改状态以及嵌入式SQL语句实现两个并列表的同步更新.
【总页数】3页(P1-2,4)
【作者】金义富
【作者单位】湛江师范学院,
【正文语种】中文
【中图分类】TP274
【相关文献】
1.PowerBuilder的数据缓冲技术及共享数据窗口的应用 [J], 杨忠晔;程鹏
2.PowerBuilder应用技巧讲座(五)--powerBuilder中调用公用控件动态链接库实现IP地址控件 [J], 张志远
3.复杂负载下数据缓冲区自适应调度方法仿真 [J], 任宏德; 薛小燕
4.异构网络容错数据缓冲区的替换概率模型研究 [J], 张程;陈清
5.瑞萨电子推出面向高性能服务器和云服务应用的DDR5数据缓冲器 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
利用函数RowsCopy、RowsMove可以在不同DataWindow控件(或DataStore对象)之间或同一DataWindow控件(或DataStore对象)的不同缓冲区之间复制、移动数据行。
语法:
dwcontrol.RowsCopy(startrow,endrow,copybuffer,targetdw,beforerow,targetbuffer)
1 数据窗口缓冲区
在应用中,每个数据窗口控件都要检索4个内存缓冲区,它们是:
·主缓冲区(PrimaryBuffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。
·过滤缓冲区(FilterBuffer):存放从主缓冲区中过滤掉的数据。
·删除缓冲区(DeleteBuffer):存放从主缓冲区中删除掉的数据。
intli_new_row
li_new_row=dw_l.InsertRow(0)
//通过SetItem函数为列赋值
dw_l.SetItem(……)
//将新行的修改状态置为NotModified!
dw_l.SetItemStatus(li_new_row,0,primary!,NotModified!)
数据窗口中行或列的修改状态决定Update()函数将为该行或该列产生何种类型的SQL语句。对主缓冲区和过滤缓冲区中的行,Update为状态是NewModified!的行产生Insert语句,为状态是DateModified!的行产生Update语句,只有状态是DataModified!的列才会包含在Update语句中。对删除缓冲区中的行,若其状态是New!或NewModified!,则Update语句不会为其产生Update语句。
dw_l.ResetUpdate()//清除更新标志
dw_2.ResetUpdate()//清除更新标志
COMMIT;
Else
ROLLBACK;
Endif
Endif
(4)将数据行从删除缓冲区
dwcontrol.RowsMove(startrow,endrow,movebuffer,targetdw,beforerow,targetbuffer)
当某行在删除缓冲区中时,或者在主缓冲区或过滤缓冲区中,并且状态为NewModified!或DataModified!时,其更新标志被设置。函数ResetUpdate清除DataWindow或DataStore中主缓冲区和过滤缓冲区中的更新标志并清空其删除缓冲区。清除更新标志后,所有行的状态为NotModified!或New!。
New! —— Yes Yes No
NewModified! No —— Yes New!
DataModified! NewModified! Yes —— Yes
NotModified! Yes Yes Yes ——
通过观察表1,我们可以发现这样一种情况:假设某个记录的状态为New!,那么不能直接改为NotModified!但可先将它改为DataModified!,然后再改为NotModified!。
·New!:指定行是新行,但此行的列并未赋值。本状态只适用于行,不适用于单个列。
·NewModified!:指定行是新行且行中的列已经赋值。新行的状态成为NewModified!,既可能是用户输入或使用SetItem函数造成的,也可能是由于它的某列具有缺省值。本状态只适用于行,不适用于单个列。
移到主缓冲区,实现取消删除的功能。
dw_l.RowsMove(l,dw_l.DeletedCount(),Delete!,dw_l,l,Primary!)
&Primary!,True)
dw_l.SetText(ls_ori_val)
(3)在协调两个DataWindow对象dw_l、dw_2的更新时,若其中一个更新失败,应阻止重设更新标志,以便回滚事务,一旦所有数据窗口都已成功更新,就可使用COMMIT结束该事务,并使用ReSetUpdate重新设置数据窗口的状态标志。
摘 要:文章描述了PowerBuilder中数据窗口缓冲区,详细介绍了数据窗口中行与列的修改状态以及PowerBuilder提供的相关函数,并给出了几则应用实例。
PowerBuilder是当今最先进的数据库开发工具之一,它以开放性、可移植性以及易用性而闻名于世。PowerBuilder的突出特点是给应用开发人员提供了非常方便的开发环境和工具,而数据窗口技术则是其中最耀眼的闪光点。利用数据窗口,开发人员可以完成绝大多数数据操作任务。本文从数据窗口中数据的修改状态的角度出发,介绍利用数据窗口进行应用开发的一些技巧。
·原始缓冲区(OriginalBuffer):存放从数据库里检索到的原始数据,它由PowerBuild在内部维护,可以利用该缓冲区中的数据进行数据恢复,在应用程序中实现Undo功能。
2 行与列的修改状态 来自行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,它们包含: ·NotModified!:指定行或列处的信息与最初检索出的相同。 ·DataModified!:指定列或行中某列处的信息在检索出后发生了改变。
(2)在应用程序中提供Undo功能,将实现很好的用户友好效果。本例中将数据窗口dw_l中的当前行、当前列的显示值置为从数据库中检索出的原始值:
string ls_ori_val
ls_ori_val=dw_l.GetItemString(dw_l.GetRow(),dw_l.GetColumn(),
利用函数GetItemStatus可获得某行或某列的修改状态,利用函数SetItemStatus可改变某行或某列的修改状态。
语法:
dwcontrol.GetItemStatus(row,column,dwbuffer)
dwcontrol.SetItemStatus(row,column,dwbuffer,status)
对于如何改变状态,PowerBuilder有一些限制,表1给出了这种限制,其中Yes表示可把初始状态改变为指定状态,No则表示不可以。
表1数据修改状态设置约束
初始状态 指定状态
New! NewModified! Da
taModified! NotModified!
语法:dwcontrol.ResetUpdate()
3 应用举例
(1)在数据窗口中,某些列常具有缺省值,或我们在执行了InsertRow操作后立即使用SetItem函数为某些列赋值。如果用户执行了一个插入操作后立即关闭窗口会触发closequery事件,这时会提示用户记录已经被修改,但用户并没有感觉到对数据的修改。为避免出现这种情况,可作如下处理: