设置某一个行列的颜色和写保护属性
//-----------------------------------------------------
//函數(shù)功能:設(shè)置某一個(gè)行列的顏色和寫(xiě)保護(hù)屬性
//調(diào)用方式:f_set_color(dw_1,row,col)
//??????????保護(hù)整行:f_set_color(dw_1,row,0)
//??????????保護(hù)整列:f_set_color(dw_1,0,col)
//-----------------------------------------------------
INTEGER?li_i
STRING?ls_str
dw_setcolor.setredraw(FALSE)?
//重設(shè)背景
dw_setcolor.modify("#"?+?STRING(col)+".background.mode=2")
dw_setcolor.modify("#"?+?STRING(col)+".background.color=16777215")
IF?row?=?0?THEN
//改變某列顏色
ls_str?=?"#"?+?STRING(col)+".background.color?=?'536870912~trgb(230,230,230)'?)"
dw_setcolor.modify(ls_str)
ls_str?=?"#"?+?STRING(col)+".protect?=?'1'"
dw_setcolor.modify(ls_str)
ELSEIF?col?=?0?THEN
// 改變某行顏色
dw_setcolor.Modify("DataWindow.Detail.Color=?'1000~tif(?getrow()?=?"?+STRING(row)+?",rgb(230,230,230),536870912)?'")
FOR?li_i?=?1?TO?INTEGER(dw_setcolor.Object.DataWindow.Column.Count)
dw_setcolor.modify(ls_str)
dw_setcolor.modify("#"?+?STRING(li_i)+?".protect?=?'0~tif(?getrow()?=?"?+STRING(row)+?"?,1,0)'")
NEXT
ELSE
//改變cell顏色
ls_str?=?"#"?+?STRING(col)+".background.color?=?'1000~tif(?getrow()?=?"?+STRING(row)+?",rgb(230,230,230),536870912)?'"
// messagebox("",ls_str)
dw_setcolor.modify(ls_str)
dw_setcolor.modify("#"?+?STRING(col)+?".protect?=?'0~tif(?getrow()?=?"?+STRING(row)+?"?,1,0)'")
END?IF
dw_setcolor.setredraw(TRUE)
PB導(dǎo)出數(shù)據(jù)excel格式dw2xls
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/xuejiayue1105/article/details/8856459
PB導(dǎo)出數(shù)據(jù)excel格式dw2xls
?使用DW2XLS控件
語(yǔ)法
uf_save_dw_as_excel ( dw, filename )?
參數(shù)
dw A reference to the datawindow object
filename A string whose value is the name of the file you want to create. If filename is not on the operating system's search path, you must enter the fully qualified name.?
返回值
Integer. Returns 1 if it succeeds and -1 if an error occurs.
舉例
integer li_ret
?
li_ret = uf_save_dw_as_excel(dw_1, 'c:\doc\report.xls')
if li_ret = 1 then
? ?//success
? ?//...
else
? ?//fail
? ?//...
end if
?
我的實(shí)際例子
?
首先 migrate dw2XLS
?
界面
相關(guān)代碼
導(dǎo)出結(jié)果
?
還有相關(guān)的就是
?
uf_save_dw_as_excel_parm() function
Converts datawindow into excel file. Allows to specify some options for process of converting.
語(yǔ)法
uf_save_dw_as_excel_parm ( dw, filename, parm )?
參數(shù)
dw A reference to the datawindow object
filename A string whose value is the name of the file you want to create. If filename is not on the operating system's search path, you must enter the fully qualified name?
parm A reference to the n_dwr_service_parm object which contain a set of parameters for process of converting
返回值
Integer. Returns 1 if it succeeds and -1 if an error occurs.
舉例
?
//export using parameters
integer li_ret
n_dwr_service_parm lnvo_parm
lnvo_parm = create n_dwr_service_parm
lnvo_parm.ib_header = false ? ? ? ? //skip header band 沒(méi)有標(biāo)題行
lnvo_parm.ib_summary = false ? ? ? ?//skip summary band?
lnvo_parm.ib_footer = false ? ? ? ? //skip footer band?
lnvo_parm.ib_group_header = false ? //skip all group headers?
lnvo_parm.ib_group_trailer = false ?//skip all group trailers?
?
li_ret = uf_save_dw_as_excel_parm(dw_1, 'c:\doc\report.xls', lnvo_parm)
if li_ret = 1 then
? ?//success
? ?//...
else
? ?//fail
? ?//...
end if
?
下面這個(gè)沒(méi)有測(cè)試成功,可能版本不對(duì)
is_header_text 沒(méi)有這個(gè)方法
// adding a header to generated XLS
integer li_ret
n_dwr_service_parm lnvo_parm
lnvo_parm = create n_dwr_service_parm
lnvo_parm.is_header_text = "Report"
lnvo_parm.ib_header_font_underline = True
?
li_ret = uf_save_dw_as_excel_parm(dw_1, 'c:\doc\report.xls', lnvo_parm)
if li_ret = 1 then
? ?//success
? ?//...
else
? ?//fail
? ?//...
end if
————————————————
版權(quán)聲明:本文為CSDN博主「薛佳岳」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xuejiayue1105/article/details/8856459
pb datawindow的用法
pb datawindow的用法
1.?使DataWindow列只能追加不能修改
如何使DataWindow中的數(shù)據(jù)只能追加新記錄而不能修改,利用 Column 的 Protect 屬性可以很方便的做到這一點(diǎn),方法如下:
將每一列的 Protect 屬性設(shè)置為:
If( IsRowNew(), 0, 1) )
在 PowerScript 中可以動(dòng)態(tài)修改 Protect 屬性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")
這樣,DataWindow 中只有新追加的記錄可修改,而其他記錄是只讀的。
2 .如何在DataWindow中實(shí)現(xiàn)列的自動(dòng)折行
我們?cè)赑owerBuilder應(yīng)用程序的開(kāi)發(fā)過(guò)程中, 使用DataWindow時(shí), 經(jīng)常會(huì)遇
到某列的數(shù)據(jù)太長(zhǎng), 不能同時(shí)全部顯示的情況. 若采用自動(dòng)水平滾動(dòng), 操作起
來(lái)又不夠簡(jiǎn)便. 下面介紹一種方法, 實(shí)現(xiàn)列數(shù)據(jù)多行顯示, 即實(shí)現(xiàn)列數(shù)據(jù)的自
動(dòng)折行.具體步驟如下:
1) 在DataWindow Painter中打開(kāi)此DataWindow.
2) 在需設(shè)定自動(dòng)折行的列上雙擊鼠標(biāo), 彈開(kāi)此列的屬性窗口.
3) 選擇Position標(biāo)簽, 選中Autosize Height 多選框.
4) 選擇Edit標(biāo)簽, 不選中Auto Horz Scroll多選框.
5) 單擊OK按鈕, 保存所做的修改.
6) 點(diǎn)中Detail Band (即寫(xiě)有Detail的灰色長(zhǎng)帶), 單擊鼠標(biāo)右鍵, 選擇
Properties... 菜單項(xiàng).
7) 選中Autosize Height多選框.
8) 單擊OK按鈕, 保存所做的修改.
9) 保存此DataWindow.
注意:
連在一起的漢字(中間沒(méi)有標(biāo)點(diǎn)或空格分隔), 系統(tǒng)將認(rèn)為是一個(gè)單詞, 不
會(huì)自動(dòng)進(jìn)行折行.
3.?在數(shù)據(jù)窗口中實(shí)現(xiàn)動(dòng)畫(huà)
要實(shí)現(xiàn)動(dòng)畫(huà),必須要有定時(shí)器,在數(shù)據(jù)窗口中已經(jīng)有了一個(gè)定時(shí)器,雙擊數(shù)據(jù)窗口將彈出的對(duì)話框,在Timer Interval中定義大于零的值就有定時(shí)器(可以精確到毫秒),有了這個(gè)定時(shí)器就可以實(shí)現(xiàn)動(dòng)畫(huà)了。比如要改變某字段的背景顏色,可設(shè)
ackgound.color=RGB(Integer(Right(string(now(),'hhmmssf'),1))*256/10,Integer(Right(string(now(),'hhmmssf'),1))*256/10,0)
當(dāng)然,您不僅可以改變背景顏色,而且可以改變字體等等任何屬性,使他可以動(dòng)起來(lái)!
4.?使數(shù)據(jù)窗口中的被選中行具有更好的外觀
大家都知道,在選擇數(shù)據(jù)窗口中的某一行時(shí),如果使用pb提供的選擇函數(shù)SelectRow(),那么的外觀真是不能恭維,單調(diào)而古板的藍(lán)色背景,可能和您的漂亮而生動(dòng)的應(yīng)用程序格格不入。有沒(méi)有辦法改變呢?當(dāng)然有啰,請(qǐng)聽(tīng)我慢慢道來(lái)。
改變某一行的背景比較簡(jiǎn)單,改變每一列的背景屬性(backgroundcolor)即可,可要根據(jù)鼠標(biāo)選擇情況自動(dòng)改變,并可以返回被選中的行可能還需要一定的技巧。下面分單行選擇和多行選擇分辨說(shuō)明。
單行選擇
單行選擇比較簡(jiǎn)單,我們只要將所有字段的背景色的表達(dá)式改為:
if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0))
其中第一個(gè)顏色為被選中的顏色,第二個(gè)顏色未被選中的顏色。然后用GetRow()代替GetSelectedRow()函數(shù)來(lái)得到被選中的行。?
多行選擇
多行選擇比較復(fù)雜,如果單純依靠改變數(shù)據(jù)窗口的屬性沒(méi)法實(shí)現(xiàn),我們必須使用數(shù)據(jù)窗口屬性和代碼結(jié)合起來(lái)才能實(shí)現(xiàn)
首先,改變數(shù)據(jù)窗口的SQL語(yǔ)句,增加一個(gè)計(jì)算字段:0 as flag,Select 語(yǔ)句改為:
Select col1,col2 ,1 as flag from tablename where .....,
當(dāng)返回?cái)?shù)據(jù)窗口painter時(shí),您就會(huì)發(fā)現(xiàn)多了一個(gè)字段flag,我們就是利用這個(gè)字段保存行被選中的信息。
其次,修改各個(gè)字段的背景顏色屬性,設(shè)置為:if(flag=1,RGB(255,126,0),RGB(255,255,255))
第三:在數(shù)據(jù)窗口控件中,增加對(duì)clicked 事件的處理,代碼如下:
if row<1 then return // setredraw(false)
if this.o b j e c t.flag[row]=1 then //如果該行被選中,撤銷(xiāo)選擇,否則選中該行
this.Object.flag[row]=0
else
this.Object.flag[row]=1
end if
setredraw(true)
您還可以定制本選中行的字體,文本屬性等等。原理相同,不再贅述。
5 .將日期型字段初始化為當(dāng)天的日期
使用 Column Specifications 對(duì)話框來(lái)設(shè)置數(shù)據(jù)的初始值是一個(gè)比較好又比較通用的方法。為了將日期型字段初始化為當(dāng)天的日期,只要設(shè)置初始化值為today,而不是today()即可。同樣設(shè)置初始值為NUll,可以使用null,而不是 null()。
6.?在DataWindow中調(diào)整列順序
在 Gird 風(fēng)格的 DataWindow 中,列的排列順序是按照你選擇 Column 的順序排列的,并且不能改變.要改變列的順序則必須重新制作 DataWindow.
最近我發(fā)現(xiàn)一個(gè)辦法可以改變列的順序: 在 DataWindow 畫(huà)板中打開(kāi)要修改的 DataWindow,然后按 'Preview' 按鈕切換到預(yù)覽模式下,選擇要移動(dòng)的列標(biāo)題并拖動(dòng)到預(yù)定位置,然后返回 DataWindow 畫(huà)板,存盤(pán)即可.
7 .Retrieve時(shí)不清除原有Datawindow數(shù)據(jù)
當(dāng)你調(diào)用Retrieve函數(shù),PowerBuilder自動(dòng)清除原有DataWindow然后Retrieve數(shù)據(jù)。在Datawindow RetrieveStart事件中,使用Return 2,這樣PowerBuilder不會(huì)清除原有數(shù)據(jù)而是追加新數(shù)據(jù)。
8 .美化DataWindow的顯示效果
使DataWindow 的單雙行顯示顏色不同,不僅僅可以使你的應(yīng)用程序更顯專(zhuān)業(yè)性,并使數(shù)據(jù)的可讀性增強(qiáng)。先調(diào)出你需要改動(dòng)的DataWindow,在Detail band按下右鍵選擇Properties,選擇Tab頁(yè)中的Expressions,在color屬性中輸入下面內(nèi)容:(注意是在Detail明細(xì)顯示段按右鍵,而不是在Column上) IF(MOD(GETROW(),2)=0,RGB(192, 192, 192), RGB(255, 255, 255)) 馬上Preview一下,看一看效果如何。
9 .用Line建立漂亮的Grid DataWindow的技巧
雖然PowerBuilder有Grid風(fēng)格的DataWindow,但不夠靈活,如果想打印一張邊框粗線條或雙線,內(nèi)框?yàn)榧?xì)線條的表格直接使用Grid風(fēng)格的DataWindow就不能實(shí)現(xiàn)。因此許多人都用Tabular風(fēng)格的DataWindow,然后自己用Line來(lái)實(shí)現(xiàn)Grid。在調(diào)整線條位置是一個(gè)即傷腦筋又傷眼睛的事件,而一旦需要調(diào)整行高,所有工作都得重來(lái),試一試用下面方法,會(huì)大大減輕你的工作量:在vertical lines,改變它的屬性,在Expressions Tab上,y1行上輸入0,y2行上輸入rowheight() - 1 在horizontal lines, 設(shè)置 y1 和 y2 = rowheight() - 5 這樣PowerBuilder會(huì)自動(dòng)調(diào)整線的坐標(biāo),你只需要設(shè)置橫線的長(zhǎng)度和x1,x2的坐標(biāo)即可。 馬上Preview一下,看一看效果!你再也不需要因?yàn)樾械母叨劝l(fā)生改變而重新調(diào)整線條位置。
10 .如何創(chuàng)建一個(gè)報(bào)表,如下形式
Quantity Running Total
5,000 5,000
2,500 7,500
3,000 10,500
12,000 22,500
對(duì)于Running Total列,我們可使用計(jì)算列:CumulativeSum(Quantity for all),即可達(dá)到逐漸遞增求和的功能。
11.?數(shù)據(jù)窗口的數(shù)據(jù)送緩沖區(qū)之前確認(rèn)的四個(gè)步驟
判斷數(shù)據(jù)類(lèi)型是否正確。如不正確則觸發(fā)ItemError事件。
判斷數(shù)據(jù)是否符合有效性規(guī)則。如不符合有效性規(guī)則,同樣觸發(fā)ItemError事件。
判斷是否有數(shù)據(jù)被改動(dòng)。
判斷數(shù)據(jù)是否通過(guò)ItemChanged事件,如果數(shù)據(jù)和ItemChanged相斥,將觸發(fā)ItemError事件。
12 .如何在DataWindow中用數(shù)據(jù)類(lèi)型為Datetime的列為條件進(jìn)行查找
1.當(dāng)要查找的日期條件是一常數(shù)時(shí)使用如下表達(dá)式:
ls_Find = "datetime_col
= DateTime ('1/1/1999')"
2.當(dāng)要查找的日期條件是一個(gè)變量時(shí)使用如下的表達(dá)式:
ls_Find = "datetime_col = DateTime ('" + ls_Date + "')"
3.當(dāng)要查找的日期條件是一個(gè)DateTime數(shù)據(jù)類(lèi)型時(shí)使用如下表達(dá)式:
ls_Find = "datetime_col = DateTime ('" + String (ldt_DateTime) + "')"
13 .設(shè)置數(shù)據(jù)窗口Boolean型屬性的三種方法
PowerBuilder提供了三種方法設(shè)置數(shù)據(jù)窗口的布爾型屬性,分別是True/False, 1/0, 'Yes'/'No'。例如:
dw_1.Object.address.Visible = 0 dw_1.Object.address.Visible = False dw_1.Object.address.Visible = 'No'
PowerBuilder在處理上以字符串的形式保存屬性,而不考慮屬性值是布爾型、長(zhǎng)整型或是字符型。
為了進(jìn)一步理解,可以導(dǎo)出一個(gè)數(shù)據(jù)窗口并查看它的原碼,可以發(fā)現(xiàn)即使是列的顏色屬性它也是使用帶雙引
號(hào)的數(shù)字來(lái)表達(dá)。
14 .如何在DataWindow中快速刪除多行
在開(kāi)發(fā)過(guò)程中可能經(jīng)常有要進(jìn)行多行刪除的操作,一般都使用循環(huán)語(yǔ)句進(jìn)行操作:
FOR ll_RowOn = 1 TO dw_1.RowCount() dw_1.DeleteRow(ll_RowOn) NEXT
一個(gè)快速的刪除方法是把要?jiǎng)h除的行從主緩沖區(qū)中移到刪除緩沖區(qū)中。例如,刪除緩沖區(qū)中所有的行:
dw_1.RowsMove(dw_1, 1, dw_1.RowCount, Primary!, dw_1, 1, Delete!)
不過(guò)不要忘了過(guò)濾的行在不同的緩沖區(qū)中。
15 .如何在DataWindow的SQL語(yǔ)法中不使用SELECT DISTINCT實(shí)現(xiàn)刪除重復(fù)的行
起先對(duì)你要顯示唯一值的列進(jìn)行排序:"city A",然后增加如下過(guò)濾字符串:" city < > city [-1] or GetRow () = 1"
16 .如何在分組形式的DataWindow中分別顯示各組的行號(hào)
當(dāng)我們?yōu)镈atawindow的每一行顯示行號(hào)時(shí),可以簡(jiǎn)單的放一個(gè)表達(dá)式為GetRow()計(jì)算列。但是對(duì)于分組的Datawindow,要分別顯示各組的行號(hào),則應(yīng)使用表達(dá)式為
GetRow() - First(GetRow() for Group 1) + 1的計(jì)算列。
17 .如何改變列的字體顏色,提醒用戶此列已做修改
在列的Color屬性中,輸入如下表達(dá)式
IF (column_name < >column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0))。
在這個(gè)條件中,如果此列已改變,則顯示紅色字體,否則顯示黑色字體。這個(gè)表達(dá)式主要用column_name < > column_name.Original比較當(dāng)前列的值和原始列的值是否相同來(lái)達(dá)到判斷的目的。
18 .在數(shù)據(jù)窗口中移走行,但不是去做過(guò)濾或刪除操作
RowsDiscard()函數(shù)可做到這一點(diǎn),它在數(shù)據(jù)窗口中執(zhí)行移除工作,但被移走的行它不可被刪除或做任何修改性的保存。
19 .如何在多行顯示的DataWindow 中的Footer Band中顯示當(dāng)前數(shù)據(jù)的首行和最后行的行號(hào)
我們先看兩個(gè)計(jì)算列的表達(dá)式: IF (GetRow() = First(GetRow() FOR Page), 1, 0) // 1 為當(dāng)前頁(yè)的第一行
IF (GetRow() < > 1 AND GetRow() = Last(GetRow() FOR Page), 1, 0) // 1 為當(dāng)前頁(yè)的最后一行
由上面可知,在Footer Band中設(shè)置如下計(jì)算列表達(dá)式:
'Rows ' + String(First(GetRow() FOR Page)) + ' to ' + String(Last(GetRow() FOR Page)) + ' are displayed'。
即可達(dá)到這項(xiàng)功能。
20 .使可編輯的數(shù)據(jù)窗口只讀
有時(shí),你可能需要將一個(gè)用于編程的數(shù)據(jù)窗口用作顯示目的,可以有以下幾種方法來(lái)實(shí)現(xiàn)這一要求:
1.建立兩個(gè)數(shù)據(jù)窗口,一個(gè)用于編輯,一個(gè)用于顯示
2.將數(shù)據(jù)窗口中的全部對(duì)象的taborder設(shè)置為0.
3.也可以將數(shù)據(jù)窗口中的列的protect屬性設(shè)為On或Off,但你不能使用protect屬性進(jìn)行編輯操作
4.數(shù)據(jù)窗口有一個(gè)將datawindow設(shè)為只讀的屬性(readonly),使用它最方便。
21 .數(shù)據(jù)窗口檢查重復(fù)行
dw_1.SetSort ("user_id A")
dw_1.Sort()
dw_1.SetFilter ("user_id = user_id[-1]")
dw_1.Filter()
if dw_1.RowCount() > 0 then
Messagebox("注意", "用戶編碼重復(fù).")
end if
dw_1.SetFilter ("")
dw_1.Filter()
22 .如何在分組形式的DataWindow中分別顯示各組的行號(hào)
---- 當(dāng)我們?yōu)镈atawindow的每一行顯示行號(hào)時(shí),可以簡(jiǎn)單的放一個(gè)表達(dá)式為GetRow()
---- 計(jì)算列。但是對(duì)于分組的Datawindow,要分別顯示各組的行號(hào),則應(yīng)使用表達(dá)式為
GetRow() - First(GetRow() for Group 1) + 1的計(jì)算列。
23 .如何能讓數(shù)據(jù)窗口的某幾列在其他列橫拉時(shí)固定不動(dòng)
?????
// 功能說(shuō)明:用于凍結(jié)左邊的滾動(dòng)欄
// 變更記錄: 變更或版本更新的時(shí)候
//??
int i
if pane = 1 then
i = integer(this.o b j e c t.datawindow.horizontalscrollposition2)
if i < 1 or isnull(i) then return
if scrollpos > 0 then
this.o b j e c t.datawindow.horizontalScrollPosition = 0
end if
else
i = integer(this.Object.DataWindow.HorizontalScrollSplit)
if i < 1 or isnull(i) then return
if i > scrollpos then
this.o b j e c t.datawindow.horizontalScrollPosition2 = i
end if
end if
24.?在數(shù)據(jù)窗口中如果要使其中一列的屬性為只讀,也就是不允許用戶修改,那么只需簡(jiǎn)單地將這一列的Table Order 設(shè)置成0就可。然而,在有些情況下
需要對(duì)這一列的某些行修改,而某些行不能修改,這就要用到這一列的protect屬性了。打開(kāi)列的屬性中的Expressions,在protect中輸入條件判別
式。例如:允許用戶修改新增加的記錄,而檢索出來(lái)的記錄則不允許修改。條件判別式可以寫(xiě)成如下:
if(isRowNew(),0,1)?
在 PowerScript 中可以動(dòng)態(tài)修改 Protect 屬性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")
這樣,DataWindow 中只有新追加的記錄可修改,而其他記錄是只讀的。
25 .控制DATAWINDOW里每頁(yè)顯示的行數(shù)
1、在Datawindow中增加一個(gè)計(jì)算域,起名為:ceil_page,此計(jì)算域必須放在Detail段中,
Expression中輸入 ceiling(getrow()/25) 25表示每頁(yè)打印25行,也可以是一個(gè)參數(shù)。
2、分組,選擇菜單RowsCreate Group,選擇ceil_page
按ceil_page分組,并選中New Page On Group Break(意思是新組開(kāi)始時(shí)換頁(yè))。
3、將此計(jì)算域設(shè)為隱藏(在屬性頁(yè)中的expression_r頁(yè)中在visible屬性中寫(xiě)0)。
4、補(bǔ)空行:
在窗口的open事件中寫(xiě)如下代碼:
long li_count,li_i
li_count=dw_1.retrieve()
if mod(li_count,25)<>0 then
for li_i=1 to 25 - mod(li_count,25)
dw_1.insertrow(0)
next
end if
26 .數(shù)據(jù)窗口的closeQuery事件:提示保存數(shù)據(jù)
dw_1.AcceptText()
IF dw_1.ModifiedCount() + dw_1.DeletedCount() > 0 THEN
CHOOSE CASE MessageBox("操作提示","數(shù)據(jù)已經(jīng)發(fā)生變化,是否保存?",Question!,YesNoCancel!,1)
CASE 1
cb_save.TriggerEvent(clicked!)
CASE 2
Return 0//不做任何操作直接關(guān)閉窗口
CASE 3
Return 1//不會(huì)運(yùn)行Close Event,維持原來(lái)的情況
END CHOOSE
END IF
27 .Getchild函數(shù)主要被用來(lái)得到一個(gè)數(shù)據(jù)窗口的子數(shù)據(jù)窗口
該函數(shù)在兩種情況下可以使用,1、取出數(shù)據(jù)窗口對(duì)象的下拉式數(shù)據(jù)窗口;
??????????????????????????? 2、取出復(fù)合風(fēng)格(composite)數(shù)據(jù)窗口對(duì)象里所嵌入的子數(shù)據(jù)窗口對(duì)象。
語(yǔ)法:integer dwcontrol.GetChild (string name, REF DataWindowChild
???? dwchildvariable )
例子1 這段程序取出一個(gè)composite數(shù)據(jù)窗口對(duì)象的兩個(gè)子數(shù)據(jù)窗口,并對(duì)他們進(jìn)行過(guò)濾,和排序的操作。
?
String ls_filter
DataWindowChild dwc_czrw,dwc_czx//定義子數(shù)據(jù)窗口變量
dw_dy.Settranso b j e c t(sqlca)
dw_dy.Retrieve()
dw_dy.GetChild("dw_2",dwc_czrw)
dw_dy.Getchild("dw_1",dwc_czx)
ls_filter = "czrw_bh = '"+dw_3.GetItemString(dw_3.GetRow(),"czrw_bh")+"'"//過(guò)濾條件
dwc_czrw.SetFilter(ls_filter)
dwc_czrw.Filter()
ls_filter = "czx_rwbh = '"+dw_3.GetItemString(dw_3.GetRow(),"czrw_bh")+"'"
dwc_czx.SetSort("czx_sx A")
dwc_czx.Sort()
dwc_czx.SetFilter(ls_filter)
dwc_czx.filter()
當(dāng)然也可以通過(guò)數(shù)據(jù)共享(ShareData)等方式操作子數(shù)據(jù)窗口中的數(shù)據(jù)。
訪問(wèn)復(fù)合數(shù)據(jù)窗口對(duì)象.方法 :dw_dy.o b j e c t.dw_1.o b j e c t.對(duì)象
例子2?? 下拉數(shù)據(jù)窗口動(dòng)態(tài)過(guò)濾
在數(shù)據(jù)窗口dw_1的ItemFocusChanged事件中寫(xiě)入如下腳本:
Integer rtncode
String ls_nowFld,ls_deptid,ls_sql
DataWindowChild fld_child
rtncode = dw_1.GetChild("Unit_id",fld_child) //獲得Unit_id字段名下拉數(shù)據(jù)窗口的句柄
If rtncode = -1 Then MessageBox("錯(cuò)誤!", "不是下拉數(shù)據(jù)窗口!")
fld_child.SetTransObject(SQLCA) //設(shè)置事務(wù)對(duì)象
ls_sql = Lower(fld_child.GetSQLSelect())// 獲得DDDW的SQL語(yǔ)句
// 去除Sql 語(yǔ)句中的Where條件子句, 如原Sql 語(yǔ)句中須有Where條件子句,此處則需進(jìn)行較
//復(fù)雜的處理,應(yīng)視具體情況而定。
if Pos(ls_sql, " where ")>0 then ls_sql = Left(ls_sql,Pos(ls_sql, " where "))
//重新設(shè)置Sql 語(yǔ)句中的Where條件子句
ls_deptid=dw_1.Object.dept_id[GetRow()] //取得當(dāng)前dept_id選定值
ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'"
//重新設(shè)置Sql 語(yǔ)句
fld_child.SetSQLSelect(ls_sql)
fld_child.Retrieve()//取得滿足條件的數(shù)據(jù)
28 .從數(shù)據(jù)窗口中獲取數(shù)據(jù)
?? 單條:假設(shè)我們要讀取dept_id字段的第一筆數(shù)據(jù),可以用下列方式表示∶li_id = dw_1.o b j e c t.dept_id[1]
假設(shè)我們要讀取第一行中第二個(gè)字段的數(shù)據(jù),可以用下列方式表示∶ls_name = dw_1.o b j e c t.DATA[1,2]
假設(shè)我們要讀取dept_id字段的所有數(shù)據(jù),可以用下列方式表示∶li_array = dw_1.o b j e c t.dept_id.CURRENT
假設(shè)我們要讀取過(guò)濾緩沖區(qū) (filter buffer) 內(nèi)dept_id字段的第一筆數(shù)據(jù),可以用下列方式表示∶li_id = dw_1.o b j e c t.dept_id.Filter
[1]
假設(shè)我們要讀取從第二筆數(shù)據(jù)的第一個(gè)字段到第三筆數(shù)據(jù)的二個(gè)字段之間的數(shù)據(jù),表示∶lstr_array = dw_1.o b j e c t.DATA[2,1,3,2]
假設(shè)我們要讀取整個(gè)第二筆的數(shù)據(jù),可以用下列方式表示∶lstr_dept = dw_1.o b j e c t.DATA[2]
?????? 使用GetItemX ( )函數(shù) x為string number等?
lstr_name = dw_1.getitemstring (li_count , "emp_name") li_count為哪一條
多條:string ls_name[ ]
?????? ls_name = dw_ 1.o b j e c t.emp_name.current
數(shù)據(jù)的讀取?? 一般格式∶數(shù)據(jù)窗口控件.Retrieve ( ) 返回個(gè)數(shù) ,-1為錯(cuò)誤
增加數(shù)據(jù)??? 數(shù)據(jù)窗口控件.InsertRow (行數(shù))?? 參數(shù)為0加到最后
數(shù)據(jù)的刪除??????? 數(shù)據(jù)窗口控件.Deleterow (行數(shù))
數(shù)據(jù)的過(guò)濾l?? 數(shù)據(jù)窗口控件.SetFilter (條件字符串).???
數(shù)據(jù)窗口控件.Filter ( ) 用法∶將主要緩沖區(qū) (Primary Buffer) 內(nèi)不符合過(guò)濾條件的數(shù)據(jù)移到過(guò)濾緩沖區(qū) (Filter Buffer)
內(nèi)。
???????????? 例子:string ls_exp?? ls_exp = "dept_id = 100"?? dw_1.SetFilter (ls_exp)????? dw_1.Filter ( )
排序??? dw_1.SetSort ("dept_id")???? dw_1.Sort ( )
將數(shù)據(jù)從所有的緩沖區(qū) (Buffer) 中清除??? dw_1.ReSet ( )
計(jì)算數(shù)據(jù)數(shù)目。例如∶dw_1.Rowcount ( ) 類(lèi)似: .DeletedCount ( ) .ModifiedCount ( ) .FilteredCount ( )
數(shù)據(jù)窗口的滾動(dòng) 數(shù)據(jù)窗口控件.ScrollToRow (行數(shù))
29.?數(shù)據(jù)窗口屬性改變:
?? 描述數(shù)據(jù)窗口對(duì)象本身顏色,可以表示如下∶long ll_color??? ll_color = dw_emplist.Describe ("DataWindow.Color")
??? 描述數(shù)據(jù)窗口對(duì)象內(nèi)標(biāo)題 dept_id_t 的顏色,可以表示如下∶long ll_color?? ll_color = dw_emplist.Describe ("dept_id_t.Color")
??? 修改數(shù)據(jù)窗口對(duì)象本身顏色,可以表示如下:dw_emplist.Modify ("DataWindow.Color = 255")
??? 修改數(shù)據(jù)窗口對(duì)象內(nèi)標(biāo)題 dept_id 的顏色,可以表示如下∶dw_emplist.Modify ("dept_id_t.Color = 255")
??? 假設(shè)當(dāng)我們希望在程序運(yùn)行階段才給予下行條件∶薪水超過(guò) 50000 時(shí)顯示紅色,低于 50000 時(shí)顯示黑色。程序的寫(xiě)法如下∶
?????? ls_modstring = "Salary.Color = '0~tIf (Salary > 50000,255,0) '"
?????? dw_1.modify (ls_modstring)
30 .得到當(dāng)前鼠標(biāo)所指對(duì)象所在的帶區(qū)
string str_band
str_band=GetBandAtPointer() //得到當(dāng)前鼠標(biāo)所指對(duì)象所在的帶區(qū)
str_band=left(str_band,(pos(str_band,'~t') - 1))//得到"header"、"detail"等
??????? if str_band<>'header' then return //單擊非頭區(qū),退出
31 得到鼠標(biāo)指向的列對(duì)象名
str_o b j e c t=GetObjectAtPointer() //得到當(dāng)前鼠標(biāo)所指對(duì)象名
str_o b j e c t=left(str_o b j e c t,(pos(str_o b j e c t,'~t') - 1))
??????? //得到列對(duì)象名(默認(rèn)為列名_t為列標(biāo)題)
str_column=left(str_o b j e c t,(len(str_title) - 2))
//判斷該名稱(chēng)是否為列名字
if this.describe(str_column+".band")='!' then return //非是列名,即列標(biāo)題不是按正常規(guī)律起名的。
?????????????????????????????????????????????????????????????
32 .得到當(dāng)前行、列,總行、列?//this 針對(duì)數(shù)據(jù)窗口而言
??????? li_col????? = this.GetColumn()
??????? li_ColCount = long(describe(this,"datawindow.column.count"))
??????? ll_row??? = this.GetRow()
?? ll_RowCount = this.RowCount()
?????? //設(shè)置當(dāng)前行、列
?????? scrolltorow(this,ll_Row)
?????? setrow(this,ll_Row)
?????? setcolumn(this,li_col)
?????? this.SetFocus()
33.?得到所有列標(biāo)題
ll_colnum = Long(dw_1.o b j e c t.datawindow.column.count)
??????? for i = 1 to ll_colnum
//得到標(biāo)題頭的名字
ls_colname = dw_1.describe('#' + string(i) + ".name") + "_t"
?????????? ls_value = dw_1.describe(ls_colname + ".text")
next
34.?如何用代碼取得數(shù)據(jù)窗口匯總帶計(jì)算列的值?
?? String ls_value
ls_value = dw_1.Describe("Evaluate("'compute_1',1)")
如果是數(shù)值型,要轉(zhuǎn)換。
35 .取得單擊的列標(biāo)題、列名、數(shù)據(jù)庫(kù)字段名
string ls_dwo
long ll_pos
string ls_type
string ls_title
string ls_column
string ls_dbname
if Not KeyDown(KeyControl!) then return
ls_dwo = dwo.Name
if trim(ls_dwo) = '' or isnull(ls_dwo) then return
ls_type = This.describe(ls_dwo + '.type')
if ls_type = 'column' then
ls_title = This.describe(ls_dwo + '_t.text')//標(biāo)題
ls_column = This.describe(ls_dwo + '.Name') //數(shù)據(jù)窗口列名
ls_dbname = This.describe(ls_dwo + '.dbname') //數(shù)據(jù)庫(kù)中字段名
messagebox('信息',??? '標(biāo) 題 文 本?? :' + ls_title + &
?????? '~r~n數(shù)據(jù)窗口列名 :' + ls_column + &
?????? '~r~n數(shù)據(jù)庫(kù)中字段名:' + ls_dbname )
end if
36.?窗口為w_gcde內(nèi),放入一個(gè)DW_1,如何得到dw_1內(nèi)的某列值yuonghu_id列的內(nèi)容
方法:
long lng_column_count
?? integer i
?? string str_column[]???????? //列名
?? string str_column_text[] //text的名字
//得到數(shù)據(jù)窗口的總列數(shù)
lng_column_count = long(dw_1.Describe("DataWindow.Column.Count"))
//循環(huán)依次讀取
for i = 1 to lng_column_count
?? str_column[i] = dw_1.Describe("#"+string(i)+".name")
??? str_column_text[i] = dw_1.Describe(str_column[i] + "_t.text")
next
37 .在DDDW中實(shí)現(xiàn)當(dāng)前高亮行隨鼠標(biāo)移動(dòng)
DataWindowChild ldwc_Child
String ls_Pointer
Long ll_Row
GetChild( "dept_id", ldwc_Child ) // Replace the column name "dept_id" as you needed
IF hwndchild = Handle( ldwc_child ) THEN
??? if notificationcode = 2311 then //DDDW的mousemove事件
??????? //得到鼠標(biāo)所在行
??????? ls_Pointer = ldwc_Child.GetObjectAtPointer()
??????? ll_Row=Long( Mid( ls_Pointer, Pos( ls_Pointer, "~t" ) + 1 ))
??????? //移到鼠標(biāo)所在行
??????? IF ldwc_Child.GetRow() <> ll_Row AND ll_Row > 0 THEN
??????????? ldwc_Child.ScrollToRow( ll_Row )
??????? END IF
??? end if
END IF
38 .實(shí)現(xiàn)打印完一個(gè)DataWindow后不換頁(yè)
首先將datawindow的print輸出到一個(gè)打印文件中,把其他的print也輸入這個(gè)prn,然后,打印這個(gè)打印文件就行了。
如:
datawindow_control1.object.datawindow.print.filename="c:printfilepathexam_1.prn"
datawindow_control2.object.datawindow.print.filename="c:printfilepathexam_1.prn"
dw_1.print()
dw_2.print()
run("print //d:\printservenamesharename "c:printfilepathexam_1.prn")
//d:\printservenamesharename打印機(jī)名
總結(jié)
以上是生活随笔為你收集整理的设置某一个行列的颜色和写保护属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工作98:嵌套传值
- 下一篇: 深入浅出MFC第二章笔记