DATAWINDOW技巧2

66、數據窗口dw_1中有一列是用下拉數據窗口表示,怎麼才能動態改變下拉數據窗口,也就是動態調用不同的下拉數據窗口

datawindowchild ldwc_1
getchild("含有dddw的字段名", ldwc_1)
ldwc_1.dataobject = "d_1" //這裏動態改變d_2, d_3
ldwc_1.settransobject(sqlca)
ldwc_1.retrieve()

設置下拉數據窗口的display column和data column

dw_1.Object.emp_status.dddw.name= "dw_name"
dw_1.Object.emp_status.dddw.DataColumn="col_1"
dw_1.Object.emp_status.dddw.DisplayColumn="col_2"

dw_1.object.字段名.dddw.DisplayColumn = "顯示字段"
dw_1.object.字段名.dddw.DataColumn = "data字段"

可以用子數據窗口,getselectedrow(0)函數得到你選擇的行號。

67、在數據窗口對象畫板中可以設定列的編輯風格爲下拉數據窗口(DropDownDataWindow),假設所設定列爲部門號"department_id",相關連的子數據窗口爲"d_dddw_dep",顯示列爲部門名稱"dept_name",數據列爲部門號"dept_id",實現方法如下:
dw_1.Modify("department_id.DDDW.Name=d_dddw_dep ")
dw_1.Modify("department_id.DDDW.DisplayColumn='dept_name' ")
dw_1.Modify("department_id.DDDW.DataColumn='dept_id' ")
或:
dw_1.object.department_id.dddw.name = "d_dddw_dep"
dw_1.object.department_id.DDDW.DisplayColumn="dept_name" dw_1.object.department_id.DDDW.DataColumn = "dept_id"
注:PowerBuilder有一個小工具DWSyntax(程序名爲:dwsyn60.exe),提供了獲得及修改數據窗口、列等的各項屬性值的語法,對編程非常有幫助。上述腳本在DWSyntax中都能找到。

68、DataWindow Processing


The type of processing required to display the data in the selected presentation style.

Controls

DataWindows

Syntax

PowerBuilder dot notation:

dw_control.Object.DataWindow.Processing

Describe argument:

"DataWindow.Processing"

Return values are:

0 — (Default) Form, group, n-up, or tabular
1 — Grid
2 — Label
3 — Graph
4 — Crosstab
5 — Composite
6 — OLE
7 — RichText

 

69、如何將DW中不同內容保存到EXCEL不同的SHEET當中?(原創)
OLEObject excelapp
excelapp = CREATE OLEObject

IF excelapp.ConnectToNewObject("excel.application") <> 0 THEN
messageBox('OLE錯誤','OLE無法連接!請檢查您的EXCEL是否正確安裝!')
return
END IF

excelapp.Workbooks.Add
excelapp.DisplayAlerts = FALSE

excelapp.activeworkbook.worksheets[1].cells(1,1).value = "這是第一張SHEET"
excelapp.activeworkbook.worksheets[2].cells(1,1).value = "這是第二張SHEET"


excelapp.activeworkbook.worksheets[3].cells(1,1).value = "這是第三張SHEET"

//通過指定worksheets[1]中的參數1、2、3來設定到不同的sheet即可

excelapp.activeworkbook.saveas("c:/multisheet.xls",39)
excelapp.activeworkbook.close()
excelapp.quit()
excelapp.disconnectobject()

DESTROY excelapp

補充:如果想要添加一個SHEET,可以通過:

ExcelServer.Application.ActiveWorkbook.Worksheets.add() //此處添加一個SHEET
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=322061

70、控制哪一行可更改或不可更改

datawindow可不可以控制哪一行可更改或不可更,現在好像只能控制到列?
a.在第一行加一個flag的欄位用來標識是否可修改,值為0或1.
然後在每一個欄位的Protected屬性中加上:if(flag='0',0,1)
這樣,如果你認為哪一行可以修改,就將flag設為0就好了.
b.在datawindow的rowfocuschanged的事件當中寫入,相應語句。
如下列例子實現單行不能更改,雙行可以更改
int V_row,j
if dw_1.rowcount()<1 then return
v_row=dw_1.getrow()
if mod(v_row,2)=0 then
for j=1 to 5 //dw_1有5個字段
dw_1.SetTabOrder(j,j*10)
next
else
for j=1 to 5
dw_1.settaborder(j,0)
next
end if

