祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 7088|回复: 4

[参考资料] pb从数据窗口获得数据的方法总结

[复制链接]

[参考资料] pb从数据窗口获得数据的方法总结

[复制链接]
ehxz

主题

0

回帖

57万

积分

管理员

积分
570764
贡献
在线时间
小时
2011-5-3 22:12:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
通过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]
dw_1.Object.emp_name.Current[11,20]
dw_1.Object.emp_name.Primary.Current[11,20]
下面语句将emp_name列从11行到20行的值设置为空字符串
string ls_empty[]
ls_empty[1] = ""
dw_1.Object.emp_name[11,20] = & {"","","","","","","","","",""}
---------------------------------------------------------------------
下面语句的得到emp_name列的初始值,并将它们放入一个字符串数组
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Original[11,20]
---------------------------------------------------------------------
下面语句得到emp_name列在过滤缓冲区从5行到8行的当前值,并且将它们放入到数组中
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Filter[5,8]
---------------------------------------------------------------------
下面语句得到emp_name列在过滤缓冲区从5行到8行的初始值,并且将它们放入到数组中
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Filter.Original[5,8]
---------------------------------------------------------------------
下面语句得到emp_name列在删除缓冲区从50行到200行的当前值,并且将它们放入到数组中
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Delete[50,200]
---------------------------------------------------------------------
下面语句得到emp_name列在删除缓冲区从50行到200行的初始值,并且将它们放入到数组中
string ls_namearray[]
ls_namearray = dw_1.Object.emp_name.Delete.Original[50,200]
---------------------------------------------------------------------
2)得到已知列号列的值
得到指定行号列号的值
表达式:
dwcontrol.Object.Data {.buffer } {.datasource } [ rownum, colnum ]
示例:
由于Primary缓冲区和当前值选项是缺省的,所以下面语句式等价的,都是得到第一行,第二列的数据
dw_1.Object.Data[1,2]
dw_1.Object.Data.Primary.Current[1,2]
---------------------------------------------------------------------
下面语句将Filter缓冲区的初始值中得第一行,第二列的值改为0
dw_1.Object.Data.Filter.Original[1,2] = 0
---------------------------------------------------------------------
得到一定范围行的数据
表达式:
dwcontrol.Object.Data {.buffer } {.datasource } [ startrownum, startcolnum, endrownum, endcolnum ]
示例:
---------------------------------------------------------------------
由于Primary缓冲区和当前值选项是缺省的,所以下面语句式等价的,都是得到第一行到第十行,第一列到第四列的值
dw_1.Object.Data[1,1,10,4]
dw_1.Object.Data.Primary.Current[1,1,10,4]
---------------------------------------------------------------------
下面语句得到employee Ids和 last names列在delete缓冲区的所有行的值,Ids和names列是第一第二列。得到的数据放在名为str_namelist的一个结构中,此结构有两个属性,整形的id和字符串形的lastname。Ids和names被存放在文件deleted.txt中。
integer li_fileNum
long ll_deletedrows
str_namelist lstr_namelist[]
ll_deletedrows = dw_1.DeletedCount()
lstr_namelist = &
dw_1.Object.Data.Delete[1,1, ll_deletedrows,2]
li_fileNum = FileOpen("C:\HR\DELETED.TXT", &
LineMode!, Write!)
FOR ll_count = 1 to UpperBound(lstr_namelist)
FileWrite(li_fileNum, &
String(lstr_namelist.id) + &
" " + &
lstr_namelist.lastname + &
"~r~n")
NEXT
FileClose(li_fileNum)
---------------------------------------------------------------------
下面的语句使Ids和last names列的数据为NULL
long ll_n
str_namelist lstr_namelist[]
SetNull(lstr_namelist[1].id)
SetNull(lstr_namelist[1].lastname)
FOR ll_n = 2 to dw_1.RowCount()
lstr_namelist[ll_n] = lstr_namelist[1]
NEXT
dw_1.Object.Data[1,1, dw_1.RowCount(),2] = lstr_data
3)得到整行数据
得到数据窗口上的某行或全部行的数据
表达式:
dwcontrol.Object.Data {.buffer } {.datasource } { [ rownum ] }
示例:
---------------------------------------------------------------------
由于Primary缓冲区和当前值选项是缺省的,所以下面语句式等价的,都是得到Primary缓冲区第五行的当前数据
dw_1.Object.Data[5]
dw_1.Object.Data.Primary.Current[5]
下面语句将数据窗口Primary缓冲区的当前值放入到一个结构数组中
any la_dwdata
la_dwdata = dw_1.Object.Data
下面语句得到数据窗口Delete缓冲区的当前值,并将它放入到一个结构数组中
any la_dwdata
la_dwdata = dw_1.Object.Data.Delete
下面语句用数据窗口dw_2的Primary缓冲区的当前值覆盖嵌套报表的第二行的数据,在数据窗口dw_2中的列必须与嵌套报表中的列相同:
dw_1.Object.NestRep[2].Object.Data = dw_2.Object.Data
---------------------------------------------------------------------
得到选中行的数据
表达式:
dwcontrol.Object.Data {.Primary } {.datasource } .Selected
示例:
由于Primary缓冲区和当前值选项是缺省的,所以下面语句式等价的,都是得到选中行的数据
dw_1.Object.Data.Selected
dw_1.Object.Data.Primary.Selected
dw_1.Object.Data.Current.Selected
dw_1.Object.Data.Primary.Current.Selected
=====================================================================
下面语句得到被选中行的初始值
dw_1.Object.Data.Original.Selected
dw_1.Object.Data.Primary.Original.Selected
---------------------------------------------------------------------
下面语句得到dw_2中Primary缓冲区选中行的当前值,然后放到dw_1中的列useroption(下拉数据窗口)中
dw_1.Object.useroptions.Object.Data = dw_2.Object.Data.Selected
4)从Crosstab数据窗口中获得点击域名和域值
对于Crosstab类型的数据窗口,我们在前面已做了简要的介绍,但由于它的行列都可以随着后台数据库存放数据的改变而发生改变,所以在想得到它的某个行列定义的值时不能采用一般的方法,如GetItem××××和点操作符。
通过数据窗口画板可以看到所有的列具有同样的列名,在程序运行时它们会自动的*列名后加后缀的方法进行区别,格式为:列名_列号~t行号,列号和行号之间通过‘~t’分隔,列名和列号通过‘_’分隔。因此如果我们需要detail栏的任何一列的值,就需要将得到的信息进行解析,提取出选择的列名,列号和行号,然后才可以通过一般得数据的方法在数据窗口中获得需要的数据。下面我们以一个具体的例子来解说上面采用的方法。
作用:在数据窗口(数据源为Crosstab)的Cliked事件中编程,当点击事件发生后将获得点击交*表行列交叉点的值;
程序:
//定义变量
string ls_detail, ls_name, ls_col
int li_pos, li_len, li_row, li_col
//判断用户点击处是否为detail栏,如不是则退出
if left(getbandatpointer(),6) <> "detail" then return
//得到点击域的信息
ls_detail = geto b j e c tatpointer()
//得到detail栏第二列的名称,第一列为数据窗口行信息
ls_name = Object.#2.Name
//将第二列列名和前面点击得到的点击域信息进行比较,如不是点击的第二列则退出
if left(ls_detail,len(ls_name)) <> ls_name then return
//得到点击域的行号
li_row = row
li_len = len(ls_detail)
//从前面得到点击域信息中得到关于列号的信息
ls_col = right(ls_detail, li_len - len(ls_name))
//得到点击域的列号
if left(ls_col,1) <> "_" then
li_col = 2
else
li_pos = pos(ls_col,"~t")
li_col = integer(mid(ls_col,2,li_pos - 1) ) + 2
end if
//显示出点击域的值
string(getitemnumber(li_row,li_col))



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lzp_lrp/archive/2009/08/27/4488475.aspx
共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
jjoulejcc

主题

0

回帖

266

积分

中级会员

积分
266
贡献
在线时间
小时
2011-5-7 10:37:08 | 显示全部楼层
这个不错,又学习了新知识
共享共进共赢Sharing And Win-win Results
licc068

主题

0

回帖

2378

积分

金牌会员

积分
2378
贡献
在线时间
小时
2011-5-10 00:46:54 | 显示全部楼层
{:lh_05:}{:lh_05:}{:lh_05:}{:lh_05:}{:lh_05:}{:lh_05:}
共享共进共赢Sharing And Win-win Results
838637819

主题

0

回帖

337

积分

高级会员

积分
337
贡献
在线时间
小时
2012-12-29 15:10:29 | 显示全部楼层
这个不错,又学习了新知识
共享共进共赢Sharing And Win-win Results
liqipeng182

主题

0

回帖

8863

积分

论坛元老

积分
8863
贡献
在线时间
小时
2013-10-5 22:29:57 | 显示全部楼层
这个不错,又学习了新知识
共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

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

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-4-28 06:32 , Processed in 0.046606 second(s), 7 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表