newease 发表于 2009-8-13 09:57:18

数据窗口间的数据传送方法

本例主要介绍了在2个数据窗口间拷贝数据的几种方法,并在速度上进行了比较
用RowsCopy函数
PowerBuilder提供了一组在同一数据窗口内或2个数据窗口间传送数据
的函数,但只有在接收和源DataWindow的列完全匹配时,才能对行
操作,这些函数有RowsCopy,RowsMove,RowsDiscard(本例只使用了
Rowscopy),它们的语法如下: dwcontrol.RowsCopy ( startrow, endrow, copybuffer, targetdw, beforerow,
                                              targetbuffer )dwcontrol.RowsMove ( startrow, endrow, movebuffer, targetdw, beforerow,
                                    targetbuffer)dwcontrol.RowsDiscard ( startrow, endrow, buffer ) 我们不难理解它们的含义。例如dw_source.RowsCopy(1, il_Rows, Primary!, dw_dest, 1, Primary!)是
把dw_source数据窗口的数据拷贝到dw_dest数据窗口。
我们只要注意:如果是在2个不同数据窗口 上Copy或Move,目的数
据窗口上的行的状态为NewModified!但如果是在同一数据窗口的不同
缓冲区进行Move,PowerBuilder保存数据行的来源以及它们被改变的
状态,例如:如果从Primary!缓冲区把一些没有修改过的行Move
到delete!缓冲区,它们的状态标志为Delete!,然后如果又Move回Primary!缓冲区,则它们的状态又为NotModified! 当使用RwsMove时,它不会
象InsertRow函数一样,目的数据窗口内的DDDW进行自动检索,而必
须明确地对目的 数据窗口内的DDDW检索。 RowsCopy函数主要用于:
1.根据已有数据,生成新的数据行
2.通过拷贝选定数据行到一个临时数据窗口,然后打印这个临时数据窗口来打印所选行 RowsMove函数主要用于:
1.直接从Primary缓冲区中移出几行到delete缓冲区,而不必每次删除一行
2.从delete缓冲区移动数据行到Primary缓冲区来实现Undo功能

用GetItem...系列函数与SetItem函数
GetItem系列函数用来获取数据窗口控件的指定缓冲区中相应数据类
型的数据,所获取的数据可以是原始缓冲区的,也可以是Primary,
delete或filter缓冲区的当前值,该系列的函数包括有:
GetItemDate
GetItemDateTime
GetItemNumber
GetItemDecimal
GetItemString
它们的语法为dwcontrol.GetItem...( row, column {,燿wbuffer, originalvalue})
其中OriginalValue取值为TRUE和FALSE,为TRUE时,取原始值,
FALSE时,取当前值。
      column:可以是列名,也可以是列号 SetItem函数用来设置指定行列的数据 从上面的分析,我们就可以看出,使用这两个函数很不直观,取数
据时,我们必须根据列的类型来使用不同的 函数,这与面向对象编
程有点不符。不过现在可以直接使用点方法来访问数据,语法为:

dwcontrol.Object.Data.Buffer.WhichValue
dwcontrol.Object.Column.Buffer.WhichValue
其中RowRange可以是一个范围或Selected 例如:要取dw_1第2行的“salary”列的值,可以是这样:
dw_1.Object.salary.primary.original [ 2 ]或
dw_1.GetItemNumber(2,"salary",Primary!,True)

又如在本例的cb_getitem按钮脚本的
li_Data = dw_source.GetItemNumber(ll_Cnt, "line_id")
dw_dest.SetItem(ll_Cnt, "line_id", li_Data)
我们可以改用:
li_data=dw_source.object.line_id
dw_dest.object.line_id.=li_data 在本例的“结构数组”和“直接赋值”其实就是这种方法。
用SaveAs和剪切板
用剪切板来传递数据,不管它额速度和占用内存的情况如何,我都认
为不是一个好主意,当然SaveAs的存在也 有它的理由,但我认为,
这应该不在DataWindow间传送数据,SaveAs有它的长处,可以用各种
格式来保存数据 ,对DataWindow它的语法为:
dwcontrol.SaveAs ( { filename, saveastype, colheading } )
其中saveastype可以为: Clipboard!Save to the clipboard
CSV!Comma-separated values
dBASE2! dBASE-II format
dBASE3! dBASE-III format   
DIF! Data Interchange Format
Excel! Microsoft Excel format
HTMLTable! Text with HTML formatting that approximates the DataWindow layout
PSReport! Powersoft Report (PSR) format
SQLInsert!SQL syntax
SYLK! Microsoft Multiplan format
Text!(Default) Tab-separated columns with a return at the end of each row
WKS! Lotus 1-2-3 format
WK1! Lotus 1-2-3 format
WMF! Windows Metafile format
下面是本例各种方法的运行时间统计   SetRedraw(False) SetRedraw(True)
GetItem/SetItem 2.417 4.504
剪切板0.851 0.961
结构数组 0.193 0.22
直接引用 0.069 0.082
用RowsCopy 0.041 0.151
 
页: [1]
查看完整版本: 数据窗口间的数据传送方法

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com