荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: xxv (最喜欢TV), 信区: Database
标  题: GRAPH在PowerBuilder中的应用
发信站: 荔园晨风BBS站 (Thu Sep 19 10:32:39 2002), 转信

在使用PowerBuilder时,有时会用到GRAPH。它作为一种输出工具 ,直观地显示用户想要看到
的数据及数据间的关系(我们一般不通过它进行数据输入)。可以有两种方法将GR
APH放入用户界面。其一是通过数据窗,使GRAPH成为数据窗口的一部分,或本身即为数据窗。
这种方法常常是从数据库获取数据,具有易于操作、易于实现等优点。其二是把GRA
PH作为控件放进某一窗口或用户对象中,这种方法一般是从内存或外部文件中获取数据。实
际应用中常使用第一种方法。但是 ,对于第一种方法,在创建GRAPH数据窗时,若选择的
GRAPH TYPE是LINE
类型时,则可能会出现一些问题。LINE类型的GRAPH是用来表示离散数据的,它可以将相邻的
离散值用直线连接起来。但是,当一个GRAPH包含两个或两个以上的序列(SERIES)时,可能会
在运行结果图上看到一些序列断点。如下图所示:图1

  上图中,序列A在横坐标为2时是一个断点,序列B在横坐标为5时是一个断点。同时,我们
注意到,横坐标的间隔点值分别为1、2、4、5、
7、8、9、10。数值相差并不均匀,但在坐标轴上却均匀间隔,这使得我们看到的图形并不能
反映真实情况。为什么出现这种情况呢?这是因为:PowerBuilder按CA值从小到大顺序自动从
数据库中取点连线。它并不考虑这些点横坐标的意义,所以只按所取点的不同横坐标数均匀
分割横坐标轴。在
这种情况下,GRAPH只能取确实存在于数据库中的数据。对于序列A,数据库中不存在CA为4的
记录;对于序列B,数据库中不存在CA为7的记录。PowerBuilder取点连线时,以一个指针(假定
为P )记录当前CA值,以另一个指针(假定为Q)记录其前一个CA值。当P值为
4时,只取到B序列的一个点(B,4,13),因此时Q值为2,故与B序列中CA为 2的点(B,2,10)相连,
A序列中CA为2的点(A,2,5)此时没有与之相连的点。然后P指针前移,指向A值为5,Q指针前移
,指向CA值为4。此时取到两点(A,5,14)、(B,5,11)。但因Q值为4,所以(B,5,11)与B序列CA值
为 4折点 (B
,4,13)相连,而(A,5,14)却无A序列CA值为4的点相连,故不 连。然后P、Q指针再次后移。这
样就造成点(A,2,5)被跳过,成为A序列的断点。同理,B序列在(B,5,11)处也是断点。如何解
决这些问题呢
?我们不能离开原始数据本身去修改运算结果,即不能在GRAPH上直接修改,而应考虑数据源。
因为在只做查询时,数据库中数据一般不能修改,一种办法是将欲显示的数据从数据库中读出
,经过处理后放入某一外部文件,然后令GRAPH从该文件读取数据,形成显示结果图。这就要结
合上面所述的使
用GRAPH的第二种方法:将GRAPH作为控件放入某一窗口中。下面举例说明其实现方法:在某一
窗口如W—GRAPH中放入一 个GRAPH控件(GR—1),在该控件的CONSTRUCTOR脚本中加入以下
SCRIPT 语句:

  li—FileNum
  long ff
  string str
  li—FileNum= fileopen ("c:\try.txt", LineMode!,WRITE!,Lo ckWrite!,REPLACE !)

  fileseek(li—FileNum,0,FromBeginning!)
  for i=1 to seriescount
  //seriescount为图中序列个数,各序列名称在series[ ]中
  for j=1 to categorycount

  /*categorycount为横坐标的坐标点数。由要显示的数据CA值范围及相邻CA值的最小间
隔长度决定。例如:要显示的数据CA值在1到10 的范围内,若不同CA值最小相隔为0.5,则此时
categorycount值为20, 横坐标值为0.5,1,1.5,2……;若不同CA值最小相隔为1,则此时
catego
rycount值为10,横坐标值为1,2,3……。各横坐标值在category[]中 */

  VARCA=0
  SELECT CA
  INTO:VARCA
  FROM QUERYDB
  WHERE ABS(QUERYDB.CA-:CATEGORY[J])<=1E-6:
  if VARCA=0 and j>1 then

  /*插补的CA值原数据库中不存在,对应VA值要进行修正。方法是找出当前CA值(CATE
GORY[J])其前最临近的一个(第M个)、数据库中 存在的CA值对应的VA值(PVA)、其后最临近
的一个(第N个)、数据库中存在的CA值对应的VA值(SVA),取(SVA-PVA)*(J-M)/(N-M)作为当前
VA
值。赋予VALUE[1,J]*/

  修正
   //程序略
  end if
  ** str=series[i]+" "+category[j]+" "+value[i,j]
  filewrite(li—FileNum,str)
  next
  next
  ff=FileLength("c:\TRY.txt")
  gr_1.importfile("c:\TRY.txt",1,ff)
  //程序结束

  在**行,series[i]中存放当前序列名称,如"A"、"B"、"C"等(i=1 ,2……);category
[j]中存放当前横坐标分隔点 名称,如"1"、"2"、 "3"、"4"等(j=1,2……)。value[i,j] 中
存放对应于当前序列及横坐标的相应纵坐标值。双引号中不是空格,而是TAB键,如果键入的
是空
格,则代表换行,TAB键则表示在本行中空一个字符。
  这样在W_GRAPH窗口打开后,该图形将有如下显示形式,而不存在断点问题:图2
 --   ftp://192.168.36.6:66   ftp://multimedia:multimedia@192.168.36.6:66   DivX

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.6]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店