C.如果你不想讓用戶修改某行,你可以在rowfocuschanged事件裏這麼寫

if currentrow = 5 then
this.modify("datawindow.readonly = Yes")
else
this.modify("datawindow.readonly = No")
end if


71、數據窗口導出excle

integer li_rtn,ii,li_asc
string ls_name,ls_pathname
boolean lb_exist
if dw_1.RowCount()<1 then
MessageBox("提示信息","請先檢索數據再導出至Excel!")
return -1//error
end if
li_rtn=GetFileSaveName("保存文件",ls_pathname,ls_name,"xls","Excel文件(*.xls),*.xls")
if li_rtn=1 then
lb_exist=FileExists(ls_pathname)
IF lb_exist THEN
li_rtn=MessageBox("保存",ls_pathname+"已經存在,是否覆蓋?",Exclamation!,YesNo!)
end if
if li_rtn=1 then
//當文件存在用戶選擇覆蓋,或是文件本就不存在時。注意變量li_rtn
li_rtn=dw_1.SaveAs(ls_pathname,excel5!, TRUE)
if li_rtn=1 then
//MessageBox("提示信息","導出數據成功!")
else
MessageBox("錯誤信息","導出數據失敗!")
return -1//error
end if
else
return -1//error
end if
else
return -1
end if

72、設置下拉數據窗口不自動檢索以提高檢索和插入速度

在使用PB開發程序過程中你會發現,如果數據窗口或數據存儲的欄位編輯風格爲下拉數據窗口並且設置自動檢索,首次檢索數據或插入行,系統將自動檢索下拉數據窗口數據,這有利於數據的顯示,但會降低檢索性能,特別是對於有多個欄位編輯風格爲下拉數據窗口並且設置自動檢索或(且)下拉數據窗口數據量較大時性能下降很明顯。
其實,如果我們只關心數據值而不關心顯示值,我們可以將欄位全部設置爲不自動檢索,你可以通過建一個沒有下拉數據窗口編輯風格欄位或有下拉數據窗口編輯風格欄位但不自動檢索的數據窗口對象,但一般的開發人員喜歡重用數據窗口對象,這就需要動態地改變欄位的自動檢索屬性。如果你已經這樣做了,相對之前,性能會得到提升。
常見的做法是先將已設置自動檢索的欄位取出來,然後設置不自動檢索,數據窗口或數據存儲檢索或插入後再恢復欄位的自動檢索屬性,如果該數據窗口或數據存儲根本無需顯示數據,你可以只設置不自動檢索,之後就檢索或插入數據。
以下是採用常見做法,首先使用of_getautoretrievecolumnname()獲取自動檢索下拉數據窗口數據的欄位列表,然後調用of_setautoretrieve()設置欄位不自動檢索,調用retrieve()檢索數據,最後調用of_setautoretrieve()恢復欄位自動檢索屬性。of_getautoretrievecolumnname()、of_setautoretrieve()函數封裝於n_datastore對象(繼承自datastore),讀者可以參考筆者所寫碼以通過設置下拉數據窗口不自動檢索以提高檢索和插入速度。

//n_datastore lds_buffer
String ls_autoretrievecolumnname_list[]

Lds_buffer.of_getautoretrievecolumnname(ls_autortrievecolumnname_list)// 取自動檢索下拉數據窗口數據的欄位列表
Lds_buffer.of_setautoretrieve(ls_autoretrievecolumnname_list,false)// 設置欄位不自動檢索
Lds_buffer.retrieve()
Lds_buffer.of_setautoretrieve(ls_autoretrievecolumnname_list,true)// 恢復欄位自動檢索屬性

/*******************************************************************
函數名稱:of_getautoretrievecolumnname()
參數: as_colname_list ref string 欄位名稱
返回值: long 自動檢索下拉數據窗口數據的欄位個數
功能描述:取自動檢索下拉數據窗口數據的欄位列表
創建人: 康劍民
創建日期:2005-12-26
版本號: V1.0
*******************************************************************/
integer i,li_colcount,li_return=0
string ls_colname_list[]

li_colcount = integer(this.describe("datawindow.column.count"))
for i = 1 to li_colcount
if this.describe("#" + string(i) + ".dddw.autoretrieve") = "yes" then
li_return ++
ls_colname_list[li_return] = this.describe("#" + string(i) + ".name")
end if
next
as_colname_list = ls_colname_list

