多表更新问题!

cndfriend 2002-11-28 10:47:12
小弟用了三个表(表1,表2,表3),表2和表3关联且数据结构一样。
现在一个窗体中放二个dw,dw1中(表1,表2),dw2中(表3),在dw1中插入数据的同时,同时更新这三表,如何解决!
...全文
73 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengzeng 2002-12-09
  • 打赏
  • 举报
回复
无语!!!!
2002dandelion 2002-12-06
  • 打赏
  • 举报
回复
我也是刚做了一个多表更新的函数,不过大致的思想是一样的,对于ice2water(大冰) 发的东西,只能用来更新两个表,即一个数据窗口中有两个表,并且要求要更新的表必须只一个主键,这样会很局限,不太好!
在你做的时候,请注意如下几点:
1.数据窗口的数据源尽量采用SQL Select来做
2.做一个这样的函数,只有两个参数,一个为datawindow dw,一个表string table;这样你的表就不再受限制,这个方法对于更新任何一个数据窗口都可以,可扩展性强
---------努边学习,活着真好--------2002dandelion@163.com
lsycat 2002-11-29
  • 打赏
  • 举报
回复
学习
sinkiangscorpio 2002-11-29
  • 打赏
  • 举报
回复
比较精彩,呵呵
_______________________________________________________________
* *%%* *
///|\\\
/// \\\\
天下美女我尽爱
_ _ \\\
@ @ \\\\
莫待花落空自叹
\\\\ ///~
︶ \\\\//~ zhugejunshi于2002年12月24日题词
_______________________________________________________________
balloonman2002 2002-11-28
  • 打赏
  • 举报
回复
同意楼上两位,:)
ice2water 2002-11-28
  • 打赏
  • 举报
回复
实现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

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

(作者:宋铭 2000年03月16日 16:16)
booksfount 2002-11-28
  • 打赏
  • 举报
回复
这是我从帮助中copy的,如下的方法就是更新多表,详细请查modify,看它的例子即可!
integer rc

string err

/* The SELECT statement for the DataWindow is:

SELECT department.dept_id, department.dept_name,

employee.emp_id, employee.emp_fname,

employee.emp_lname FROM department, employee ;

*/

// Update department, as set up in the DW painter

rc = dw_1.Update(TRUE, FALSE)

IF rc = 1 THEN
//Turn off update for department columns.
dw_1.Modify("department_dept_name.Update = No")
dw_1.Modify("department_dept_id.Update = No")
dw_1.Modify("department_dept_id.Key = No")
// Make employee table updatable.
dw_1.Modify( &
"DataWindow.Table.UpdateTable = ~"employee~"")
//Turn on update for desired employee columns.
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")
//Then update the employee table.
rc = dw_1.Update()
IF rc = 1 THEN
COMMIT USING SQLCA;
ELSE
ROLLBACK USING SQLCA;
MessageBox("Status", &
+ "Update of employee table failed. " &
+ "Rolling back all changes.")
END IF

ELSE
ROLLBACK USING SQLCA;
MessageBox("Status", &
+ "Update of department table failed. " &
+ "Rolling back changes to department.")

END IF

源码下载地址: https://pan.quark.cn/s/572a538835a2 ### 关于VOC2012训练数据集的说明 #### 1. 数据集的基本介绍 VOC2012(Visual Object Classes 2012)是Pascal VOC挑战赛中的一个重要组成部分,该挑战赛被视为一种广泛应用的图像识别和物体检测基准数据集。VOC2012主要应用于衡量计算机视觉算法在对象分类、定位以及检测任务上的表现水平。它包含了大量经过标注的图像,这些图像涉及多个不同的类别,并且图像中的每一个对象都经过了细致的标记处理。 #### 2. 数据集的主要特性 - **丰富性**:VOC2012数据集收集了20个不同的类别,涵盖了诸如汽车、自行车、鸟类、猫科动物、椅子等常见的物体。 - **容量**:该数据集总共包含了约5000张用于训练的图像和约5000张用于验证的图像。 - **详细标注**:每张图像中的对象都经过了详尽的标注,包括对象的边界框和类别标识。 - **普遍适用性**:VOC2012被普遍应用于学术研究和工业应用中,作为衡量各种计算机视觉技术的标准参照之一。 #### 3. 数据集的组成成分 VOC2012数据集主要可以划分为以下几个部分: - **训练部分**:包括约2500张用于模型训练的图像。 - **验证部分**:包括约2500张用于调整模型参数的图像。 - **测试部分**:包括约4952张用于最终评估模型性能的图像。 - **标注文件**:每个图像都配备有一个XML文件,其中记录了图像中对象的位置信息和类别标签。 #### 4. 数据集的获取途径及使用方法 根据提供的信息,VOC2012训练数据集可以通过以下链接进行获取: - **获取...
已经博主授权,源码转载自 https://pan.quark.cn/s/0b6e0560b339 在信息技术领域中,网络设备的配置与管理构成了核心环节,特别是对于企业级网络架构而言。华为作为全球领先的网络设备生产商,其产品被广泛部署于不同规模的网络系统中。本篇将重点阐述如何借助ENSPLite(简称ENSP)对华为交换机实施配置与维护,以及设备包数据导入的操作方法。 ENSP的完整名称为Enterprise Network Simulation Platform Lite,这是一款由华为研发的网络仿真工具,它支持用户在虚拟场景下对网络设备,如路由器、交换机等进行模拟与测试。这种功能为学习华为网络技术、执行设备配置以及诊断故障提供了极大的支持。 我们接下来分析“导入设备包”的含义。在ENSP平台上,设备包是指包含特定华为设备型号及软件版本的资料文件,通过导入这些资料文件,用户能够在虚拟环境中构建出与真实设备高度相似的仿真模型,从而进行配置操作和实验验证。举例来说,“CE.rar”极有可能是一款华为CE系列交换机的设备包,CE系列是华为推出的面向企业应用的核心交换机,具备优异的性能表现和极高的可靠性,常被应用于数据中心及大型企业网络环境中。 设备包导入的操作流程如下: 1. **获取设备包**:用户需要从华为的官方网站或相关的技术支持社区获取对应型号的设备包,例如“CE.rar”。 2. **部署ENSP**:保证已安装最新版本的ENSP软件,并启动该程序。初次使用时,可能需要完成一些基础设定,比如设定工作路径等。 3. **执行设备包导入**:在ENSP的操作界面中,选择“文件”选项卡,随后点击“导入”功能,定位到已下载的“CE.rar”文件,并依照指引完成导入动作。此步骤...

754

社区成员

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

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