PB数据窗口的多表更新
PB8简明开发指南
(一)PB8中的关键概念
1.对象(Object)、属性(Property)、事件(Event)
在所有面向对象的编程工具中,对象都是一个最基本的概念。 PB8中提供了诸如窗口、命令按钮、数据窗口等图形对象 以及数据仓库、错误等非可视对象。对象通过属性对其特征进行描述和区分。例如,一个窗口对象,其属性包括窗口 名、菜单名、是否可见、背景色、宽度、高度、在屏幕中所处的位置等。而用户对对象的操作则是通过对对象进行诸如 点击、双击、拖动等动作来实现的,在动作发生时,“事件”即被触发。
2.窗口(Window)和控件(Control)
窗口是应用中所有可视对象的载体,也是应用与用户直接交互的直观途径。PB8中提供了丰富的控件,你可以在窗口画板 工具栏的控件箱中找到它们。总的来说有五种类型的控件:
(1)激活动作控件:包括Commandbutton(命令按钮)、PictureButton(图像按钮)和PictureHyperLink(图像超链 接)、StaticHyperLink(静态超链接)控件。
/xxgcx/zsyd/ç¨ åº è®¾è®¡è¯è¨ /PowerBuilder%20... 2002-12-7
PowerBuilder 8.0开发指南
页码,5/11
CONNECT:连接一个数据库事务对象。
DISCONNECT:断开已连接的一个数据库事务对象。
3.封装性
封装的目的是为了实现数据隐藏和数据保护。封装为对象提供了对外操作的接口,使其他对象通过函数来访问,而不允 许直接操纵对象的属性。在PB8中有三种访问类型Public、Protect、Private,这三种访问控制类型可以用在对象的变量 和函数上,缺省的实例变量和对象函数都是Public类型的。为保护数据,应尽可能使用Private和Protect类型,前者只 允许对象内部的元素来访问,后者可以接受对象内部和继承类的元素访问。
在PB 7.0中实现多数据窗口的连续打印
PowerBuilder最吸引人的地方就是她那强大的数据窗口技术,它为展现数据的本质提供了丰富的手段,数据窗口能够从多种数据源提取数据,然后以多种风格展现在用户面前,对于一个PB程序员能否用好用活数据窗口是那么的重要,同时也反映出编程人员的一定技术水平。
相信在看了本文之后一定会对你编写程序有所帮助,文中如有任何不妥之处还请同仁们多多指教。
在实际的应用中我们或许会碰到用户有这样的要求,在第一张报表上打印一个客户的购买商品的统计数据,以后的每页显示的是他购买商品的明晰清单。
也就是相当于打印两份报表,一份是统计报表,另一份是明细表。
单纯就这两份报表而言对于任何一个PB程序员来说都不是什么难事,很容易就可以搞定,我们完全可以分两张报表打印给用户,但这还总是让我们觉得似乎缺了点什么,毕竟用户是想让这两份报表作为一个整体出现,最起码的要求是它们的页号应该连续,并且同时也能告之用户总共有多少页。
这就涉及到多个数据窗口连续打印的问题。
首先,统计和明细的结果是根据用户输入的条件来得到的,这是个不定的结果,我们无法预先得知会有多少条数据,更别说需要多少页了。
即便是我们能够确定有多少条数据也会因为用户打印机的纸张设置不同而会出现不同的显示结果。
其次,要在统计表和明细表里显示两张报表的总页数,这个有点难度,毕竟对于两张报表来说都是个未知数,即对于统计表来说,它可以知道自己的总页数,但不知道明细表的总页数。
同样对于明细表也是这样,只知道自己的总页数,而不知道统计表的总页数。
这样很难在两张报表里分别显示它们的页数之和。
虽然如此可对于它们自己而言当前是第几页还是能够确定的,这个只要调用数据窗口的内嵌函数 Page()就可以很容易的得到。
下边我们就通过一个简单的例子来探讨如何实现多个数据窗口连续打印技术。
程序首先让用户输入客户号,然后系统根据用户输入的客户号统计出该客户各类商品的购买总数以及订购的每一种商品明细。
整个程序的执行如下三副图所示:在开始之前先让我们看一下例子中用到的三张表的结构以及它们之间的相互关系,见下图:其中,表Customer和表Sales_Order通过cust_id(客户编号)相关联,表Sales_Order和表Sales_Order_Items通过id(销售定单号)相关联。
PB改变数据窗口更新特性的方法
改变数据窗口更新特性的方法打开一数据窗口,从Rows菜单中选择的"Update Properties…"系统显示"Specify Update Prorerties"对话框:A、如果不允许数据窗口更新数据库,那么就不要选中复选框"Allow Updates",单击"OK"按钮关闭对话框。
如果要禁止用户修改数据窗口的某列,那么在数据窗口画笔中将此列的TabOrder值设为0。
B、如果允许数据窗口更新数据库,选中复选框"Allow Updates"。
C、在"Table To Update"下拉列表框中选择要更新的表D、在"Where Clause For Update/Delete"中选则更新方式。
E、在"Updatesble Cloumns"通过单击选择可更新的列,被选中的列将加亮显示。
F、选择了要更新的列后,在"Unique Key Column(s)"列表框中定义唯一键,这个唯一键必须能够在表中唯一的标识一条记录。
G、在"Key Modification"组框中选择当唯一键列更新时数据行的更新方式。
H、如果当前表中包括了自动增长序号的列(称做标识列,并非所有的数据库都具备此特性),那么在"Indentity Column"下拉列表框中指定该列。
I、单击"OK"关闭对话框。
注意事项:如果在"Indentity Column"下拉列表框中指定某列为标识列,那么就不要把该列选择为可更新列。
否则,如果把该列选择为可更新列,那么数据窗口产生的任何更新数据库的Update语句都将失败。
关于"Specify Update Prorerties"对话框中的"Key Modification"组框的详细意义。
如何在PB数据窗口中修改数据---设置数据窗口的更新属性
如何在PB数据窗口中修改数据---设置数据窗口的更新属性数据窗口对象非常强大的原因之一就是能够很容易地修改数据库。
当用户修改了数据窗口中的数据,插入了新的数据行或者删除了数据行以后,只要调用update()函数就可以将修改了的数据保存到数据库中。
但是,这需要一个前提,就是必须设置数据窗口的修改属性。
数据窗口要修改数据表,首先清楚数据窗口只能修改一个数据表。
当数据窗口的数据来源于不止一个数据表时,可以用脚本控制数据窗口的修改属性来对数据表逐个进行修改,这种技术在后面有关章节介绍。
下面介绍一次修改一个数据表的设定方法。
当数据窗口是用来接受用户的手工录入数据时,应该设置两方面的属性才能确保数据窗口能够用来修改数据表。
一个是修改数据窗口的修改属性,另一个是用户可以修改的字段的相关属性值。
首先介绍数据窗口的修改属性的设置。
在数据窗口画板中,使用菜单项Rows->Update Properties,弹出如图所示的窗口。
数据窗口的所有修改属性都集中在该窗口中。
如果数据窗口对应的数据表中定义了主键或者惟一性索引,则数据窗口创建时缺省的就是允许修改,并且正确设置了所有的修改属性。
否则就需要手工进行设置。
前面介绍过,当增加、删除或者重新选择了字段时,PowerBuilder将数据窗口的修改属性置为不允许,这时也应该进行手工设置。
首先应该选中Allow Updates选项,只有选中该选项,才允许继续进行其他属性的设定。
在Allow Updates右面的下拉列表框叫做Table to Update,只能在该下拉列表框中选择一个,并且必须选择一个数据表名,选中的表就是要被更新的表。
选中了Allow Updates属性后,接下来就要指定在数据窗口中哪些列被更新。
在Updateable Columns列表框中用鼠标单击被更新的字段。
当数据窗口中的字段来自不止一个数据表时,这时一定要选择同一个表中的字段,因为一个数据窗口一次只能更新一个数据表。
oracle 多表更新方法
oracle 多表更新方法
Oracle中多表更新方法有以下几种:
1. 使用内连接(Inner Join)更新多个表:使用UPDATE语句结合INNER JOIN将多个表连接起来,并更新相应的记录。
例如:
```sql
UPDATE table1
SET table1.column = table2.column
FROM table1
INNER JOIN table2 ON table1.id = table2.id;
```
2. 使用子查询(Subquery)更新多个表:可以使用子查询来更新多个表中的记录。
例如:
```sql
UPDATE table1
SET column = (SELECT column FROM table2 WHERE table2.id = table1.id)
WHERE EXISTS (SELECT 1 FROM table2 WHERE table2.id = table1.id);
```
3. 使用MERGE语句更新多个表:MERGE语句可以根据指定的条件将源表的数据合并到目标表中,并同时更新目标表的记录。
例如:
```sql
MERGE INTO table1
USING table2
ON (table1.id = table2.id)
WHEN MATCHED THEN
UPDATE SET table1.column = table2.column;
```
以上是Oracle中常用的多表更新方法,根据具体的需求选择合适的方法来更新多个表中的记录。
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最初从数据库中查到的原始值。
PB中实现数据窗口动态排序的三种方法
PB中实现数据窗口动态排序的三种方法在PowerBuilder中使用数据窗口检索到的数据往往是无序的,虽然可以通过设置Select语句实现排序的功能,但是数据窗口一旦生成都无法进行动态调整。
笔者总结了在已经生成的数据窗口中实现动态排序的三种方法,现介绍给大家。
一、准备工作设计如图1所示的示例窗口。
为了更好地比较三种不同的方法,dw—1中的数据来自两个表student和class。
student表中包含四个字段sid(学号)、sname(姓名)、saddr(住址)和cid(班号),class表中包含两个字段cid(班号)和cname(班级名称)。
图1二、三种方法的源程序三种方法中的“执行”按钮的代码分别为:方法1:用SetSQLselect()string ls—oldsql,ls—newsql,ls—order ls—columnls—oldsql=dw—1.getsqlselect()choose case ddlb—1.textcase ″学号″ls—column=″sid″case ″姓名″ls—column=″sname″case ″住址″ls—column=″saddr″case ″班号″ls—column=″class.cid″case ″班级名称″ls—column=″cname″end chooseif rb—1.checked then ls—order=″ASC″else ls—order=″DESC″end ifls—newsql=ls—oldsql+″ORDER BY ″+&ls—column+″″+ls—orderif dw—1.setsqlselect(ls—newsql)=-1 thenmessagebox(″警告″,″数据设置失败″,stopsign!)else dw—1.settransobject(sqlca)dw—1.reset()dw—1.retrieve()dw—1.setsqlselect(ls—oldsql)end if方法2:用describe()和modify()string ls—mod, ls—order,ls—old,ls—columnls—old=dw—1.describe(′datawindow.table.select′)dw—1.settransobject(sqlca)choose case ddlb—1.textcase ″学号″ls—column=″sid″case ″姓名″ls—column=″sname″case ″住址″ls—column=″saddr″case ″班号″ls—column=″class.cid″case ″班级名称″ls—column=″cname″end chooseif rb—1.checked then ls—order=″ASC″else ls—order=″DESC″end ifls—mod=″datawindow.table.select=′″+ls—old+&′ORDER BY ″′+ls—column+′″′+ls—order+″′″dw—1.modify(ls—mod)dw—1.retrieve()dw—1.modify(″datawindow.table.select= &′″+ls—old+″′″)方法3:用setsort()和sort()string ls—sort,ls—order,ls—columnchoose case ddlb—1.textcase ″学号″ls—column=″#1″case ″姓名″ls—column=″#2″case ″住址″ls—column=″#3″case ″班号″ls—column=″#4″case ″班级名称″ls—column=″#5″end chooseif rb—1.checked then ls—order=″A″else ls—order=″D″end ifls—sort=ls—column+′′+ls—orderdw—1.setsort(ls—sort)dw—1.sort()三、三种方法的比较1.第一种和第二种方法要求数据窗口在生成时是无序的,第三种方法无此要求。
PowerBI中的数据刷新和更新技巧
PowerBI中的数据刷新和更新技巧在PowerBI中,数据刷新和更新是非常重要的功能,它能确保我们随时获取最新的数据,并保持报表分析的准确性。
本文将介绍一些PowerBI中的数据刷新和更新技巧,帮助您更好地管理和优化数据的刷新过程。
一、了解数据刷新的概念数据刷新是指从数据源获取最新数据的过程,可以通过手动刷新或自动定期刷新来实现。
在PowerBI中,我们可以通过各种方式来刷新数据,包括刷新按钮、定时刷新、数据网关等。
掌握这些刷新方法将有助于我们更灵活地管理数据更新。
二、手动刷新数据在PowerBI报表中,您可以通过点击"刷新"按钮来手动刷新数据。
当您需要及时获取最新的数据时,手动刷新是一个非常方便和快捷的方法。
此外,您还可以使用快捷键,比如按下F5来手动刷新数据。
三、定时刷新数据除了手动刷新,PowerBI还提供了定时刷新数据的功能。
您可以在设置中指定刷新的频率和时间,比如每天、每周或每月定期刷新数据。
这样,您不需要手动操作,系统将自动按照您设定的频率刷新数据,使您的报表始终保持最新的状态。
四、使用数据网关如果您的数据源位于本地服务器或私有网络,您可以使用PowerBI的数据网关来实现数据的刷新和更新。
数据网关可以将本地数据与PowerBI云平台连接起来,实现数据的实时刷新和共享。
通过数据网关,您可以方便地管理和监控本地数据的刷新过程,确保数据的准确性和可靠性。
五、使用增量刷新在处理大数据集时,全量刷新可能会造成资源浪费和性能下降。
为了优化数据刷新过程,PowerBI引入了增量刷新的功能。
增量刷新会仅刷新数据源中发生变化的数据,大大提高了数据刷新的效率。
您可以通过配置增量刷新策略,指定更新的字段和范围,使刷新过程更加精确和高效。
六、优化数据模型在设计和构建数据模型时,合理优化模型的结构和关系也可以提高数据刷新的效率。
您可以通过减少冗余字段、合并重复表和优化查询等方法来简化模型结构,减少数据量和计算的复杂度,从而加快数据刷新和更新的速度。
如何在PB数据窗口中修改数据设置数据窗口的更新属性
数据窗口对象非常强大地原因之一就是能够很容易地修改数据库.当用户修改了数据窗口中地数据,插入了新地数据行或者删除了数据行以后,只要调用()函数就可以将修改了地数据保存到数据库中.但是,这需要一个前提,就是必须设置数据窗口地修改属性.数据窗口要修改数据表,首先清楚数据窗口只能修改一个数据表.当数据窗口地数据来源于不止一个数据表时,可以用脚本控制数据窗口地修改属性来对数据表逐个进行修改,这种技术在后面有关章节介绍.下面介绍一次修改一个数据表地设定方法.当数据窗口是用来接受用户地手工录入数据时,应该设置两方面地属性才能确保数据窗口能够用来修改数据表.一个是修改数据窗口地修改属性,另一个是用户可以修改地字段地相关属性值.首先介绍数据窗口地修改属性地设置.在数据窗口画板中,使用菜单项> ,弹出如图所示地窗口.数据窗口地所有修改属性都集中在该窗口中.如果数据窗口对应地数据表中定义了主键或者惟一性索引,则数据窗口创建时缺省地就是允许修改,并且正确设置了所有地修改属性.否则就需要手工进行设置.前面介绍过,当增加、删除或者重新选择了字段时,将数据窗口地修改属性置为不允许,这时也应该进行手工设置.首先应该选中选项,只有选中该选项,才允许继续进行其他属性地设定.在右面地下拉列表框叫做,只能在该下拉列表框中选择一个,并且必须选择一个数据表名,选中地表就是要被更新地表.选中了属性后,接下来就要指定在数据窗口中哪些列被更新.在列表框中用鼠标单击被更新地字段.当数据窗口中地字段来自不止一个数据表时,这时一定要选择同一个表中地字段,因为一个数据窗口一次只能更新一个数据表.当数据窗口中增添了字段时,新增添地字段往往是不允许修改地,一定要在该列表框中选择该字段.选择了可以修改地字段后,就应该在()列表框中选择惟一标识一行地列.如果在定义数据表时定义了主键,单击右面地按钮可以在该列表框中选中主键.组框中包含了三个选项,用来配置如何在和语句中构造字句地.这三个选项为数据库加锁提供了三种不同地选择.当某行被选中时,用户可以通过对象来提供完整性保护,可以防止其他用户检索该行.这三个选项是:、和.下面分别详细介绍..当开发单用户应用程序或者用户都以加锁方式访问数据库时可以选中该选项.该选项表示数据窗口只使用在()列表框中指定地惟一列进行数据更新.使用这种方式来修改数据库,并发性很高,不同地用户都可以并发地访问数据库,但是数据地完整性却非常差.因此要保证数据完整性,只有在单用户应用程序或者加锁访问方式下才使用这种修改方式.例如,在(通讯录)数据表中定义了个字段,为主键,、、、四个字段为可修改字段,某数据窗口包含这个字段并且使用更新数据库.有如下一条数据:::朱义:胜利油田::假设甲用户修改了这条数据,将改为“郭宝利”,数据窗口产生如下地语句:"郭宝利""";其中地字句中只包含在中指定地字段,用该字段来确定要修改数据库中哪行数据.该语句将成功执行.如果乙用户要将字段修改为“冀东油田”,甲、乙用户同时并发修改为地数据,都会修改成功,但会产生如下地数据:::郭宝利:冀东油田::两个人同时修改了一条记录,本来地址是胜利油田地郭宝利却成了冀东油田地了..这种修改方式是缺省地修改方式,它用主键列和可以修改地列来创建子句,具有很高地数据完整性,但是并发性却不是太好.推荐使用这种修改方式.像上面例子一样,如果甲用户做修改操作,保存数据时将产生如下地语句:"郭宝利""""朱义""胜利油田""""";该语句中地子句包含了主键和所有地可修改字段.如果乙用户是在甲保存修改了地数据之前检索地数据,当乙用户要将修改为“冀东油田”时,产生如下地语句:"冀东油田""""朱义""胜利油田""""";此时,由于甲用户已经修改了数据,将改成了“郭宝利”,所以乙用户地子句中指定地数据在数据库中已经不存在了,乙地修改不成功,从而保证了数据地完整性..该方法是上面两种方法地折衷,当不同地用户并发修改同一行数据地不同字段时,都能成功修改,所以它地并发性有了一定地限制,数据地完整性比第一种修改方式有所提高.这种修改方式使用主键和数据发生了变化地列来产生子句.同样,在上面地例子中,甲用户要将“朱义”修改为“郭宝利”会产生如下地语句:"郭宝利""""朱义";这时地子句中只包含主键和要修改地字段.如果此时乙用户并发修改数据,要将为“”地用户地修改为“冀东油田”,乙用户也会成功修改..时间标记如果数据库管理系统支持时间标记,则可以在对象地结果集中包含时间标记来获得最大地数据完整性.将自动为更新和删除操作地子句加上时间标记,而不显示在可更新列地列表中.、完全在服务器上处理时间标记,在中不要求有额外地工作..该组框用来指定当用户修改了主键时,数据窗口如何来更新数据表中地主键字段.有两种选择,和 .第一个选项是先删除原有主键值,然后再使用新地主键值插入一个完整地行.使用这种更新主键地方式可以减少组织数据地工作量,但在数据库中各个数据表之间存在父子制约关系,并且依赖该主键地外部键被指定为级联删除时,操作就不会成功地.因为级联删除方式要求当依赖主键地外部键有数据时就不能删除主键.当允许更新主键列时,可以使用该选项,该选项直接修改主键值,所以防止了级联删除带来地操作不成功地问题..该下拉列表框用于为下拉列表框中所指定地列(通常是主键列)生成序号,当且仅当支持序号生成时该作用才有效.当正确进行了上述所有操作后,单击按钮即完成了修改属性地设置.如果数据窗口允许手工录入数据,接下来就应该设置可修改字段地相关属性了.主要包括如下属性:字段地值.字段地属性.字段地属性.字段地属性.上述属性前个中任意一个都可以让用户无法修改字段中地数据;最后一个属性决定字段是否可见,不可见地字段不管其他属性如何设置,用户都无法修改字段中地数据.首先介绍如何设置字段地值.使用菜单项> 可以在窗口显示各字段地当前值,用鼠标单击要修改值地字段,然后手工将值改为非即可.在设置时要注意三点:()用户可以手工修改地字段,其值不能为.()在数据窗口修改属性中,不允许修改地字段其值应该为,或者其属性应该选中.()取值决定字段获得焦点地顺序.在数据窗口中使用按钮在字段间切换时,取值小地首先获得焦点,最大地最后获得焦点.字段地属性设置字段是否被保护.如果该属性设置为,则不允许用户修改字段中地数据,即使设置为非零.字段地属性决定字段中地内容是否只用来显示,当属性设置为或者时,字段中地数据不允许用户修改,不管其他几个属性是如何设置地.属性只能使用表达式,选中字段后在属性视窗属性中单击右侧地红色小按钮(如果已经有表达式,则按钮为绿色),进入到表达式输入对话框,输入该属性地表达式即可.比如,设置用户不能修改字段原来地数据,可以输入如下地表达式:(())字段地属性在属性视窗中,选中该选项表示该字段中地数据只用来显示,不允许用户修改.该属性不能使用表达式.在中,编辑类型地控件都有该属性,并且属性地作用也是相同地.当字段地值为时,肯定不能获得焦点,但是非时也不一定能获得焦点,还得看字段地属性是否设置为;当字段地值不为,属性不为并且字段地属性为时,肯定可以获得焦点.属性和焦点是否能够获得无关.文档收集自网络,仅用于个人学习。
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中的XX没必要等)需求一、删除表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数据窗⼝设置操作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中数据窗口使用技巧PowerBuilder(以下简称PB)是一个非常优秀的数据库前端开发工具,其数据窗口(DataWindow)控件充分体现了PB与数据库系统的紧密结合,堪称前端工具的典范。
本文介绍了使用PB设计数据窗口的一些小窍门,希望能对使用PB的开发者有所帮助。
一、校验表达式(Validation Expression)的设置校验表达式是PB提供的一个优良特性。
但您是否觉得表达式的输入过于烦琐呢?一般而言,校验表达式的输入和修改要经历下面4步:1. 选取要编辑的列(Column);2. 按鼠标右键,选择"Properties",将弹出"Column Object"窗口;3. 在窗口中选择"V alidation"标签,输入所需的校验表达式;4. 输入完毕后,按"OK"按钮。
这种输入方式有两个缺点:1. 过于烦琐,每输入一个表达式都要经过4步。
这一点在每列的校验表达式都基本相同时尤其明显。
2. 无法统一查看和对比各列的校验表达式,不利于查错。
其实PB提供了一个更加灵活的,专门用于输入校验表达式的工具。
在编辑数据窗口时,选择"rows"菜单的"Column Specifications"项,将会弹出"Column Specifications"窗口。
在窗口中,可以直接设置每一列的校验表达式二、"选择工具"的使用在数据窗口中,有时需要修改所有列的颜色或字体,一般的操作都是一个一个选取。
其实PB提供了一个非常好的选择工具,用来选择数据窗口中的对象。
这个工具位于"Edit"菜单下的"Select"项中.选择工具一共有7个功能,其中前5个适合用热键直接操作选项功能三、多用户安全访问数据库的实现大多数情况下,您的应用程序将在网络环境下运行。
在PB中控制 数据窗口 列的修改属性
<转>在PB中控制数据窗口列的修改属性在编制管理信息应用系统中,一般都会遇到一个共同问题,那就是如何根据不同情况去控制表中的数据列,比如对于同一DATAWINDOW不同的用户有不同的操作(如对于数据录入人员可以更改数据,而对于查询人员一般不能更改数据),下面就以一个简单的工资表为例来说明利用PB如何在DATAWINDOW中控制列的修改方式。
工资表基本列如下:代码姓名工作时间基础工资浮动工资岗位工资知识分子补贴其它工资code name workdata basesa movesa stationsa bt othersachar varchar char decimal decimal decimal decimal deciaml在PB中有两种方式可控制列属性,一是静态方式,另一种是动态方式实现。
所谓静态方式就是在列的属性上通过选项实现。
所谓动态方式就是利用编程实现。
现分别给予介绍:一、静态方法(1)在datawindow中选中某列后点MOUSE右键,选“properities”后系统弹出一标签,选中“Edit”标签,将“Display Only”选项制为有较;(2)或者选中“Expression”标签,在“Protect Express”中填入“1”; (3)或者选中“Expression”标签,在“Protect Express”中填入条件表达式,如工作时间不满一年的人员不能修改,则写入“if(daysafter(date(workdate),today()) <= 365,1,0)”;(4)在datawindow中,将某列的Tab Order 值制为0,则该列因得不到焦点而不能被修改;(5)在DataWindow Painter 状态下选取Rows菜单,再选取Update Properties,弹出Specify Update Properties对话框,将Allow Updates 设为空。
在pb中控制数据窗口列的修改属性
<转>在PB中控制数据窗口列的修改属性在编制管理信息应用系统中,一般都会遇到一个共同问题,那就是如何根据不同情况去控制表中的数据列,比如对于同一DATAWINDOW不同的用户有不同的操作(如对于数据录入人员可以更改数据,而对于查询人员一般不能更改数据),下面就以一个简单的工资表为例来说明利用PB如何在DATAWINDOW中控制列的修改方式。
工资表基本列如下:代码姓名工作时间基础工资浮动工资岗位工资知识分子补贴其它工资code name workdata basesa movesa stationsa bt othersachar varchar char decimal decimal decimal decimal deciaml在PB中有两种方式可控制列属性,一是静态方式,另一种是动态方式实现。
所谓静态方式就是在列的属性上通过选项实现。
所谓动态方式就是利用编程实现。
现分别给予介绍:一、静态方法(1)在datawindow中选中某列后点MOUSE右键,选“properities”后系统弹出一标签,选中“Edit”标签,将“Display Only”选项制为有较;(2)或者选中“Expression”标签,在“Protect Express”中填入“1”; (3)或者选中“Expression”标签,在“Protect Express”中填入条件表达式,如工作时间不满一年的人员不能修改,则写入“if(daysafter(date(workdate),today()) <= 365,1,0)”;(4)在datawindow中,将某列的Tab Order 值制为0,则该列因得不到焦点而不能被修改;(5)在DataWindow Painter 状态下选取Rows菜单,再选取Update Properties,弹出Specify Update Properties对话框,将Allow Updates 设为空。
PB-数据窗口缓冲区与数据修改状态
PB-数据窗口缓冲区与数据修改状态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语句。
pb中数据窗口函数小结
pb中数据窗口函数小结一、连接数据库连接数据库也就是指定事务对象。
PowerBuilder提供了两个函数:SetTrans()和SetTransObject()。
语法格式:dw_control.SetTrans(TransactionObject) dw_control.SetTransObject(TransactionObject) 其中,dw_control是所使用的数据窗口控件,transactionObject是所要指定的事务对象。
这两个函数有一个重要的区别就是在使用SetTrans()函数时,用户不需做任何数据初始化或事务对象初始化工作。
用户只需要在这里填充一个事务对象,PB就会自动完成对该事物对象的初始化以及和数据库连接的工作。
而使用SetTransObject()函数时,用户必须首先把所用的事务对象连接到数据库上。
但是,这并不意味着SetTrans()函数比SetTransObject()函数更好,使用SetTrans()函数时,每调用一次函数必须连接一次数据库,因为这个函数在每个事务处理的末端都会执行Disconnect语句。
与此相反,使用SetTransObject()函数可以为数据库维持一个开放性的连接。
因此在一般情况下,为了提高效率,总是采用SetTransObject()函数。
这两个函数都是成功时返回1,发生错误时返回-1。
二、检索数据用于检索数据的函数只有一个,就是Retrieve()函数。
语法格式:dw_control.Retrieve() 如果数据窗口控件上的数据窗口对象是有检索参数的,就要在这个函数调用时加上检索参数。
而且检索参数必须和数据窗口对象中定义顺序一致。
此函数返回一个长整型的数据,代表检索出来的数据行数。
如果发生错误,将返回-1。
三、更新数据当用户对数据窗口对象内的数据修改后,想把这些修改反映到数据库中去时,必须使用Update()函数。
语法格式:dw_control.Update() 这个更新可能成功,也可能失败。
pb中数据窗口的应用
Pb中数据窗口的应用在通常的Server/Client方式MIS开发中,总是有没完没了的报表需要制作,调试报表花费的时间也是最多而且乏味,还常常不能满足客户的要求。
要是能够让用户自己调整报表的格式和内容,然后将它保存下来,程序下次启动时它自动调用保存了的报表格式那有多好。
本人通过如下方法最终实现了用的要求。
PB(PowerBuilder)有一种以PSR结尾的特殊的保存报表的文件格式(本文简称作PSR文件)。
根据数据窗口可以直接读取PSR文件生成报表的原理,程序通过生成PSR文件,实现动态报表格式的保存。
一、实现原理:PB中的报表其实就相当于是数据窗口。
第一步,动态报表的实现。
通过设置数据窗口对象(dataobject)中文本、列等的Resizeable 和moveable属性为1来实现对象位置的拖动控制,通过数据窗口的Modify函数实现对象值的更改(包括增加和删除)。
第二步,报表格式的保存。
在一个应用当中,数据窗口对象的名称总是唯一的,将每一个数据窗口对象转化成PSR文件存于数据库表中。
在窗口打开时,程序先校验报表格式是否存在。
如果存在,先将报表格式读取出来放在一个临时文件当中,然后设置数据窗口(datawindow)的数据对象(dataobject)为这个报表文件,然后提取数据;如果不存在,直接提取数据即可。
二、实现过程:1、建立一个数据库表用以保存报表格式文件。
表名:dyn_reportDwobjectVarchar2(20)数据窗口对象名称Primary keyRptitleVarchar2(80)报表的标题名称MemoLong raw 报表格式2、建立一个窗口w_temp。
定义实例变量如下:string is_dwtype,is_dwobject //保存报表中对象的类型及名称控件名称控件含义Dw_print数据窗口对象Cb_exit退出按钮Cb_savereport 报表格式保存按钮3、在窗口的OPEN事件中加入如下代码, 校验报表格式是否存在,如果存在读取定义好的报表格式到数据窗口。
PB8简明开发指南
对于对象的继承,PB8中所有对象都有其共同的基类PowerObject,从这一个基类下面分成继承Graph-icObject和 NonVisualObject等。
2.多态性
在PB8中有大量的多态函数,如Print()、TriggerEvent()等。在运行过程中,你只需要指出对象和函数名即可。在有些 函数中,即使不知道对象类,也可以用Class Name()函数得到对象类,或得到实例名,将对象名作为函数参数调用该函 数。
(三)PowerScript语言简介
1.数据类型
PB8中支持的标准数据类型在许多编程语言和数据库服务器之间都是通用的。有数值类型(Integer、Decimal、Double、 Long、Real等)、字符类型(String、Char)、日期类型(Date、Datetime、Time)、逻辑类型(Boolean)、以及二进 制大型对象类型Blob等。
/xxgcx/zsyd/ç¨ åº è®¾è®¡è¯è¨ /PowerBuilder%20... 2002-12-7
PowerBuilder 8.0开发指南
页码,5/11
CONNECT:连接一个数据库事务对象。
DISCONNECT:断开已连接的一个数据库事务对象。
(二)PowerBuilder 8.0面向对象的特性
提到一门语言的面向对象特性,它应当具有继承性、多态性和封装性,如缺少其中的一个都只能称其为基于对象的系 统,而不是面向对象的系统,而PB8则很好地具备了全部三个特性。
1.继承
在PB8中,只有窗口、菜单和用户对象是可以继承的。一旦继承了一个对象,所得到的子类将具有祖先类的属性、实例变 量、共享变量、控件、用户自定义事件、对象级函数、事件和代码(Script)。也就是说一旦继承了一个类,就几乎得 到了这个类的全部。不过值得注意的是,在子类中可以修改、添加但不能删除任何一个继承到的特性。
pb简介
PowerBuilder提供了对目前流行的大多数关系数据库管理系统的支持,由于在PowerBuilder的应用程序中对数据库访问的部分一般采用国际化标准数据库查询语言SQL,使得用PowerBuilder开发的应用程序可以不做修改或者只做少量的修改就可以在不同的后台数据库管理系统上使用。
也就是说用PowerBuilder开发的应用程序是独立于服务器上的数据库。
主要特点PowerBuilder提供了对目前流行的大多数关系数据库管理系统PowerBuilder的支持,由于在PowerBuilder的应用程序中对数据库访问的部分一般采用国际化标准数据库查询语言SQL,使得用PowerBuilder开发的应用程序可以不做修改或者只做少量的修改就可以在不同的后台数据库管理系统上使用。
也就是说用PowerBuilder开发的应用程序是独立于服务器上的数据库管理系统的。
和大多数的WINDOWS应用程序一样,PowerBuilder也是事件驱动工作方式。
在这种工作方式中,程序的运行没有固定的流程,程序中的代码也是为各种可能发生的事件编写的,当程序开始运行之后,它就可以接受来自系统,用户或者其它应用程序触发的事件,然后执行相应的事件代码。
事件驱动的工作方式与面向对象技术是紧密相关的,在PowerBuilder应用程序中,接受发生的事件的往往就是程序界面中的各种可视化对象。
PowerBuilder是一种面向对象的开发工具,各种WINDOWS应用程序中常见的窗口、菜单、控件等在PowerBuilder中都是一个个的对象。
在PowerBuilder中我们还可以创建自己的用户对象。
特别要指出的是PowerBuilder提供了对面向对象方法中的各种技术的全面支持,我们可以利用面向对象方法中的对象的封装性、继承性、多态性等特点使得我们开发的应用程序具有极大的可重用性和可扩展性,而这一点正是软件工程中对应用程序所提出的重要目标。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PB数据窗口的多表更新原理分析:数据窗口数据源来自两个或两个以上的表,相当于多个表连接建立的一个视图,对于这种数据窗口,PB默认是不能修改的。
当然我们可以通过设置它的Update 属性,数据窗口的Update Properties用来设置数据窗口是否可Update、可Update的表、可Update列等,但不能同时设置两个表可更新;所以当修改它的数据项时,我们不能简单地用dw_1.update()来更新table,我们可以在程序中设置数据窗口可更新的一个表A(及其可更新列),其他表为不可更新,更新完表A后,再设置另一表B为可更新,表A设置为不可更新,依次类推。
解决示例:我们以PowerBuilder7自带的ASA6数据库为例:1、新建一个数据窗口d_grid_dep_emp,它的Select语句为SELECT department.dept_id,department.dept_name,employee.emp_id,employee.emp_fname,employee.emp_lnameFROM department, employeewhere employee.dept_id = department.dept_id2、设置数据窗口d_grid_dep_emp的属性,将列的taborder改为非0值;并点击菜单Rows――Update Properties,设置此数据窗口Allow Updates,Table to Update设为department,Updateable Columns为department.dept_id,department.dept_name。
3、在窗口中“更新”数据窗口按钮的clicked事件编写脚本:long ll_rtn// 修改Department表(Department表在第2步已设置为可更新)ll_rtn = dw_1.update(true, false)if ll_rtn = 1 then//关闭对Department表的修改dw_1.Modify( department_dept_name.Update = No )dw_1.Modify( department_dept_id.Update = No )dw_1.Modify( department_dept_id.Key = No )//设置Employee表成为新的可修改表dw_1.Modify( DataWindow.Table.UpdateTable = employee )dw_1.Modify( employee_emp_id.Update = Yes )dw_1.Modify( employee_emp_fname.Update = Yes )dw_1.Modify( employee_emp_lname.Update = Yes )dw_1.Modify( employee_emp_id.Key = Yes )//修改Employee表ll_rtn = dw_1.Update()IF ll_rtn = 1 THENCOMMIT USING SQLCA;dw_1.retrieve()messagebox( 提示信息, 更新成功!)ELSEROLLBACK USING SQLCA;MessageBox( 提示信息, 更新失败!)END IF//重设修改标志dw_1.Modify( department_dept_name.Update = Yes )dw_1.Modify( department_dept_id.Update = Yes )dw_1.Modify( department_dept_id.Key = Yes )dw_1.Modify( DataWindow.Table.UpdateTable = department )dw_1.Modify( employee_emp_id.Update = No )dw_1.Modify( employee_emp_fname.Update = No )dw_1.Modify( employee_emp_lname.Update = No )dw_1.Modify( employee_emp_id.Key = No )ELSEROLLBACK USING SQLCA;MessageBox( 提示信息, 更新失败!)END IF这样就完成了对两个表的更新。
当然我们可以将上面功能编成一个函数,在需要时调用。
PowerBuilder的数据窗口对象是其特有的智能对象,其封装性好、功能强大、表现形式丰富多样,为此,许多MIS开发人员对PowerBuilder推崇备至,将其视为首选开发工具。
一般情况下,一个数据窗口只能更新一个数据库表,但在MIS开发过程中,我们经常遇到这种情况:一个数据窗口中由两个或更多个数据库表作为数据源,并需要对其进行录入或修改,如何给出多表更新的通用解决方案就成为MIS开发人员不容回避的问题。
笔者在某管理信息系统的开发过程中,尝试了几种双表更新的解决方法,选出一种比较好的方案,以飨读者。
一、具体步骤1.在数据窗口建立时,选择SQL Select,显示风格可以是Tabular、Grid或FreeForm中的任一种。
选出两表需要录入或修改的列,其中两表的主键和非空列必须选中,确定选择条件,建立连接关系。
2.在选单“Rows/Update”中选择第一个表的全部数据项为可更新项。
3.把两表需要修改项的Tab Order数值改为非0值,使其在数据窗口中成为可修改项。
为了使方案具有通用性,建立全局函数f―update―2table,有五个参数:dw―obj、table1、table2、key1、key2,分别代表所要更新的数据窗口、两表表名和两表主键列名,其中dw―obj为DataWindow类型,其余四参数均为String类型。
该函数返回值为Boolean型,返回True表示成功,返回False表示失败。
二、函数思路1.先针对第一个数据库表调用Update函数更新。
注意参数的使用:第一个参数作用是控制数据窗口更新前是否强制性调用AcceptText(),在数据窗口更新前通过有效性验证;第二个参数是控制更新标志的复位,为True时更新标志复位,为False时更新标志不复位。
2.更改数据窗口的UpdateTable属性,使其指向第二个表,并把第一个表的各数据项Update属性和主键列的Key属性改为No,接着把第二个表的各数据项Update属性和主键列的Key属性改为Yes。
3.调用Update函数更新第二个表。
4.两表更新成功后,把两表的列属性、主键属性改回到初始状态,以便为下一次的两表更新调用做好准备。
三、程序清单//ColName:数据窗口列名//Name1[],Name2[]:两数据库表选中项列名//n1,n2:两数据库表选中项数量//i:循环计数器//Columns:数据窗口总列数String ColName,Name1[],Name2[]Integer Columns,i,n1=0,n2=0//下面程序:找出dw―obj的两表列名赋给Name1[],Name2[]Columns=Integer(dw―obj.Describe(″DataWindow.Column.Count″))FOR i=1 TO columnsColName=Upper(dw―obj.Describe(″#″+String(i)+″.Name″))IF Left(ColName,Len(Table1))=Table1 and ColName〈〉Key1 THENn1=n1+1Name1[n1]=ColNameEND IFIF Left(ColName,Len(Table2))=Table2 and ColName〈〉Key2 THENn2=n2+1Name2[n2]=ColNameEND IFNEXT// 下面程序:存储dw―obj,确定返回值(True:成功,False:失败)IF dw_obj.Update(True,False)=1 THENFOR i=1 TO n1dw―obj.Modify(Name1[i ]+″.Update=No″)NEXTdw―obj.Modify(Key1+″.Key=No″)dw―obj.Modify(″DataWindow.Table.UpdateTable=′″+Table2+″′″)FOR i=1 TO n2dw―obj.Modify(Name2[i ]+″.Update=Yes″)NEXTdw―obj.Modify(Key2+″.Key=Yes″)IF dw―obj.Update()=1 THENCommit;FOR i=1 TO n1dw―obj.Modify(Name1[i ]+″.Update=Yes″)NEXTdw―obj.Modify(Key1+″.Key=Yes″)dw―obj.Modify(″DataWindow.Table.UpdateTable=′″+Table1+″′″)FOR i=1 TO n2dw―obj.Modify(Name2[i ]+″.Update=No″)NEXTdw―obj.Modify(Key2+″.Key=No″)return TrueELSERollback;return FalseEND IFELSERollback;return FalseEND IF四、调用方法假设窗口名为w―update,数据窗口为dw―1,数据库表名和主键名分别为t1、t2、k1、k2,放置“存盘”按钮,按钮Clicked事件的Script语句如下:dw_1.AcceptText()IF dw―1.ModifiedCount()〉0 or dw_1.DeletedCount()〉0 THENIF MessageBox(″提示信息″,″是否存盘?″,Question!,YesNo!)=1 THENIF f―update―2table(dw―1,″t1″,″t2″,″k1″,″k2″) THENCommit;ELSERollback;EndEND IFEND IFEND IF综上所述,可以看出,该方案具有很好的可扩展性,稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。