return li_return

/*******************************************************************
函數名稱:of_setautoretrieve()
參數: as_colname_list[] string 欄位名稱列表
ab_autoretrieve boolean 是否自動檢索下拉數據窗口數據
返回值: long 是否成功(1表示成功,-1表示失敗)
功能描述:設置是否自動檢索下拉數據窗口數據(性能優化)
創建人: 康劍民
創建日期:2005-12-26
版本號: V1.0
*******************************************************************/
integer i
string ls_modify,ls_error,ls_col_list[],ls_modify_colname
string ls_autoretrieve
long ll_return

if ab_autoretrieve then
ls_autoretrieve = 'yes'
else
ls_autoretrieve = 'no'
end if

for i = 1 to upperbound(as_colname_list)
if isnumber(as_colname_list[i]) then
ls_modify_colname = "#" + as_colname_list[i]
else
ls_modify_colname = as_colname_list[i]
end if
if this.describe(ls_modify_colname + ".edit.style") = 'dddw' then
ls_modify = ls_modify + "~t" + ls_modify_colname + ".edit.autoretrieve = " + ls_autoretrieve
end if
next

if lenw(ls_modify) > 0 then
ls_error = this.modify(ls_modify)
if len(ls_error) > 0 then
ll_return = -1
else
ll_return = 1
end if
else
ll_return = 1
end if
return ll_return



72、使DataWindow列只能追加不能修改
如何使DataWindow中的數據只能追加新記錄而不能修改,利用 Column 的 Protect 屬性可以很方便的做到這一點,方法如下:
將每一列的 Protect 屬性設置爲:
If( IsRowNew(), 0, 1) )
在 PowerScript 中可以動態修改 Protect 屬性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")
這樣,DataWindow 中只有新追加的記錄可修改,而其他記錄是隻讀的。

73、如何在DataWindow中實現列的自動折行
我們在PowerBuilder應用程序的開發過程中, 使用DataWindow時, 經常會遇
到某列的數據太長, 不能同時全部顯示的情況. 若採用自動水平滾動, 操作起
來又不夠簡便. 下面介紹一種方法, 實現列數據多行顯示, 即實現列數據的自
動折行.具體步驟如下:
1) 在DataWindow Painter中打開此DataWindow.
2) 在需設定自動折行的列上雙擊鼠標, 彈開此列的屬性窗口.
3) 選擇Position標籤, 選中Autosize Height 多選框.
4) 選擇Edit標籤, 不選中Auto Horz Scroll多選框.
5) 單擊OK按鈕, 保存所做的修改.
6) 點中Detail Band (即寫有Detail的灰色長帶), 單擊鼠標右鍵, 選擇
Properties... 菜單項.
7) 選中Autosize Height多選框.
8) 單擊OK按鈕, 保存所做的修改.
9) 保存此DataWindow.
注意:
連在一起的漢字(中間沒有標點或空格分隔), 系統將認爲是一個單詞, 不
會自動進行折行.

74、在數據窗口中實現動畫
要實現動畫,必須要有定時器,在數據窗口中已經有了一個定時器,雙擊數據窗口將彈出的對話框,在Timer Interval中定義大於零的值就有定時器(可以精確到毫秒),有了這個定時器就可以實現動畫了。比如要改變某字段的背景顏色,可設
ackgound.color=RGB(Integer(Right(string(now(),'hhmmssf'),1))*256/10,Integer(Right(string(now(),'hhmmssf'),1))*256/10,0)
  當然,您不僅可以改變背景顏色,而且可以改變字體等等任何屬性,使他可以動起來!

75、使數據窗口中的被選中行具有更好的外觀
大家都知道,在選擇數據窗口中的某一行時,如果使用pb提供的選擇函數SelectRow(),那麼的外觀真是不能恭維,單調而古板的藍色背景,可能和您的漂亮而生動的應用程序格格不入。有沒有辦法改變呢?當然有囉,請聽我慢慢道來。
   改變某一行的背景比較簡單,改變每一列的背景屬性(backgroundcolor)即可,可要根據鼠標選擇情況自動改變,並可以返回被選中的行可能還需要一定的技巧。下面分單行選擇和多行選擇分辨說明。
單行選擇
  單行選擇比較簡單,我們只要將所有字段的背景色的表達式改爲:
