找回密码
 立即注册
搜索
楼主: lauzp

低手问题??请求援助!

[复制链接]

599

主题

1万

回帖

1万

积分

版主

积分
15875
发表于 2004-6-18 01:20:38 | 显示全部楼层
我手头上暂没有装PB, 建议你看一看数据窗口连动的例子。问题在第二个窗口没有更新,一种是传递的参数不对,一种可能性是script没有运行到。
回复

使用道具 举报

599

主题

1万

回帖

1万

积分

版主

积分
15875
发表于 2004-6-18 01:22:23 | 显示全部楼层
你可以单步调试一下,查看一下其中的变量,很容易发现问题在哪里。多学一点调试技巧也是很重要的。
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2004-6-19 01:32:26 | 显示全部楼层
恩,谢谢
我现在暂时用下面的参数用了,不知道有什么大的区别没有?
string ll_list
ll_list= dw_list.getrow()
dw_detail.scrolltorow(ll_list)
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2004-6-19 20:04:36 | 显示全部楼层
guodl大哥,救命阿!!

我想问一下如何把前一个窗口里得到的值或项,传递到下一个窗口,也能在下一个窗口中用呢??
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2004-6-19 20:54:48 | 显示全部楼层
guodl大哥,我真的很多都不懂,希望您可以不吝赐教呢,

我想用下拉数据窗口达成一种这样的功能,比方说,本窗口是dw_1,下拉数据是在d_2,我在dw_1中的一个下拉数据项中选择好d_2中的一项后,在dw_1中的几个下拉数据项都会同时变成相应的数据(即与d_2中对应的),不知道该怎么样子实现呢?....唉真头疼....

麻烦guodl大哥了

大恩不言谢了!
回复

使用道具 举报

599

主题

1万

回帖

1万

积分

版主

积分
15875
发表于 2004-6-19 22:18:53 | 显示全部楼层
呵呵,不用客气,希望能帮到你。

这个问题,实现起来需要用到一个函数ShareData().

PowerBuilder的数据窗口功能非常强大,共享数据窗口技术实现两个或者多个数据窗口中共享数据。从原理上讲,二者实际上所共享的是数据的缓冲区。

例如在Window对象上的两个数据窗口dw_2和dw_1,则可以用dw_1.ShareData(dw_2)实现二者的数据共 享,dw_1称为主数据窗口,而dw_2称为从数据窗口。
回复

使用道具 举报

599

主题

1万

回帖

1万

积分

版主

积分
15875
发表于 2004-6-19 22:24:17 | 显示全部楼层
找到一篇文章,希望对你有用:
http://www.cnread.net/cnread1/dnwl/cxsj/pb/syjq/002.htm

