动态修改数据窗,大家帮忙看看。

c8 2004-12-07 07:13:27
有一类表,表包含的列一样,只是表名不同,命名如bj263.callblack***,‘***’是不同的。

我想在程序中动态的修改数据窗,实现数据的提取和更新。不想为每个表都做一个数据窗。
而且由于有的表是在系统使用中动态建立的,也不能事先都做好数据窗。最好还是动态生成比较好。

我先为表bj263.callblack020建立了一个数据窗,然后以
edit source方式打开数据窗,有如下代码:
……
table(column=(type=char(20) update=yes updatewhereclause=yes key=yes name=phone dbname="callblack020.phone" )
retrieve="PBSELECT( VERSION(400) TABLE(NAME=~"bj263.callblack020~" ) COLUMN(NAME=~"bj263.callblack020.phone~")) " update="BJ263.CALLBLACK020" updatewhere=1 updatekeyinplace=yes )

……
实验发现修改以上四处和表名“bj263.callblack020”有关的的地方就可以实现。

现在用dw_1.Modify("DataWindow.Table.UpdateTable='BJ263.CALLBLACK" + is_code + "'")
可以修改update="BJ263.CALLBLACK020"。

但是遇到了一个问题:
如何在程序中动态修改dbname="callblack020.phone",TABLE(NAME=~"bj263.callblack020~" ,COLUMN(NAME=~"bj263.callblack020.phone~"))这几处地方的表的名字?




...全文
129 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
balloonman2002 2004-12-07
  • 打赏
  • 举报
回复
哈哈,放分揭贴,:)
另外庆贺自己找到折腾了一天总算找到自己的毕业证和学位证了,:)
c8 2004-12-07
  • 打赏
  • 举报
回复
成功了!

是这样做的,
获取dw_1.Object.DataWindow.Syntax后replace其中的表名,
然后再用dw_1.Create ( )函数重构DW。
这样就可以把dbname="callblack020.phone"的callblack020替换掉了。

试验了半天,一点收获:
感觉dw_1.Modify("DataWindow.Table.Select='" + sqlvar + "'")和SETSQLSELECT()函数的作用差不多。

用SETSQLSELECT()函数以后还要用dw_1.Modify("DataWindow.Table.UpdateTable='BJ263.CALLBLACK" + is_code + "'")重新设置DW的UPDATE属性。

SETSQLSELECT()函数不能修改dbname="callblack020.phone",这个dbname还是要用replace对Syntax替换后,用dw_1.Create ( )函数重构DW的方法,才可以修改。

没有试验直接用replace替换四处表名,然后用dw_1.Create ( )函数重构DW的方法。
(我是用先SETSQLSELECT()替换两处,再重新设置DW的UPDATE属性替换一处,再用dw_1.Create ( )函数重构DW的方法替换dbname的方法。)不想试了,有机会大家试吧。另外我这个数据窗仅仅就有一列,所以只要替换一处dbname。如果有多列,可能要用循环了。


谢谢 balloonman2002 ,结了。

luotitan 2004-12-07
  • 打赏
  • 举报
回复
最常用的方法
Dw_Data.Create(SyntaxFromSql(SQLCA,ls_sql,"Style(Type = Grid)",err_SynTax))
然后用modify修改属性,不要和一大字符过不去了。

WorldMobile 2004-12-07
  • 打赏
  • 举报
回复
balloonman2002,你说的方法能行么?

我觉得你应该动态创建数据窗口,应该就没什么问题了,

每次都把语法里的表名改为你想要的表名,然后再创建数据窗口即可
balloonman2002 2004-12-07
  • 打赏
  • 举报
回复
所以说如果你要用SETSQLSELECT()函数,必须再重新设置DW的UPDATE属性,估计这就是你报错的原因所在
balloonman2002 2004-12-07
  • 打赏
  • 举报
回复
那你试试另外两种方法:

1、修改dw.object.datawindow.table.select属性:

sqlvar = 'SELECT ... WHERE ...'

dw_1.Modify("DataWindow.Table.Select='" + sqlvar + "'")

2、获取dw_1.Object.DataWindow.Syntax后replace其中的表名,然后再用dwcontrol.Create ( syntax {, errorbuffer } )函数重构DW即可
c8 2004-12-07
  • 打赏
  • 举报
回复
to balloonman2002 :

用SETSQLSELECT函数可以修改两处,但是dbname="callblack020.phone"这里还是不变:(

这样数据检索到是没有问题,但是 dw_1.update() 就不行了。报错ORA-00942: table or view does not exist No changes made to database.


setting = dw_1.Object.DataWindow.Syntax
messagebox('',setting )
看了一下,就差在dbname="callblack020.phone"这里了:(

c8 2004-12-07
  • 打赏
  • 举报
回复
没说错,我用

setting = dw_1.Object.DataWindow.Syntax
messagebox('',setting )

看了,就是
table(column=(type=char(20) update=yes updatewhereclause=yes key=yes name=phone dbname="callblack020.phone" )
这里的dbname="callblack020.phone"我处理不了:(

就差这一点了。。。。
balloonman2002 2004-12-07
  • 打赏
  • 举报
回复
不需要单独修改dbname="callblack020.phone",只要使用SETSQLSELECT函数,PB会自动帮你修改列名的,但注意由于你变化了表名,因此要重新设置表的UPDATE属性
handycyw 2004-12-07
  • 打赏
  • 举报
回复
你说的有错吧!应该是dbname修改了,name没有修改吧!??
我以前做的好像是这样的!?
至于name那么可以是
SELECT BJ263.CALLBLACK" + is_code + ".PHONE AS BJ263.CALLBLACK" + is_code + "_phone FROM BJ263.CALLBLACK" + is_code
即:字段在sql语句中增加as 表名_字段名
c8 2004-12-07
  • 打赏
  • 举报
回复

ls_SQLSelect = " SELECT BJ263.CALLBLACK" + is_code + ".PHONE FROM BJ263.CALLBLACK" + is_code

dw_1.SetSQLSelect(ls_SQLSelect)
可以修改(NAME=~"bj263.callblack020~" ,COLUMN(NAME=~"bj263.callblack020.phone~"))这两处了

现在还差一点儿:dbname="callblack020.phone",这里怎么修改??

c8 2004-12-07
  • 打赏
  • 举报
回复
我自己顶一下!

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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