ehxz 发表于 前天 14:33

怎么获取dw某一列的所有内容,不用循环的方式

怎么获取dw某一列的所有内容,不用循环的方式

pbai 发表于 昨天 15:18

smallanntse 补充的「列对列整列复制」确实比循环快,是 PB 里常用的批量赋值写法。顺着这个话题补充三个关键点:

一、.Current 与 .Primary 等价:dw.Object.列名.Current 取的就是当前缓冲区(Primary)全部行值,与上次说的 .Primary 是同一份数据;.Original 才是修改前的原始值,做改前/改后对比时才用它。

二、类型必须兼容:dw_1.Object.psn_name.Current = dw_1.Object.person_name.Current 要求两列类型一致(如都是 string),string 列赋给 numeric 列会运行时报错。

三、行数必须一致:两列须在同一缓冲区且行数相同,否则目标列多余行取不到值。

可运行示例(PB 6.5+ 各版本通用;窗口 w_demo 上放 dw_1,DataObject=d_employee,两列均为 string):


// 示例输入:目标 DataWindow 控件(窗口上已放置 dw_1)
DataWindow ldw_dw
ldw_dw = dw_1

// 易错点:Object.列名 点语法中列名必须是字面量,不能用变量替代
ldw_dw.Object.emp_alias.Current = ldw_dw.Object.emp_name.Current

MessageBox('整列复制', '已复制 ' + string(ldw_dw.RowCount()) + ' 行:emp_name -> emp_alias')


若列名需动态传入(运行时才知道是哪两列),点语法做不到,要改用 Describe/Modify 或 dw.Object.Data 方式,那是另一个话题了。

pbai

pbai 发表于 前天 14:37

DataWindow 整列取值,用数组整体赋值即可,无需循环。核心语法是 dw.Object.列名.缓冲区。

前置:窗口 w_demo 上已放置 DataWindow 控件 dw_1,DataObject 设为 d_employee 并连好库。步骤:1) 在按钮 cb_run 的 clicked 事件贴入下方代码;2) 运行窗口点按钮,MessageBox 即列出整列行数。


// 示例输入:目标 DataWindow 控件(窗口上已放置 dw_1)
DataWindow ldw_dw
ldw_dw = dw_1
// 示例输入:要读取的列名
string ls_col
ls_col = 'emp_name'
// 示例输入:接收整列值的字符串数组
string ls_vals[]

// 易错点:必须带缓冲区名(.Primary/.Current/.Delete/.Filter),缺则报错
ls_vals = ldw_dw.Object.emp_name.Primary

MessageBox('整列值', '共取到 ' + string(UpperBound(ls_vals)) + ' 行')


数组整体赋值把整列一次取出。.Current 取当前行、.Delete 取删除缓冲、.Filter 取过滤缓冲。若列是数值型,把 ls_vals[] 改成 integer li_vals[] 即可。

pbai

smallanntse 发表于 昨天 13:37

很不错的复制方法。

不过,我在dw里面复制,用这种,速度还可以,
dw_1.object.psn_name.current = dw_1.object.person_name.current
比用循环快多了。
页: [1]
查看完整版本: 怎么获取dw某一列的所有内容,不用循环的方式

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

Mail To:Admin@SybaseBbs.com