if(GetRow()=CurrentRow(),RGB(255,126,0),RGB(0,0,0))
  其中第一個顏色爲被選中的顏色,第二個顏色未被選中的顏色。然後用GetRow()代替GetSelectedRow()函數來得到被選中的行。
多行選擇
  多行選擇比較複雜,如果單純依靠改變數據窗口的屬性沒法實現,我們必須使用數據窗口屬性和代碼結合起來才能實現
  首先,改變數據窗口的SQL語句,增加一個計算字段:0 as flag,Select 語句改爲:
Select col1,col2 ,1 as flag from tablename where .....,
  當返回數據窗口painter時,您就會發現多了一個字段flag,我們就是利用這個字段保存行被選中的信息。
  其次,修改各個字段的背景顏色屬性,設置爲:if(flag=1,RGB(255,126,0),RGB(255,255,255))
  第三:在數據窗口控件中,增加對clicked 事件的處理,代碼如下:
if row<1 then return // setredraw(false)
if this.object.flag[row]=1 then //如果該行被選中,撤銷選擇,否則選中該行
 this.Object.flag[row]=0
else
 this.Object.flag[row]=1
end if
setredraw(true)

您還可以定製本選中行的字體,文本屬性等等。原理相同,不再贅述。

76 將日期型字段初始化爲當天的日期
   使用 Column Specifications 對話框來設置數據的初始值是一個比較好又比較通用的方法。 爲了將日期型字段初始化爲當天的日期,只要設置初始化值爲today,而不是today()即可。同樣設置初始值爲NUll,可以使用null,而不是 null()。

77 在DataWindow中調整列順序
在 Gird 風格的 DataWindow 中,列的排列順序是按照你選擇 Column 的順序排列的,並且不能改變.要改變列的順序則必須重新制作 DataWindow.
最近我發現一個辦法可以改變列的順序: 在 DataWindow 畫板中打開要修改的 DataWindow,然後按 'Preview' 按鈕切換到預覽模式下,選擇要移動的列標題並拖動到預定位置,然後返回 DataWindow 畫板,存盤即可.

78、Retrieve時不清除原有Datawindow數據
當你調用Retrieve函數,PowerBuilder自動清除原有DataWindow然後Retrieve數據。在Datawindow RetrieveStart事件中,使用Return 2,這樣PowerBuilder不會清除原有數據而是追加新數據。

79、美化DataWindow的顯示效果
使DataWindow 的單雙行顯示顏色不同,不僅僅可以使你的應用程序更顯專業性,並使數據的可讀性增強。先調出你需要改動的DataWindow,在Detail band按下右鍵選擇Properties,選擇Tab頁中的Expressions,在color屬性中輸入下面內容:(注意是在Detail明細顯示 段按右鍵,而不是在Column上) IF(MOD(GETROW(),2)=0,RGB(192, 192, 192), RGB(255, 255, 255)) 馬上Preview一下,看一看效果如何。

80、用Line建立漂亮的Grid DataWindow的技巧
雖然PowerBuilder有Grid風格的DataWindow,但不夠靈活,如果想打印一張邊框粗線條或雙線,內框爲細線條的表格直接使用Grid風 格的DataWindow就不能實現。因此許多人都用Tabular風格的DataWindow,然後自己用Line來實現Grid。 在調整線條位置是一個即傷腦筋又傷眼睛的事件,而一旦需要調整行高,所有工作都得重來,試一試用下面方法,會大大減輕你的工作量: 在vertical lines,改變它的屬性,在Expressions Tab上,y1行上輸入0,y2行上輸入rowheight() - 1 在horizontal lines, 設置 y1 和 y2 = rowheight() - 5 這樣PowerBuilder會自動調整線的座標,你只需要設置橫線的長度和x1,x2的座標即可。 馬上Preview一下,看一看效果! 你再也不需要因爲行的高度發生改變而重新調整線條位置。

81、如何創建一個報表,如下形式
Quantity Running Total
5,000 5,000
2,500 7,500
3,000 10,500
12,000 22,500
  對於Running Total列,我們可使用計算列:CumulativeSum(Quantity for all),即可達到逐漸遞增求和的功能。

82、數據窗口的數據送緩衝區之前確認的四個步驟 判斷數據類型是否正確。如不正確則觸發ItemError事件。判斷數據是否符合有效性規則。如不符合有效性規則,同樣觸發ItemError事件。 判斷是否有數據被改動。判斷數據是否通過ItemChanged事件,如果數據和ItemChanged相斥,將觸發ItemError事件。

