导航
  • 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

数据窗口更新的问题!update() =1好象不能满足。为什么!请看看。

dingd 2002-10-29 01:36:40
一共两个windows!
窗体allrecord 上有个dw_1的数据窗口,用来显示所有数据!已经实现!!
还有一个"新增"按钮cb_1, 点击按钮cb_1,重新弹出一个窗体new ,这个new上有个
Tab Control,上面有3页!每个页对应一个数据窗口。
分别是tab_1.tabpage_1.dw_1, tab_1.tabpage_2.dw_2和tab_1.tabpage_3.dw_3
窗体new上有个"确定"按钮,来确定输入
下面就是我写的代码: 可是运行后,
弹出一个DataWindow Error的窗口(我没有定义),
上面显示:DataWindow does not have UPDATE capability.
这是什么原因,为什么我的数据更新不成功?????
-------------------------------------------------
int i_ret
i_ret = MessageBox("系统提示:","确认输入吗?",Question!,OKCancel!,1)
//如果点击OK!
IF i_ret = 1 then
//读数据窗口数据
if tab_1.tabpage_1.dw_1.accepttext() <> 1 then
messagebox("系统提示:","!!!!!!!!!!!")
return
end if

//检查"编号"是否为空
if string(tab_1.tabpage_1.dw_1.getitemnumber(1,"id"))=''&
or Isnull(tab_1.tabpage_1.dw_1.getitemnumber(1,"id")) = true then
messagebox("系统提示:","'编号'不能为空!")
tab_1.tabpage_1.dw_1.setfocus()
tab_1.tabpage_1.dw_1.setcolumn(1)
return
end if

//检查"编号"是否重复
int tab_id=-1
int cur_id
cur_id = tab_1.tabpage_1.dw_1.getitemnumber(tab_1.tabpage_1.dw_1.getrow(),"id")
select id
into :tab_id
from ps_info
where id=:cur_id;
if (tab_id <> -1) then
messagebox("系统提示:","编号重复!")
tab_1.tabpage_1.dw_1.setfocus()
tab_1.tabpage_1.dw_1.setcolumn(1)
return
end if

//检查"姓名"是否为空
if trim(tab_1.tabpage_1.dw_1.getitemstring(1,"name"))=''&
or Isnull(tab_1.tabpage_1.dw_1.getitemstring(1,"name")) = true then
messagebox("系统提示:","'姓名'不能为空!")
tab_1.tabpage_1.dw_1.setfocus()
tab_1.tabpage_1.dw_1.setcolumn(2)
return
end if

//"姓名"的开头不能为数字
string temp_name
temp_name = trim(tab_1.tabpage_1.dw_1.getitemstring(tab_1.tabpage_1.dw_1.getrow(),"name"))
if pos('0123456789',left(temp_name,1)) <> 0 then
messagebox("系统提示:","姓名的第一个字母不得为数字!")
tab_1.tabpage_1.dw_1.setfocus()
tab_1.tabpage_1.dw_1.setcolumn(2)
return
end if

//检查"性别"是否为空
if trim(tab_1.tabpage_1.dw_1.getitemstring(1,"sex"))=''&
or Isnull(tab_1.tabpage_1.dw_1.getitemstring(1,"sex")) = true then
messagebox("系统提示:","'性别'不能为空!")
tab_1.tabpage_1.dw_1.setfocus()
tab_1.tabpage_1.dw_1.setcolumn(3)
return
end if


if tab_1.tabpage_1.dw_1.accepttext() = 1 then
if tab_1.tabpage_1.dw_1.update() =1 then
if tab_1.tabpage_2.dw_2.update() =1 then
if tab_1.tabpage_3.dw_3.update() =1 then
commit;
else
rollback;
end if
else
rollback;
end if
else
rollback;

end if
end if

end IF

tab_1.tabpage_1.dw_1.reset()
tab_1.tabpage_1.dw_1.insertrow(0)

tab_1.tabpage_2.dw_2.reset()
tab_1.tabpage_2.dw_2.insertrow(0)

tab_1.tabpage_3.dw_3.reset()
tab_1.tabpage_3.dw_3.insertrow(0)

//close(new)

-----------------------------------
根据我的初步测试,问题可能出在:
if tab_1.tabpage_1.dw_1.update() =1 then
if tab_1.tabpage_2.dw_2.update() =1 then
if tab_1.tabpage_3.dw_3.update() =1 then
前面的if tab_1.tabpage_1.dw_1.accepttext() = 1条件是满足了!!!
但进入到if tab_1.tabpage_1.dw_1.update() =1就不满足了,这是为什么?
update()难道不能这样用????
...全文
29 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingd 2002-10-31
我是说一个DW里涉及多个表!

而update属性设置,似乎只能设置一个表的!


涉及到多表怎么办?
回复
huihuishou 2002-10-31
下面是我不小心看到的关于多表更新的方法,楼主参考一下吧:


