通过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))