83、如何在DataWindow中用數據類型爲Datetime的列爲條件進行查找
  1.當要查找的日期條件是一常數時使用如下表達式:
   ls_Find = "datetime_col
    = DateTime ('1/1/1999')"
  2.當要查找的日期條件是一個變量時使用如下的表達式:
   ls_Find = "datetime_col = DateTime ('" + ls_Date + "')"
  3.當要查找的日期條件是一個DateTime數據類型時使用如下表達式:
   ls_Find = "datetime_col = DateTime ('" + String (ldt_DateTime) + "')"

84、設置數據窗口Boolean型屬性的三種方法
  PowerBuilder提供了三種方法設置數據窗口的布爾型屬性,分別是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在處理上以字符串的形式保存屬性,而不考慮屬性值是布爾型、長整型或是字符型。
爲了進一步理解,可以導出一個數據窗口並查看它的原碼,可以發現即使是列的顏色屬性它也是使用帶雙引號的數字來表達。

85、如何在DataWindow中快速刪除多行
  在開發過程中可能經常有要進行多行刪除的操作,一般都使用循環語句進行操作:
FOR ll_RowOn = 1 TO dw_1.RowCount() dw_1.DeleteRow(ll_RowOn) NEXT
  一個快速的刪除方法是把要刪除的行從主緩衝區中移到刪除緩衝區中。例如,刪除緩衝區中所有的行:
dw_1.RowsMove(dw_1, 1, dw_1.RowCount, Primary!, dw_1, 1, Delete!)
  不過不要忘了過濾的行在不同的緩衝區中。

86、如何在DataWindow的SQL語法中不使用SELECT DISTINCT實現刪除重複的行
  起先對你要顯示唯一值的列進行排序:"city A",然後增加如下過濾字符串:" city < > city [-1] or GetRow () = 1"

87、在數據窗口中移走行,但不是去做過濾或刪除操作
  RowsDiscard()函數可做到這一點,它在數據窗口中執行移除工作,但被移走的行它不可被刪除或做任何修改性的保存。

88、如何在多行顯示的DataWindow 中的Footer Band中顯示當前數據的首行和最後行的行號
  我們先看兩個計算列的表達式: IF (GetRow() = First(GetRow() FOR Page), 1, 0) // 1 爲當前頁的第一行
IF (GetRow() < > 1 AND GetRow() = Last(GetRow() FOR Page), 1, 0) // 1 爲當前頁的最後一行
  由上面可知,在Footer Band中設置如下計算列表達式:
'Rows ' + String(First(GetRow() FOR Page)) + ' to ' + String(Last(GetRow() FOR Page)) + ' are displayed'。
即可達到這項功能。

89、使可編輯的數據窗口只讀
有時,你可能需要將一個用於編程的數據窗口用作顯示目的,可以有以下幾種方法來實現這一要求:
1.建立兩個數據窗口,一個用於編輯,一個用於顯示
2.將數據窗口中的全部對象的taborder設置爲0.
3.也可以將數據窗口中的列的protect屬性設爲On或Off,但你不能使用protect屬性進行編輯操作
4.數據窗口有一個將datawindow設爲只讀的屬性(readonly),使用它最方便。

90、數據窗口檢查重複行
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("注意", "用戶編碼重複.")
end if
dw_1.SetFilter ("")
dw_1.Filter()

91、如何在分組形式的DataWindow中分別顯示各組的行號
---- 當我們爲Datawindow的每一行顯示行號時,可以簡單的放一個表達式爲GetRow()
---- 計算列。但是對於分組的Datawindow,要分別顯示各組的行號,則應使用表達式爲
GetRow() - First(GetRow() for Group 1) + 1的計算列。

92、如何能讓數據窗口的某幾列在其他列橫拉時固定不動
////////////////////////////////////////////////////////////////
// 功能說明:用於凍結左邊的滾動欄
// 變更記錄: 變更或版本更新的時候
//
////////////////////////////////////////////////////////////////
int i
if pane = 1 then
i = integer(this.object.datawindow.horizontalscrollposition2)
if i < 1 or isnull(i) then return
if scrollpos > 0 then
this.object.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