-----------------------------------------------
PowerBuilder共享数据窗口的应用

  与其它数据库前端工具相比,PowerBuilder显著的特点就是其数据窗口(DataWindow )技术,在编程方面有很强的技巧性。PowerBuild er为数据窗口提供丰富的函数,有些函数虽徊缓艹S?但在某些应用中恰当使用会收到很好的效果,本文所要讨论的数据窗口共享函数Sha reData()即为一例。使用共享数据窗口技术会减少编程工作量,在客户机/服务器模式下提高数据库的检索效率。
  首先我们应理解共享数据窗口的概念,共享数据窗口的实现非常简单,只需一条Shar eData()。例如在Window对象上的两个数据窗口d w—p和dw—s,则可以用dw—p.ShareDat a(dw—s)实现二者的数据共 享,dw—p称为主数据窗口,而dw—s称为从数据窗口。从原理上讲,二者实际上所共享的是数据的缓冲区。缓冲区中的数据首先要从数据库中检索(通过数据窗口Retrieve()函数),而数据库的检索是一种较为" 昂贵"的操作,它会加重数据库和网络传输的负荷。在共享数据窗口情况下,只有主数据窗口检索数据,而从数据窗口通过共享获得数据,无须再检索数据库,下面列举的共享数据窗口应用都是基于这一原理的。
  在下拉数据窗口中的应用
  下拉数据窗口(DropDownDatawindow)作为一种编辑风格在数据窗口中有着广泛的应用,如果将数据窗口字段的编辑网络设为下拉数据窗口,则执行数据窗口的Retrieve()函数时,如果其所包含的下拉数据窗口为空(RowCount()=0),则自动为所含下拉数据窗口检索数据。如果一个数据窗口中包含多个下拉数据窗口字段,则在其每次打开关闭时(如常用的查询界面),所包含的下拉数据窗口都重复检索数据库。
  考虑到包含下拉数据窗口的字段内容在一次应用中通常是不变的 ,所以多次检索数据库也是不必要的。这一问题可以通过共享数据窗口解决,具体做法是:先建立一个专用的窗口对象w—ddw完成预先检索任务,即在w—ddw上放置一个数据窗口dw—1,其字段为下拉数据窗口编辑风格,对应于后面用到的下拉数据窗口。w—ddw的open事件脚本 为:
  //w-ddw's open event
  dw—1.DataObject="dw—ddw"
  dw—1.Retrieve()
  其中dw—ddw是包含下拉数据窗口的数据窗口对象,这样为后面所要用到的下拉数据窗口检索到数据,后续的数据窗口包含下拉数据窗口时,下拉数据窗口可以共享这一检索结果而无须再对数据库检索。
  考虑到对象的通用性,将w—ddw设计为一个专用对象,在其窗口级设计了一个函数wf —ddw—load(dw—app,col—src,col—dst),用于实现某一数据窗口(dw—app)中某字段所对应的下拉数据窗口的共享 。
  //wf—ddw—load function
  DataWindowsChild dwc—src,dwc—dst
  dw—1.GetChild(col—src,dwc—src)
  dw—app.GetChild(col—dst,dwc—dst)
  if dwc—src.ShareData(dwc—dst)=-1 then
   MessageBox("错误","数据共享错误!")
  end if
  如果考虑到某一字段内容可能更新,再设计一个字段更新函数:
  wf—Update(col)
  //wf—Update()function
  DataWindowChild dwc
  dw—1.GetChild(col,dwc)
  dwc.SetTransObject(SQLCA)
  dwc.Retrieve()
  在应用的开始打开w—ddw,w—ddw设计为不可见的(Visible属性 为False),如果某一数据窗口(例如名为dw—app)中的下拉数据窗口共享w—ddw中的数据窗口数据,则可以在其所在的window的open事件编写脚本:
  //This's open event
  dw—app.SetTransObject(SQLCA)
  w—ddw.wf—ddw—load(dw—app,‘groups’,‘groups’)
  dw—app.Retrieve()
  由于下拉数据窗口通过共享已经装载数据,所以在以后的多次打开时,dw—app检索数据库时不会再为其检索,在应用的最后关闭w—dd w。
  在查询式数据窗口中的应用
  查询式数据窗口是一种非常有用的数据窗口模式(QueryMode),利用这一模式,可以以少量的代码实现高效的查询。
  将一个数据窗口设置为查询模式,只需一条代码:
  dw.Modify("DataWindow.QueryMode=yes")
  如果一个数据窗口被设置为查询模式,则在其数据字段内输入的内容将成为查询条件,例如一个字段对应的表的列名分别为id和salar y,在id列输入">5",在salary列输入">3 00",当数据窗口进行Retriev e()时,发向数据库的SQL语句将成为:
  SELECT id,salary...FROM emp WHERE id>5 and salary>300
  现在的问题是:符合上述条件的查询结果又在同一数据窗口显示, 不能为最终用户使用,解决这一问题的方法就是建立两个数据窗口,一个用于输入组合条件,另一个(dw—2) 用于显示查询结果,只需一条语句即可:
  dw—1.ShareData(dw—2)
  如果再增加一些功能,许多复杂的组合式查询即可用这一简单的方法实现。
  在数据窗口打印中的应用
  数据窗口最简单的打印方法为:dw.print(),但是在实际应用中, 屏幕上用于显示的数据窗口通常与打印要求的格式不同,如有两个数据窗口,dw—1(用于显示)和dw—2(用于打印),使用数据窗口共享技术可以很简单地解决问题,否则就必须对dw—2进行数据库检索。
  更复杂的情况是,一个屏幕本身就由两个数据窗口组成,例如dw— 1用于选择公司的某个部门,dw—2用于显示所选定部门的人员,如果要打印当前某一部门的查询结果,应如何处理呢?
  PowerBuilder中的合成式数据窗口(Composite)是处理多数据窗口的有力工具,可以设计一个合成数据窗口dw—prt用于打印。dw—pr t所含两个数据窗口与dw—1和dw—2兼容。如果采用数据共享方法,dw —prt就不用执行带参数的Retrieve(parm),可以直接打印当前查询结果。下面说明具体的实现方法。
  要实现数据共享,就必须能够引用合成数据窗口中所包含的两个数据窗口的名字,在数据窗口画板上双击内含Report对象,在出现的Re port Name中输入名字,假设分别为rpt —1和rpt—2,定义一个用户事 件ue—print,当触该事件时执行下列脚本:
  //ue—print
  //dw—1 contains department and dw—2 contains emp
  DatawindowChild dwc—1,dwc—2
  dw—prt.SetTransObject(SQLCA)
  dw—prt.GetChild("rpt—1",dwc—1)
  dw—prt.GetChild("rpt—2",dwc—2)
  dw—1.ShareData(dwc—1)
  dw—2.ShareData(dwc—2)
  dw—prt.Print()
  在图形显示中的应用
  实际应用中为更直观表示数据的分布情况,经常同时使用数据窗口的列表形式和图形显示,例如一个屏幕中上面的数据窗口dw—1以列表形式表示数据,下面的数据窗口dw—g是dw—1的图形显示,如果脚本中包含:
  dw—1.Sharedata(dw—g)
  则每当修改dw—1中的数据时,dw—g所显示的图形马上变化,这种方法明显要比执行dw—1.Update()后再执行dw—g.Retrieve()要简捷 和快速。
  综上所述,虽然数据窗口的共享技术只需ShareData()一条语句, 在某些情况下可使项目开发更迅速更可靠。以上只是作者在实际项目开发中总结的一般经验,仅供参考。

  国家通信软件工程研究中心 (050081) 戴珂
