【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]
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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章