比如,在乙個資料視窗a中,有乙個涉及到姓名的下拉選擇列表b(b可能是要展示表中的一列) b的資料要根據a的其中乙個部門來動態的過濾資料。
暫且不討論部門的資料怎麼獲取的,可能是使用者自己輸入的某個值c
那麼:dwcontrol.getchild ( name, dwchildvariable )
應當定義成:
a.getchild(「b的名字」,定義的dwchildvariable 變數)
意思是:將a中的變數或控制項b的引用賦給dwchildvariable
然後dwchildvariable.retrieve(「引數c」)
功能:得到指定子資料視窗的引用並將其儲存到變數中 然後應用程式就可以使用該變數來操作子資料視窗物件
語法:dwcontrol.getchild ( name, dwchildvariable )
引數:dwcontrol 資料視窗控制項名
name string 型別 列名 該列包含了欲得到引用的子資料視窗物件
dwchildvariable datawindowchild 型別 用於儲存該函式得到的子資料視窗物件的引用
返回值:integer 函式執行成功時返回 1, 出錯時返回-1 , 子資料視窗物件引用儲存在變數dwchildvariable 中 如果任何引數的值為null , 則getchild()函式返回null
用法:這裡所說的子資料視窗包括兩方面的意義 一是資料視窗物件中的下拉資料窗 口 dropdowndatawindow 是復合風格資料視窗物件中的子報表 , 需要注意的是在建立復合風格的資料視窗物件時,它使用的子報表實際上也是個資料視窗物件 必須要設定其name 屬性,否則就不能使用getchild()函式來得到該子報表的引用。當應用程式需要以顯式方式提取子資料視窗物件的資料時 先使用 getchild()函式得到該子資料視窗物件的引用 然後像操作普通資料視窗控制項那樣檢索子資料視窗物件的資料。一般來說 在顯示主資料視窗時 powerbuilder 會自動提取出子資料視窗物件的資料,但是 當子資料視窗物件使用了提取引數或檢索條件發生變化且需要檢索新的資料時 應用程式就需要自己編寫**來實現資料提取工作了 。
當使用者在主資料視窗中插入一行或提取主資料視窗的資料時 powerbuilder 也自動地提取出子資料視窗的資料 但是 如果子資料視窗帶有提取引數 那麼powerbuilder 將顯示乙個對話方塊 讓使用者輸入提取引數的值 要想不讓powerbuilder 顯示該對話方塊 應用程式中可以在修改主資料視窗之前先顯式地提取出子資料視窗的資料。需要注意的是,如果巢狀報表的資料來源為外部資料來源,那麼應用程式不能使用 getchild()函式得到子報表的引用。使用資料視窗控制項的物件函式 modify()修改資料視窗的某些屬性後,先前執行 getchild()函式得到的子資料視窗物件引用可能不再有效。此時 需要重新呼叫 getchild() 函式來得到有效的子資料視窗物件引用
示例:本例中 主資料視窗的 emp_state 列是個子資料視窗物件,該子資料視窗物件需要乙個 地區 值作為提取引數,為了不讓powerbuilder 顯示輸入提取引數的對話方塊**中首先檢索了子資料視窗的資料 ,之後再提取主資料視窗的資料
datawindowchild state_child //說明乙個datawindowchild 型別的變數
integer rtncode
rtncode = dw_1.getchild(「emp_state」, state_child)
// 得到名稱為 emp_state 的子資料視窗物件的引用
if rtncode = -1 then messagebox( 「錯誤」, 「不是子資料視窗」)
// 如果未與資料庫建立連線時首先建立連線
connect using sqlca;
// 設定子資料視窗使用的事務物件
state_child.settransobject(sqlca)
// 使用地區值 北京 檢索子資料視窗物件的資料
state_child.retrieve(「east」)
// 設定主資料視窗使用的事務物件並提取資料
dw_1.settransobject(sqlca)
dw_1.retrieve()
powerbuilder 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()//取得滿足條件的資料
關於PB程式的開發
用pb這個開發工具已經有幾年了,自從畢業到現在,也一直在用它做為主要吃飯傢伙了.呵呵.包括現在,雖然公司的專案要往j2ee平台上發展,可歷史遺留程式還是要維護的,而且目前還是公司業務的主要支撐平台.近來,對於客戶提出的一些新的需求,我把以前的 全部整理了一下,以前的 好至少有三到五個人寫過,風格不一...
關於PB呼叫Webservice的有效方法
powerbuilder呼叫webservice客戶端總是有很多問題。proxy方法使用起來有很多限制,對後台webservice服務指令碼有很多要求,對複雜資料型別支援不好。inet方法使用時,對於pb9以下版本存在字符集的問題。pb9使用的是ansi單位元組字符集,而soap xml使用的utf...
用VC建立供PB呼叫的DLL
1 用vs.2003新建vc 專案中的 win32 專案 專案名稱為wxjextend,應用程式型別選擇dll 2 在主 dll 原始檔中輸入 long wxjextend api stdcall bitand long bit1,long bit2 long wxjextend api stdca...