93、在數據窗口中如果要使其中一列的屬性爲只讀,也就是不允許用戶修改,那麼只需簡單地將這一列的Table Order 設置成0就可。然而,在有些情況下
需要對這一列的某些行修改,而某些行不能修改,這就要用到這一列的protect屬性了。打開列的屬性中的Expressions,在protect中輸入條件判別
式。例如:允許用戶修改新增加的記錄,而檢索出來的記錄則不允許修改。條件判別式可以寫成如下:
if(isRowNew(),0,1)
在 PowerScript 中可以動態修改 Protect 屬性:
dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")
這樣,DataWindow 中只有新追加的記錄可修改,而其他記錄是隻讀的。

94、控制DATAWINDOW裏每頁顯示的行數
1、在Datawindow中增加一個計算域,起名爲:ceil_page,此計算域必須放在Detail段中,
Expression中輸入 ceiling(getrow()/25) 25表示每頁打印25行,也可以是一個參數。
2、分組,選擇菜單RowsCreate Group,選擇ceil_page
按ceil_page分組,並選中New Page On Group Break(意思是新組開始時換頁)。
3、將此計算域設爲隱藏(在屬性頁中的expression頁中在visible屬性中寫0)。
4、補空行:
在窗口的open事件中寫如下代碼:
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

95、 數據窗口的closeQuery事件:提示保存數據
dw_1.AcceptText()
IF dw_1.ModifiedCount() + dw_1.DeletedCount() > 0 THEN
CHOOSE CASE MessageBox("操作提示","數據已經發生變化,是否保存?",Question!,YesNoCancel!,1)
CASE 1
cb_save.TriggerEvent(clicked!)
CASE 2
Return 0//不做任何操作直接關閉窗口
CASE 3
Return 1//不會運行Close Event,維持原來的情況
END CHOOSE
END IF

96、Getchild函數主要被用來得到一個數據窗口的子數據窗口
該函數在兩種情況下可以使用,1、取出數據窗口對象的下拉式數據窗口;
2、取出複合風格(composite)數據窗口對象裏所嵌入的子數據窗口對象。
語法:integer dwcontrol.GetChild (string name, REF DataWindowChild
dwchildvariable )

例子1 這段程序取出一個composite數據窗口對象的兩個子數據窗口,並對他們進行過濾,和排序的操作。

/*dw_dy是連接一個composite數據窗口對象的一個數據窗口控件。dw_1、dw_2分別是嵌套的數據窗口的NAME*/

String ls_filter
DataWindowChild dwc_czrw,dwc_czx//定義子數據窗口變量
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")+"'"//過濾條件
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()
當然也可以通過數據共享(ShareData)等方式操作子數據窗口中的數據。
訪問複合數據窗口對象.方法 :dw_dy.o b j e c t.dw_1.o b j e c t.對象
例子2 下拉數據窗口動態過濾
在數據窗口dw_1的ItemFocusChanged事件中寫入如下腳本:
Integer rtncode
String ls_nowFld,ls_deptid,ls_sql
DataWindowChild fld_child
rtncode = dw_1.GetChild("Unit_id",fld_child) //獲得Unit_id字段名下拉數據窗口的句柄
If rtncode = -1 Then MessageBox("錯誤!", "不是下拉數據窗口!")
fld_child.SetTransObject(SQLCA) //設置事務對象
ls_sql = Lower(fld_child.GetSQLSelect())// 獲得DDDW的SQL語句
// 去除Sql 語句中的Where條件子句, 如原Sql 語句中須有Where條件子句,此處則需進行較
//複雜的處理,應視具體情況而定。
if Pos(ls_sql, " where ")>0 then ls_sql = Left(ls_sql,Pos(ls_sql, " where "))
//重新設置Sql 語句中的Where條件子句
ls_deptid=dw_1.Object.dept_id[GetRow()] //取得當前dept_id選定值
ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'"
//重新設置Sql 語句
fld_child.SetSQLSelect(ls_sql)
fld_child.Retrieve()//取得滿足條件的數據

97、從數據窗口中獲取數據
單條:假設我們要讀取dept_id字段的第一筆數據,可以用下列方式表示∶

li_id = dw_1.o b j e c t.dept_id[1]
假設我們要讀取第一行中第二個字段的數據,可以用下列方式表示∶

ls_name = dw_1.o b j e c t.DATA[1,2]
假設我們要讀取dept_id字段的所有數據,可以用下列方式表示∶

