怎么获取dw某一列的所有内容,不用循环的方式
怎么获取dw某一列的所有内容,不用循环的方式 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 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 很不错的复制方法。
不过,我在dw里面复制,用这种,速度还可以,
dw_1.object.psn_name.current = dw_1.object.person_name.current
比用循环快多了。
页:
[1]