如何让Tab各选项卡同步到同一条数据?

cashiba 2015-12-15 12:38:07
引用
PB中协调多数据窗口数据操纵的一种解决方法

1、问题的提出
数据窗口是Power Builder中检索、表现和操纵数据的对象。如果一个数据表的列不多,用单数据窗口操纵数据很易实现,但在实际应用中,数据表的列数动辄几十,甚至上百也并不少见,这时用单数据窗口滚动显然不方便,一个自然的想法是采用TAB控件和TAB页,在每个TAB页上放置一个数据窗口控件,每个数据窗口控件分门别类操纵数据表的列,但随之而来的问题是如何协调分布在这些数据窗口中录入或修改数据的存储,针对每个数据窗口发布一个UPDATE()函数的调用不可行。我们在实际开发中经过探索,增加一个后台的数据窗口做中介,解决了多数据窗口操纵数据的问题。

2、协调多数据窗口数据操纵的一种解决方法
基本思路是:在进行数据操纵的数据窗口控件之外,另外放置一个数据窗口控件,设置其不可见,并设其数据窗口对象为一个选择了数据表中所有列的数据窗口,其他数据窗口控件中录入或修改的数据实时地传送过来,对该控件的数据进行更新操作即可。
不失一般性,下面以POWERBUILDER自带数据库psDemoDB.db中的customer表的数据录入为例来说明。
Customer表有"id","fname","lname","address","city","state","zip","phone","company"九个列,其中"id"为integer类型,其余均为char类型。
(1)创建数据窗口
建立三个数据窗口d_1、d_2、d_3,数据窗口d_1选"id","fname","lname"三列,d_2中选"address","city","state"三列,d_3选"zip",""phone","company_name"三列。再建立数据窗口d_4,选中数据表中的所有列。
(2)建TAB控件和TAB页
建立一个TAB控件tab_1,建立三个TAB页tabpage_1、tabpage_2、tabpage_3。
(3)建数据窗口控件
在(2)中建的三个TAB页中分别放置dw_1、dw_2、dw_3三个数据窗口控件,设其数据窗口对象分别为d_1、d_2、d_3。
另外,在窗口中放置一个数据窗口控件dw_4,不选其"visible"属性.
(4)编写代码
在tabb1.tab_page_1.dw_1的editchanged事件中编写代码如下:
//代码由此开始
//设置变量,id_value存放数据表中id列的值
int i_m,i_n,id_value
string str_fname,str_lname
//取dw_1当前的行数
i_m=tab_1.tabpage_1.dw_1.getrow()
//取dw_4当前的行数
i_n=dw_4.getrow()

//tab_1.tabpage_1.dw_1及dw_4接收浮在数据窗口控件表面的数据
tab_1.tabpage_1.dw_1.accepttext()
dw_4.accepttext()

//取dw_1中的"id"列的值给变量id_value
id_value=tab_1.tabpage_1.dw_1.getitemnumber(i_m,"id")
//将变量id_value的值赋给dw_4中"id"列
dw_4.setitem(i_n,"id",id_value)

//取dw_1中的"fname"列的值给变量str_fname
str_fname=tab_1.tabpage_1.dw_1.getitemstring(i_m,"fname")
//将变量str_fname的值赋给dw_4中"fname"列
dw_4.setitem(i_n,"fname",str_fname)

//取dw_1中的"lname"列的值给变量str_lname
str_lname=tab_1.tabpage_1.dw_1.getitemstring(i_m,"lname")
//将变量str_lname的值赋给dw_4中"lname"列
dw_4.setitem(i_n,"lname",str_lname)
//代码到此结束

tab1.tab_page_2.dw_2、tab1.tab_page_3.dw_3的editchanged事件代码可比照tab1.tab_page_1.dw_1的editchanged事件代码编写,从略。
程序在PB65和PB7中调试通过,程序运行时,无论新增数据,还是对dw_1、dw_2、dw_3中的数据列进行修改,数据都实时地传送给dw_4,只需对dw_4进行保存或更新操作,从而解决了多数据窗口数据操纵的协调问题

如上文章中的,Customer表中的9个字段"id","fname","lname","address","city","state","zip","phone","company",分割为三部分在Tab的三个选项卡的数据窗口中分别显示。看起来似乎很简单,但是写得不是很详尽,在实际操作中,三个选项卡中的数据窗口无法同步同时的显示一条数据,新增和修改数据也总是不同步,比喻tabpage1显示第9条数据的第一部分字段时候,切换到tabpage2、tabpage3无法同步同时显示第9条数据的其余字段内容。这个问题困扰好久了....希望大侠们有空指点一二....
...全文
1613 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyangziwo 2015-12-21
  • 打赏
  • 举报
回复
多个dw,使用同一个sql语句,肯定能满足上边的三个条件的
cashiba 2015-12-18
  • 打赏
  • 举报