li_array = dw_1.o b j e c t.dept_id.CURRENT
假設我們要讀取過濾緩衝區 (filter buffer) 內dept_id字段的第一筆數據,可以用下列方式表示∶li_id = dw_1.o b j e c t.dept_id.Filter[1]
假設我們要讀取從第二筆數據的第一個字段到第三筆數據的二個字段之間的數據,表示∶lstr_array = dw_1.o b j e c t.DATA[2,1,3,2]
假設我們要讀取整個第二筆的數據,可以用下列方式表示∶

lstr_dept = dw_1.o b j e c t.DATA[2]
使用GetItemX ( )函數 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
數據的讀取 一般格式∶數據窗口控件.Retrieve ( ) 返回個數 ,-1爲錯誤
增加數據 數據窗口控件.InsertRow (行數) 參數爲0加到最後
數據的刪除 數據窗口控件.Deleterow (行數)
數據的過濾l 數據窗口控件.SetFilter (條件字符串).
數據窗口控件.Filter ( ) 用法∶將主要緩衝區 (Primary Buffer) 內不符合過濾條件的數據移到過濾緩衝區 (Filter Buffer)
內。
例子:string ls_exp ls_exp = "dept_id = 100" dw_1.SetFilter (ls_exp) dw_1.Filter ( )
排序 dw_1.SetSort ("dept_id") dw_1.Sort ( )
將數據從所有的緩衝區 (Buffer) 中清除 dw_1.ReSet ( )
計算數據數目。例如∶dw_1.Rowcount ( ) 類似: .DeletedCount ( ) .ModifiedCount ( ) .FilteredCount ( )
數據窗口的滾動 數據窗口控件.ScrollToRow (行數)

98、數據窗口屬性改變:
描述數據窗口對象本身顏色,可以表示如下∶long ll_color ll_color = dw_emplist.Describe ("DataWindow.Color")
描述數據窗口對象內標題 dept_id_t 的顏色,可以表示如下∶long ll_color ll_color = dw_emplist.Describe ("dept_id_t.Color")
修改數據窗口對象本身顏色,可以表示如下:dw_emplist.Modify ("DataWindow.Color = 255")
修改數據窗口對象內標題 dept_id 的顏色,可以表示如下∶dw_emplist.Modify ("dept_id_t.Color = 255")
假設當我們希望在程序運行階段纔給予下行條件∶薪水超過 50000 時顯示紅色,低於 50000 時顯示黑色。程序的寫法如下∶
ls_modstring = "Salary.Color = '0~tIf (Salary > 50000,255,0) '"
dw_1.modify (ls_modstring)

99、得到當前鼠標所指對象所在的帶區
string str_band
str_band=GetBandAtPointer() //得到當前鼠標所指對象所在的帶區
str_band=left(str_band,(pos(str_band,'~t') - 1))//得到"header"、"detail"等
if str_band<>'header' then return //單擊非頭區,退出
100、得到鼠標指向的列對象名
str_object=GetObjectAtPointer() //得到當前鼠標所指對象名
str_object=left(str_object,(pos(str_o b j e c t,'~t') - 1))
//得到列對象名(默認爲列名_t爲列標題)
str_column=left(str_object,(len(str_title) - 2))
//判斷該名稱是否爲列名字
if this.describe(str_column+".band")='!' then return //非是列名,即列標題不是按正常規律起名的。

100、得到當前行、列,總行、列 //this 針對數據窗口而言
li_col = this.GetColumn()
li_ColCount = long(describe(this,"datawindow.column.count"))
ll_row = this.GetRow()
ll_RowCount = this.RowCount()
//設置當前行、列

this.SetFocus()
scrolltorow(this,ll_Row)
setrow(this,ll_Row)
setcolumn(this,li_col)

101、得到所有列標題
ll_colnum = Long(dw_1.object.datawindow.column.count)
for i = 1 to ll_colnum
//得到標題頭的名字
ls_colname = dw_1.describe('#' + string(i) + ".name") + "_t"
ls_value = dw_1.describe(ls_colname + ".text")
next

102、如何用代碼取得數據窗口彙總帶計算列的值?  
String ls_value
ls_value = dw_1.Describe("Evaluate("'compute_1',1)")
如果是數值型,要轉換。

