多表更新的问题

csg2000 2003-02-11 09:01:38
请问如何修改字段的TAB ORDER,使其不为0,完成多表更新
...全文
52 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanzhousunbo 2003-02-12
  • 打赏
  • 举报
回复
设置tab order与更新无关,如下是双表更新的例子,数据窗口必须包含两表的主键列和非空列(insert时)
integer column_number,i,n1=1,n2=1
string column_name,tab1[],tab2[]

column_number=integer(dw_datawindow.object.datawindow.column.count)

for i=1 to column_number
column_name=dw_datawindow.describe("#"+string(i)+".name")
if left(column_name,len(table1))=table1 then
tab1[n1]=column_name
n1=n1+1
end if
if left(column_name,len(table2))=table2 then
tab2[n2]=column_name
n2=n2+1
end if
next
n1 = n1 - 1
n2 = n2 - 1
if dw_datawindow.update(true,false)=1 then


for i=1 to n1
dw_datawindow.modify(tab1[i]+".update=no")
next
dw_datawindow.modify(key1+".key=no")

dw_datawindow.object.datawindow.table.updatetable=table2
for i=1 to n2

dw_datawindow.modify(tab2[i]+".update=yes")
next
dw_datawindow.modify(key2+".key=yes")

if dw_datawindow.update()=1 then
commit using sqlca;


for i=1 to n1
dw_datawindow.modify(tab1[i]+".update=yes")
next
dw_datawindow.modify(key1+".key=yes")
dw_datawindow.object.datawindow.table.updatetable=table1


for i=1 to n2
dw_datawindow.modify(tab2[i]+".update=no")
next
dw_datawindow.modify(key2+".key=no")




return 1
else
rollback using sqlca;
return -1
end if
else
rollback using sqlca;
return -1
end if

//and column_name<>key1


多表算法同上
xiaobzg 2003-02-12
  • 打赏
  • 举报
回复
多表更新的例子在很多网站上都有
xiangyiwei 2003-02-12
  • 打赏
  • 举报
回复
可以改的,你把鼠标移到数字上面,点一下再输入新的数值就可以了
其实多表更新我一直使用的是用dw更新其中一个table,再用sql语句更新另一个table
csg2000 2003-02-12
  • 打赏
  • 举报
回复
谢谢阿末,我也看见了TAB ORDER图标,就是好象只能显示,不能修改
Thomas_xufd 2003-02-12
  • 打赏
  • 举报
回复
呵呵,明白了,你不就是想更新一张表吗,只不过是有另一张表显示但不更新而已,简单,需要两步,其一,更改需要更新表的那些tab order,你在数据窗口对象的图标按钮上看看,有一个设置这些tab顺序的图标,我看了一下pb7,是图标中最后一个菜单图标,其二,更新菜单中rows->update properties,更新主键
csg2000 2003-02-12
  • 打赏
  • 举报
回复
我的问题没说清楚,我的两个表是这样的,其中一个表是固定信息,只需要
显示信息,另一个表需要编辑,可修改。我按书上关于多表更新的例子建立了数据窗口,问题是该数据窗口的字段无法进行编辑,我猜想是TAB ORDER的问题,请各位高手指教!
ice2water 2003-02-12
  • 打赏
  • 举报
回复
怎样实现数据窗口的多表更新?

例如:数据窗口数据源来自两个表,当修改该数据窗口数据项时,怎样做到两个table都能更新呢?数据窗口数据源来自两个或两个以上的表,相当于多个表连接建立的一个视图,对于这种数据窗口,PB默认是不能修改的。

当然我们可以通过设置它的Update 属性,数据窗口的Update Properties用来设置数据窗口是否可Update、可Update的表、可Update列等,但不能同时设置两个表可更新;所以当修改它的数据项时,不能简单地用dw_1.update()来更新table,我们可以在程序中设置数据窗口可更新的一个表A(及其可更新列),其他表为不可更新,更新完表A后,再设置另一表B为可更新,表A设置为不可更新,依次类推。

以PowerBuilder7自带的EAS Demo DB V3数据库为例:
1、新建一个数据窗口d_grid_dep_emp,它的Select语句为
SELECT department.dept_id,
department.dept_name,
employee.emp_id,
employee.emp_fname,
employee.emp_lname
FROM department, employee
WHERE employee.dept_id = department.dept_id
2、设置数据窗口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 THEN
COMMIT USING SQLCA;
dw_1.retrieve()
messagebox('提示信息','更新成功!')
ELSE
ROLLBACK 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'")
ELSE
ROLLBACK USING SQLCA;
MessageBox('提示信息', '更新失败!')
END IF
我们还可以将以上功能作成一个函数,在必要的时候调用即可。

数据窗口中列的edit属性为下拉数据窗口,请教如何取得该列的display data

dw_1.describe("evaluate('lookupdisplay(列名)',行号)")
or
string ls_data

ls_data=dw_1.describe.object.editname.text
ice2water 2003-02-12
  • 打赏
  • 举报
回复
在脚本中设置tab order的值
dw_1.SetTabOrder("cwzbljs", 10)
dw_1.Object.cwzbljs.Tabsequence = 10

611

社区成员

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

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