为什么数据窗口无法更新???

cdqy 2002-03-28 05:32:33
我有个数据窗口里的数据是从多张表中取得的。我现在只要更新一张表中的数据。
我已经了设置数据窗口的属性,并点击菜单Rows——>Update Properties,设置此数据窗口Allow Updates,Table to Update设为我所要更改的表名,Updateable Columns为我要更改的列名。
现在在数据窗口的画笔中数据可以更改。但程序运行后,却报数据窗口没有更新能力?
为什么?
...全文
138 24 打赏 收藏 转发到动态 举报
写回复
用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)

1,077

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