实现PB数据窗口的多表更新

  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 columns

ColName=Upper(dw—obj.Describe(″#″+String(i)+″.Name″))

IF Left(ColName,Len(Table1))=Table1 and ColName〈〉Key1 THEN

n1=n1+1

Name1[n1]=ColName

END IF

IF Left(ColName,Len(Table2))=Table2 and ColName〈〉Key2 THEN

n2=n2+1

Name2[n2]=ColName

END IF

  NEXT

  // 下面程序:存储dw—obj,确定返回值(True:成功,False:失败)

  IF dw_obj.Update(True,False)=1 THEN

   FOR i=1 TO n1

   dw—obj.Modify(Name1[i]+″.Update=No″)

   NEXT

dw—obj.Modify(Key1+″.Key=No″)

  dw—obj.Modify(″DataWindow.Table.Update

  Table=′ ″+Table2+″ ′ ″)

FOR i=1 TO n2

  dw—obj.Modify(Name2[i]+″.Update=Yes″)

NEXT

   dw—obj.Modify(Key2+″.Key=Yes″)

IF dw—obj.Update()=1 THEN

Commit;

FOR i=1 TO n1

dw—obj.Modify(Name1[i]+″.Update=Yes″)

NEXT

dw—obj.Modify(Key1+″.Key=Yes″)

dw—obj.Modify(″DataWindow.Table.UpdateTable=′ ″+Table1+″ ′ ″)

FOR i=1 TO n2

dw—obj.Modify(Name2[i]+″.Update=No″)

NEXT

dw—obj.Modify(Key2+″.Key=No″)

return True

ELSE

Rollback;

return False

END IF

  ELSE

Rollback;

return False

  END IF

  四、调用方法

  假设窗口名为w—update,数据窗口为dw—1,数据库表名和主键名分别为t1、t2、k1、k2,放置“存盘”按钮,按钮Clicked事件的Script语句如下:

  dw_1.AcceptText()

  IF dw—1.ModifiedCount()〉0 or dw_1.DeletedCount()〉0 THEN

IF MessageBox(″提示信息″,″是否存盘?″,Question!,YesNo!)=1 THEN

   IF f—update—2table(dw—1,″t1″,″t2″,″k1″,″k2″) THEN

   Commit;

ELSE

Rollback;

   END IF

   END IF

  END IF

  综上所述,可以看出,该方案具有很好的可扩展性,稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。

   摘自《赛迪网》 宋铭/文



回复
lishiqian 2002-10-31
一般不同时更新两个表
回复
lishiqian 2002-10-31
我是说一个DW里涉及多个表!

而update属性设置,似乎只能设置一个表的!


涉及到多表怎么办?


好象没办法
回复
louisa5155 2002-10-31
以上必须在表都有主键的情况下使用
回复
louisa5155 2002-10-31
你的多表都有主键吗?如果都有的话应该没有问题
如果仍然有问题,可以程序给DW修改属性:
Table.updatekeyinplace=yes//使用update语句修改键值列
Table.updatewhere=1//键列及所有可更新列包含到UPDATE的WHERE字句中
回复
louisa5155 2002-10-30
重建吧,兄弟,保证每个表都有主键而且不要在建好了后再去增减属性,这样默认就有UPDATE PROPERTIES了
具体跟你说一下:
没有主键的表是不可能有UPDATE PROPERTIES
在右边的属性列里选择主键,有主键默认为选择主键
在左边的属性列里选择你要更新的列,一般为全选
点选:
KEY AND UPDATEABLE COLUMNS
USE UPDATE
回复
dingd 2002-10-30
我一检查到:
就是没有设置 rows菜单下的update properties

可是书上广是那些代码,就没说
要去设置rows菜单下的update properties!!!

还有,里面的设置我还有些不太明白。

在涉及到多表怎么办,里面好像只能设置一个表的。???
回复
wyj581 2002-10-30
up
回复
chengjian 2002-10-30
同意楼上,报的错与代码没有关系。
回复
emoam 2002-10-30
txchen(txchen) :"改一下数据窗口对象的更新属性:rows菜单下的update properties"

同意。可能是因为你的数据窗口变动过,UPDATE属性中没有选中字段哦~
回复
pufan 2002-10-29
检查数据窗口对象的update properties的unique key columns是否选中主键.
回复
txchen 2002-10-29
改一下数据窗口对象的更新属性:rows菜单下的update properties
回复
booksfount 2002-10-29
DataWindow does not have UPDATE capability是说你的数据窗口没有可更新属性,可能是你又修改了数据窗口(添加了字段),造成其不可更新属性,加上即可
回复
发动态
发帖子
PowerBuilder
创建于2007-09-28

810

社区成员

PowerBuilder 相关问题讨论
申请成为版主
社区公告
暂无公告