《计算机世界报》98年第8期
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2004-6-21 01:39:11 | 显示全部楼层
learning.....

先谢了!
回复

使用道具 举报

2

主题

12

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2004-6-22 21:29:49 | 显示全部楼层
guodl大哥,小弟不才,又有问题要请教了...

我在一个窗口w_1中有dw_1的数据窗口,其中数据是来自表b_1的khid,khmc,khdz...等等,
我想设置N个变量,例如b_khid,b_khmc,b_khdz...,
然后给b_khid,b_khmc..等等赋给在数据窗口被选择的项的khid,khmc..的值,
我想这个可能是比较简单,但是我找了良久,也没发现完成这个操作的函数及用法,请帮帮我...!!!
回复

使用道具 举报

599

主题

1万

回帖

1万

积分

版主

积分
15875
发表于 2004-6-23 00:19:59 | 显示全部楼层
用GetItem* 一系列的函数, 来查询DataWindow中的值。 这些函数有:

GetItemDate()
GetItemDataTime()
GetItemDecimal()
GetItemNumber()
GetItemString()
GetItemTime()

等等。具体的函数参数,我记不清了,查一下帮助,我印象中是GetItemString(行号,"字段名") ,例如:


string b_khmc
b_khmc= dw_1.GetItemString(row,"khmc")
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|海浩社区

GMT+8, 2025-9-22 00:06 , Processed in 0.102636 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表