103、取得單擊的列標題、列名、數據庫字段名
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')//標題
ls_column = This.describe(ls_dwo + '.Name') //數據窗口列名
ls_dbname = This.describe(ls_dwo + '.dbname') //數據庫中字段名
messagebox('信息', '標題文本:' + ls_title + &'~r~n數據窗口列名 :' + ls_column + &
'~r~n數據庫中字段名:' + ls_dbname )
end if

104、窗口爲w_gcde內,放入一個DW_1,如何得到dw_1內的某列值yuonghu_id列的內容
方法:
long lng_column_count
integer i
string str_column[] //列名
string str_column_text[]  //text的名字
  //得到數據窗口的總列數
  lng_column_count = long(dw_1.Describe("DataWindow.Column.Count"))
  //循環依次讀取
  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

105、在DDDW中實現當前高亮行隨鼠標移動
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 not ificationcode = 2311 then //DDDW的mousemove事件
//得到鼠標所在行
ls_Pointer = ldwc_Child.GetObjectAtPointer()
ll_Row=Long( Mid( ls_Pointer, Pos( ls_Pointer, "~t" ) + 1 ))
//移到鼠標所在行
IF ldwc_Child.GetRow() <> ll_Row AND ll_Row > 0 THEN
ldwc_Child.ScrollToRow( ll_Row )
END IF
end if
END IF

106、實現打印完一個DataWindow後不換頁
首先將datawindow的print輸出到一個打印文件中,把其他的print也輸入這個prn,然後,打印這個打印文件就行了。
如:
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打印機名



107、除了循環以外,有沒有更好的方法統計數據窗口中處於選中狀態的行數?
一般習慣於使用循環來統計數據窗口中處於選中狀態的行數,有沒有更好的方法?

其實此問題在應用上用處不大,討論一下,活躍一下思維還是有好處的。
方法一:
long ll_Selected
ll_Selected = long(dw_1.describe("evaluate('sum( if(IsSelected(), 1, 0) for all)',1)"))
方法二:
long ll_Selected
ll_Selected = long(dw_1.describe("evaluate('count(IsSelected() for all)',1)"))
方法三:
upperbound(dw_1.Object.Data.Selected)
uf_set_text(datawindow adw_content,string
as_columns,boolean,ab_ignoreblank)
/*************************************************************
describe: 在數據窗口adw_content中,在as_columns中包含的列中插入空格
args:
as_columns 要操作的多個列,列間用逗號隔開
*************************************************************/
if (not isvalid(adw_content)) or isnull(as_columns) or len(as_columns)<1 or isnull(ab_ignoreblank) then return -1

n_cst_string lnv_string
string ls_column[] , ls_width ,as_source,as_replaced ,ls_temp
int li_upperbound , li_width , li_column , li_fontWidth, li_counter
long ll_rowcount , ll_row , ll_totalstep
int li_yield

lnv_string.of_parsetoarray(as_columns,',',ls_column)
li_upperbound = upperbound(ls_column)
ll_rowcount = adw_content.rowcount()
if li_upperbound<1 or ll_rowcount<1 then return -1

openwithparm(w_waiting,this)
ib_cancel = false
iw_frame.enabled = false
ll_totalstep = ll_rowcount * li_upperbound
w_waiting.uf_register(ll_totalstep)
for li_column = 1 to li_upperbound
ls_width = adw_content.describe(ls_column[li_column]+".width")
li_width = integer(ls_width)
if ls_width='!' or ls_width='?' or li_width=0 then
continue
end if
//ls_temp = adw_content.describe(ls_column[li_column]+".Font.property { = 'width' }")
//messagebox(ls_column[li_column]+".Font.property { = 'width' }",ls_temp)
//return 1
li_fontwidth = 27
li_counter = li_width / li_fontWidth

for ll_row=1 to ll_rowcount
if ib_cancel then
iw_frame.enabled = true
return 0 //pressed cancel button
end if
as_source = adw_content.getitemstring(ll_row,ls_column[li_column])
as_replaced = uf_insertstring(as_source,li_counter,' ',false)
if as_replaced<>as_source then
adw_content.setitem(ll_row,ls_column[li_column],as_replaced)
end if
w_waiting.uf_stepit()
next
next
close(w_waiting)
iw_frame.enabled = true

return 1
108如何在數據窗中得到自動高的列的高度?
答:desceibe("evaluate('RowHeight()',3)") //獲得第三行的row的高度
發佈了0 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章