当前位置: 代码迷 >> PB >> 怎么快速将DW中某列的所有数据写入到数组中
  详细解决方案

怎么快速将DW中某列的所有数据写入到数组中

热度:189   发布时间:2016-04-29 09:23:37.0
如何快速将DW中某列的所有数据写入到数组中
使用for循环一个个getitem明显太慢
在确定列名的情况下,可以用以下方法快速地取值
la_tmp=dw.object.colname[1,rowcnt]
但如果列名是变量,应该如何处理?
使用以下方法得到的结果是个2维数组
la_tmp=dw.object.data[1,colid,rowcnt,colid]
并且行是第一维度列是第二维度,所以无法用下面的语句将其转到一维数组中
la_tmp1=la_tmp[1]

请问有什么好的方法可以快速取值

------解决方案--------------------
你想偏了,点操作符肯定不好用变量的。但是可以用列号啊!!一个数据窗口能有多少行?常见的三四十行就挺多了吧?你写个函数,先判断当前列的列号,然后把当前数据窗口和当前列的列列号传进去choose case就行了。简单写下,例如数据窗口是adw_data,行号为ai_col
string ls_coldata[]
choose case ai_col
case 1
 ls_coldata[] = adw_data.object.#1.current
case 2
 ls_coldata[] = adw_data.object.#2.current
case 3
 ls_coldata[] = adw_data.object.#3.current
...........
具体就不写了哈,老兄裤衩那么多,也不用我费劲了。:) 当然这个方法看着有点笨,但是如果你经常需要取整列的数据的话,写这么个函数还是值得的。
------解决方案--------------------
没仔细看问题,晕

既然知道了.语法,可考虑把每个列的情况都写出来
choose case 列名
case 列名1
la_tmp1=dw.object.列名1.current
case 列名2
la_tmp1=dw.object.列名2.current
case 
……
end choose
如果是想做个通用的控件,传入数据窗口,也就是设计时不知道数据窗口对象有哪些列可以考虑动态增加一个计算域,这个列的名字是你自己定义的,计算列的表达式就是那个列名
然后用
la_tmp1=dw.object.计算域名.current
裤衩那么多,modify create语法会写吧?不会去new 弹出窗的tool页datawindow syntax查



------解决方案--------------------
请参考以下方法

pb从数据窗口获得数据的方法总结 收藏 
pb从数据窗口获得数据的方法总结(2008-05-09 13:03:51)标签:it 分类:学习笔记 
pb从数据窗口获得数据的方法总结
通过PowerBuilder的数据窗口对象属性,我们可以指定一定格式的表达式来直接从数据窗口中获得数据。这种直接的数据操作方法让我们能只需一条语句而不用调用许多方法,就可得到一定量甚至大量的数据。操作数据的表达式大致可分为三种,下面逐一介绍。
---------------------------------
1)在知道列或计算域名时得到数据得到某列中一行或全部的值,
表达式:(如果rownum忽略,则可得到缓冲区或数据源的值)
dwcontrol.Object.columnname {.buffer } {.datasource } { [ rownum ] }
其中datasource 参数表示数据源,它有两个可选项,Current(缺省)和Original,由此参数我们可以指定数据是从当前数据窗口上还是从数据库中得到。对于计算域,它不能被改变也没有当前值,所以我们必须指定为此参数为Original。
示例:
因为缺省设置是在Primary缓冲区的当前值,下面语句是等价的,都是从第一行得到emp_name列的值
dw_1.Object.emp_name[1]
dw_1.Object.emp_name.Primary.Current[1]
下面语句设置emp_name列的第一行值为“国防科技大学先进制造中心”
dw_1.Object.emp_name[1] = "国防科技大学先进制造中心"
下面语句得到所有emp_name列的值,并将它们放入数组中
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Current
下面语句得到emp_name列在filter缓冲区的所有当前值
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Filter
下面语句得到emp_name在filter缓冲区的初始值(数据库中的值)
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Filter.Original
下面语句得到emp_name列在delete缓冲区的第14行的当前值
string ls_name
ls_name = dw_1.Object.emp_name.Delete[14]This statement gets the original
下面语句得到emp_name列在delete缓冲区的第14行的初始值(数据库中的值)
string ls_name
ls_name = dw_1.Object.emp_name.Delete.Original[14]
下面语句得到review_date计算域的所有值
string ld_review[]
ld_review = dw_1.Object.review_date.Original
得到被选择项的值
表达式:dwcontrol.Object.columnname {.Primary }{.datasource }.Selected
示例:
由于Primary缓冲区是程序本选择项所在的唯一缓冲区并且当前数据是缺省的,下面的语句作用是等价的,它们实现从emp_name列中得到被选中行的值。
dw_1.Object.emp_name.Selected
dw_1.Object.emp_name.Primary.Selected
dw_1.Object.emp_name.Current.Selected
dw_1.Object.emp_name.Primary.Current.Selected
下面语句从数据库中得到被选择行的数据
dw_1.Object.emp_name.Original.Selected
dw_1.Object.emp_name.Primary.Original.Selected
下面语句设置emp_name列的第一个被选中行的值为空字符串
string ls_empty[]
ls_empty[1] = ""
dw_1.Object.emp_lname.Selected = ls_empty
下面语句可得到emp_name列被选中行的初始值(从数据库中检索出的值),并将它放入一个字符串数组
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Original.Selected
得到一定范围的值
返回指定列的一个范围的行的值,并将它们放入数组
表达式:
dwcontrol.Object.columnname {.buffer } {.datasource } [ startrownum,
endrownum ]
示例:
由于Primary缓冲区和当前数据是缺省选项,下面的语句式等价的
dw_1.Object.emp_name[11,20]
dw_1.Object.emp_name.Primary[11,20]
  相关解决方案