社区
PowerBuilder
帖子详情
为什么数据窗口无法更新???
cdqy
2002-03-28 05:32:33
我有个数据窗口里的数据是从多张表中取得的。我现在只要更新一张表中的数据。
我已经了设置数据窗口的属性,并点击菜单Rows——>Update Properties,设置此数据窗口Allow Updates,Table to Update设为我所要更改的表名,Updateable Columns为我要更改的列名。
现在在数据窗口的画笔中数据可以更改。但程序运行后,却报数据窗口没有更新能力?
为什么?
...全文
138
24
打赏
收藏
为什么数据窗口无法更新???
我有个数据窗口里的数据是从多张表中取得的。我现在只要更新一张表中的数据。 我已经了设置数据窗口的属性,并点击菜单Rows——>Update Properties,设置此数据窗口Allow Updates,Table to Update设为我所要更改的表名,Updateable Columns为我要更改的列名。 现在在数据窗口的画笔中数据可以更改。但程序运行后,却报数据窗口没有更新能力? 为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
24 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fallstone
2002-03-29
打赏
举报
回复
HOHO。
cdqy
2002-03-29
打赏
举报
回复
用户进行查询得到数据,然后再更改数据!
cdqy
2002-03-29
打赏
举报
回复
散分!!!
cdqy
2002-03-29
打赏
举报
回复
问题已解决。在数据窗口被重新查询后,必须从新设置数据窗口的更新属性。
当数据窗口中只有一张表的时候不需要。但如果有多张表的时候,就需要。
谢谢各位!!!
fallstone
2002-03-29
打赏
举报
回复
查询后什么意思???
cdqy
2002-03-29
打赏
举报
回复
如果窗口在打开时就retrieve数据窗口,数据可以修改。
但一旦查询后,就无法修改啦!为什么?
fallstone
2002-03-29
打赏
举报
回复
你有没有在数据库里对表做过什么修改?是不是先把这个DW另存一个,考虑重新选择一下这个DW的列,以及重新设置更新属性。
cdqy
2002-03-29
打赏
举报
回复
有主键,而且也选中了。也不是子数据窗口的问题。为什么在数据窗口中预览时可以修改。而程序运行后却不行。这中间有什么区别吗?
lesni
2002-03-29
打赏
举报
回复
没有主键,或者有主键你在Update属性中没有选中。
msf
2002-03-28
打赏
举报
回复
看一看,问题就解决了.
Window来表现数据库中多个表中数据的情形,这时Data Window用到的SQL
Select语句是一个多张表连接的视图。当我们对这样一个Data
Window中的数据进行修改并提交数据库时,我们将会发现我们并不能简单地使用一条dw.update()来实现同时对数据库中多张表的修改。
----事实上,系统在Data
Window中提交数据库并生成UPDATE语句时所根据的仍然是图一这个窗口。在以前的章节中我们曾介绍过利用这个窗口中一些不同的选项实现数据库的并发控制,这里我们再讲一下这个窗口中的选项对生成UPDATE语句的其它影响。
----当我们调用UPDATE函数时,这个窗口中有四个域将被涉及:
Where Clause
for Update/Delete where子句的生成依据。这个选项主要是用来进行并发控制的,这里不再赘述。
Update able
Columns可修改的列。这是一个我们将遇到麻烦的地方。PowerBuilder只能同时对一张要修改的表进行管理,所以我们不能一下子指出所有表中所有要修改的列。在这里我们只能指出某一张表中要修改的列,以后在程序中用Modify语句依次指定其它每一张表中要修改的列。
Table to
Update将要修改的表。PowerBuilder只支持一张表的修改,所以我们也只能在这里只指定其中的某一张表,其余的表也将要利用Modify语句修改。
Unique Key
Columns唯一键的列。这也是我们要注意的地方,因为PowerBuilder生成的UPDATE语句只是在要修改的表名中使用DATABASE.OWNER.TABLE这样的全称,而引用某列时只是简单指出列名,而不用DATABASE.OWNER.TABLE.COLUMN这样的全称。所以,如果我们这里用到的唯一列标识不属于上面"Table
to Update"中定义的表的列,这一条SQL语句将出现语法错误。
----PowerBuilder在Data
Window中产生的UPDATE语句和DELETE语句如下:----●UPDATE
database.owner.table----SET
column=somevalue,----WHERE Unique Key
Column=somevalue;
----●DELETE FRO Mdatabase.owner.table----WHERE Unique Key Column=somevalue;
----在一条SQL
UPDATE和DELETE语句中,所有引用的列名均不使用列的全称,因此对列名的确定完全由update
table来决定,在UPDATE语句中所有修改属性均设为TRUE,而且用户进行过修改的列都将加到SET子句中。PowerBuilder根据用户对"Where
Clause for
Update/Delete"的选择形成WHERE子句,由于系统自动地将多个表中所有的列都加到SET子句和WHERE子句中,而PowerBuilder又是根据用户指定的update
table来确定列,因此我们显然是无法得到一个准确的SQL语句的。我们来看这样一个实例(本表可以在PowerBuilder
DEOM数据库中得到,注意:如果我们希望某一列不被修改,我们可以在Data Window画笔中将TAB order设置为0):
CUSTOMER.Customer-ID=101CUSTOMER.FirstName=MichaelsCUSTOMER.LastName=DevlinCUSTOMER.Address=3114 Pioneer AvenueSALES-ORDER.ID=2001SALES-ORDER.order-date=09/14/94我们将其改为:CUSTOMER.Address=1905 Maple AvenueSALES-ORDER.order-date=12/11/94
----如果我们只是用dw.update()语句来形成UPDATE语句,PowerBuilder将自动构造成这样的一条语句:
----上述三条SQL语句在提交数据库时都将产生"Invalid column
name‘id'"的错误,很明显,"id"这一个字段并不在custumer这一张表中。此外SALES-ORDER这张表的内容并没有进行修改。
----为真正实现对多表数据的修改,我们可以编写这样一个函数f-MUpdate()。
integer f-M Update(a-dw,as-update-table)a-dw-DataWindow名称;as-update-table-将要修改的表名的全称。
Longll-ipos,ll-maxcol,iStringls-colnam,ls-mod,ls-table-name,ls-err,ls-update keyll,ls-qualifier=""//从传递的参数中分离出表名和域名ll-ipos=Pos(as-update-table,"·",l)If(ll-ipos>0)Thenls-qualifier=Left(as-update-table,ll-ipos)as-update-table=Mid(as-update-table,&ll-ipos+1)ll-ipos=Pos(as-update-table,"·",l)If(ll-ipos>0)Thenls-qualifier=ls-qualifier+&Left(as-update-table,ll-ipos)as-update-table=Mid(as-update-table,&ll-ipos+1)end IfEnd If//得到这个DataWindow包含列的数量ls-err=a-dw.object.DataWindow.Column.Countll-maxcol=Integer(Is-err)If(ll-maxcol<1)ThenReturn1End IF
----//确认DataWindow中的每一列是否属于要修改的表中的列,如是将其update属性设为Yes,否则为No.
FOR i=1 To ll-maxcolls-mod="#"+String(i)+".Name"ls-colnam=a-dw.Descibe(ls-mod)ls-table-name=a-dw.Descibe(ls-colnam+&".dbName")ls-table-name=Left(ls-table-name,&)(Pos(ls-table-name,"·",l)-l))If(Upper(as-update-table)=Upper(ls-table-name))Thenls-mod=ls-colnam+".Update=Yes"Else//如果该列不在可修改的表中,//而其为主键的属性为TRUE//将其列名存在ls-updatekey[]中//并将其主键的属性设为FALSE。
//由于PB不保留列的全名,我们不能。
//保留非修改表的键的名称。
//所以我们将其保留在数组之中,以便其恢复If(Upper(a-dw.Descibe(ls-colnam+".Key"))="YES")Thenls-updatekey[UpperBound(ls-update key[])+1]=ls-colnamls-mod=ls-colnam+".Key=No"If(a-dw.Modify(ls-mod)<>"")ThenReturn-2End IfEnd Ifls-mod=ls-colnam+".Update=No"End IF//确认修改是否成功If(a-dw.Modify(ls-mod)<>"")ThenReturn-2End IFNEXT//将修改表名设置为全称a-dw.object.DataWindow.Table.UpdateTable=ls-qualifier+as-update-table//修改DataWindowIf(a-dw.Update(TRUE,FALSE)<>1)ThenReturn-5Else//将Data Window恢复为其原来的状态ll-maxcol=UpperBound(ls-updatekey)FOR i=l to ll-maxcolls-mod=ls-updatekey[i]+".key=Yes"If(a-dw.Modify(ls-mod)<>"")ThenReturn-6End IfReturn0End If
----调用这一函数时应遵守以下规则:
保证数据的参照完整性,应当先修改父表后修改子表;
在DataWindow画笔中为每张表建立唯一主键;
在图一窗口中,将该DataWindow设为允许修改;
指定所涉及的任意一张表为修改表,表中的任一列为可修改列。以保证Data
Window有修改权,这样我们调用的函数就可以覆盖这一设置。
不要将并发控制选为key
and modified columns,这个函数无法在这一条件下工作。
将表名的全称DATABASE.OWNER.TABLE传递给这个函数,特别是在这个Data
Windows是对多个数据库进行操作时。
----在上例中,我们可以这样调用这个函数
f-MUpdate(dw-l,"dbo.sales-order")f-MUpdate(dw-l,"dbo.customer")
icd
2002-03-28
打赏
举报
回复
用modify函数去改数据窗口的update属性
long5
2002-03-28
打赏
举报
回复
一定是子数据窗口的问题,你是不是尝试着先更新子数据窗口,然后再设置更新该数据窗口,这可以在程序中控制更新属性实现
圣殿骑士18
2002-03-28
打赏
举报
回复
更新子数据窗口应该不能直接用update
cdqy
2002-03-28
打赏
举报
回复
可为什么程序不运行时却可以呢?
rabbitsfoot
2002-03-28
打赏
举报
回复
子数据窗?然后你UPDATE主数据窗,好象不可以吧?
fa791222
2002-03-28
打赏
举报
回复
一: 如果表要更新的话那得设主键,只有主键选上了才能更新.
二: 如果表还有改动的话,那FORMAT菜单下的TAB ORDER 也必须得设置.
这个回答应该可以解决你的问题1!!!
cdqy
2002-03-28
打赏
举报
回复
错误信息:Datawindow does not have UPDATE capability;
fa791222
2002-03-28
打赏
举报
回复
一:没有主键的表是不能更新的.因为只有这张表的所有主键都选了,表才能更新.
二:如果表还要改动的话,那FORMAT下的TAB ORDER 也得设置.
这个回答应该可以解决你的问题.
cdqy
2002-03-28
打赏
举报
回复
我要更改的那列是用一个子数据窗口,是否跟这个有关吗?
rabbitsfoot
2002-03-28
打赏
举报
回复
错误信息?
加载更多回复(4)
你必须知道的495个C语言问题
为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...
如何在PB
数据
窗口
中设置
数据
窗口
的
更新
属性
数据
窗口
对象非常强大的原因之一就是能够很容易地修改
数据
库。当用户修改了
数据
窗口
中的
数据
,插入了新的
数据
行或者删除了
数据
行以后,只要调用 update()函数就可以将修改了的
数据
保存到
数据
库中。但是,这需要一个...
网络:TCP的滑动
窗口
与流量控制和拥塞控制
为什么要流量控制?
窗口
探测流量控制引发的死锁?怎么避免死锁的发生?糊涂
窗口
综合症?怎么解决?发送
窗口
和拥塞
窗口
的区别?如何实现流量控制 当网络上
数据
流量超过网络硬件负荷时就会出现网络拥塞,就是我们平常...
PB
数据
窗口
错误处理技术
PB
数据
窗口
错误处理技术
数据
窗口
的错误大体上可以分为两类,一类是后来用户
数据
输入错误导致的
数据
窗口
错误,另一类是由于代码本身在程序运行时产生的错误。一个好的应用程序,不论发生哪一类错误,都不应该...
PB-
数据
窗口
缓冲区与
数据
修改状态
PB-
数据
窗口
缓冲区与
数据
修改状态 1--缓冲区的介绍 在应用程序运行时,用户对
数据
窗口
进行的操作情况是很复杂的,删除、插入、修改等操作有可能都会发生。记录哪些
数据
修改过、哪些
数据
需要删除、哪些
数据
...
PowerBuilder
1,077
社区成员
66,438
社区内容
发帖
与我相关
我的任务
PowerBuilder
PowerBuilder 相关问题讨论
复制链接
扫一扫
分享
社区描述
PowerBuilder 相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章