回复
引用 7 楼 lzp_lrp 的回复:
另外注意,用sharedata的话,要求datasource里的列是一样
谢谢版主老师关注! 看了一下ShareData函数的语法: dwprimary.ShareData(dwsecondary) 其中,dwprimary是指主数据窗口控件名,dwsecondary是指从数据窗口控件名。 该函数的返回值是Integer类型。函数成功执行时返回1,发生错误时寒暑假返回-1. 实现数据共享的3个条件如下:   1、选择字段的数目相同;   2、选择字段的数据类型相同;   3、选择字段的排列顺序相同; 有点没理解。按上面说的的3个条件,后面两个还好理解。第一条,选择字段的数目相同? 如果隐藏的主数据窗口dw_data为全部字段(数目为10),而Tab选项卡里的各从数据窗口的字段只是其中部分(数目为3--4个).... 没明白.... 另外,顶楼引用的论文里的例子也是借助一个隐藏数据窗口,好像不是通过sharedata方法。可惜代码写得太少,俺这只知点皮毛的愣是没复制出该实例。 再次谢谢版主老师百忙中来此指点小白...
WorldMobile 2015-12-16
  • 打赏
  • 举报
回复
另外注意,用sharedata的话,要求datasource里的列是一样
WorldMobile 2015-12-16
  • 打赏
  • 举报
回复
引用 5 楼 cashiba 的回复:
[quote=引用 4 楼 wag_enu 的回复:] 这么复杂,用Hsplitscroll 属性不行哇?
谢谢wag_enu 老师!主要是想用来录入数据和查看数据,数据窗口都是freedom样式,字段比较多(20多项),而且有不少字段是用来录入大段文本之类的,用一个数据窗口界面的话不方便。所以考虑用Tab,借此也可以熟悉一下PB的Tab用法.... 感觉Hsplitscroll好像更适合grid或tabular样式的数据窗口吧? 第一次特意看了下Hsplitscroll属性,以前看的时候不太了解其作用,果然跟老师们学习能开阔思路和视野阿[/quote] 还按你原来的思路,在后台放一个隐藏的数据窗口dw_data,但其它数据窗口都共享(sharedata)这个数据窗口,这样的话,就不需要写同步之类的代码了,编辑所有tab页上的数据窗口,都会自动写到dw_data中,你只需要更新这个dw_data即可,但每个tab页里数据窗口的显示行还是需要你控制的,否则也会出现你说的那个问题,显示的不是同一条数据
cashiba 2015-12-15
  • 打赏
  • 举报
回复
简化: 假如数据库字段为ID,F1,F2,F3,F4,F5,F6,F7,F8,F9。其中ID为自增、主键。 将数据库所有字段分成三部分:a(ID、F1、F2),b(F3、F4、F5),c(F6、F7、F8、F9) 对应的dataobject 分别为do_a,do_b,do_c 对应的datawindow分别为dw_a,dw_b,dw_c 分别嵌入Tab的tabpage1,tabpage2,tabpage3中。 另外所有字段对应do_all,dw_all。 数据库中已经预先添加3条数据。 然后希望能实现: 1、新增数据:点“增加”按钮,在tabpage1的数据录入界面ID自增为4,F1、F2为空白行等待录入数据;录入数据后,点“保存”或“更新”按钮,将新增ID、F1、F2内容保存到第4条数据。然后切换到tabpage2,tabpage3时,也是同样新增第4条待录入数据状态,录入数据后点“保存”或“更新”按钮,录入的字段数据依次保存到第4条数据。 2、查看数据:点“首条”“下一条”“上一条”“末条”等能切换自如,各选项卡同步显示的是同一条数据的不同部分。 即想达到如同在一个界面窗口操作数据一样的效果。 现在最大的问题是各选项卡不同步,按主贴中文章所介绍的方法能录入数据,但是总是难以同步。希望老师们空的话点拨一二.....不甚感谢
cashiba 2015-12-15
  • 打赏
  • 举报
回复
谢谢宋老师关注本问题..... 我是想做一个数据录入及显示界面,因为数据库字段比较多,全部做在一个界面上比较拥挤还要借助滚动条,很不方便,所以想通过Tab把全部字段分割成几个字段组合分批到各选项卡中。每个选项卡显示数据不难,但是要想下图的各功能按钮能正常运行,需要各选项卡在切换时能同步显示同一条数据(的不同部分)。问题就在于新增录入数据或点击上一条下一条时,各选项卡的内容不能同步,显示的不是同一条数据。不知用sharedata怎么能实现同步
xiaozhe_song 2015-12-15
  • 打赏
  • 举报
回复
sharedata~
cashiba 2015-12-15
  • 打赏
  • 举报
回复
引用 4 楼 wag_enu 的回复:
这么复杂,用Hsplitscroll 属性不行哇?
谢谢wag_enu 老师!主要是想用来录入数据和查看数据,数据窗口都是freedom样式,字段比较多(20多项),而且有不少字段是用来录入大段文本之类的,用一个数据窗口界面的话不方便。所以考虑用Tab,借此也可以熟悉一下PB的Tab用法.... 感觉Hsplitscroll好像更适合grid或tabular样式的数据窗口吧? 第一次特意看了下Hsplitscroll属性,以前看的时候不太了解其作用,果然跟老师们学习能开阔思路和视野阿
wag_enu 2015-12-15
  • 打赏
  • 举报
回复
这么复杂,用Hsplitscroll 属性不行哇?

609

社区成员

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

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