近日在開發過程中遇到使用下拉資料視窗的情況:資料表Data中有二列Dept_id(主管部門編碼)、Unit_id(企業編碼)的取值分別來自資料表Dept(主管部門)及Unit(企業基本情況),且要求選擇某一主管部門後,能將該主管部門的所有企業顯示出來以便選擇。有關資料表的結構如下(已簡化):
| 表 名 |
欄位名 |
類型 |
長度 |
關鍵字 |
含義 |
| Data |
Dept_id |
Char |
5 |
否 |
主管部門編碼 |
| Unit_id |
Char |
9 |
是 |
企業編碼 |
| Num |
Numeric |
7(無小數) |
否 |
上交金額 |
| Dept |
Id |
Char |
5 |
是 |
主管部門編碼 |
| Name |
Char |
15 |
否 |
主管部門?/TD> |
| Unit |
Id |
Char |
7 |
是 |
企業編碼 |
| Name |
Char |
30 |
否 |
企業名稱 |
| Dept_id |
Char |
5 |
否 |
主管部門編碼 |
為實現這些要求,可將Data表的2個欄位Dept_id、Unit_id設計為2個相關聯的下拉資料視窗,關鍵是如何將Dept_id的當前選定值傳遞給Unit_id以使其僅顯示相應的主管部門的企業清單。為此,本人查閱了許多有關書刊及有關網站的相關資料,找到兩種解決方案:設定檢索參數及使用動態SQL語句。
這兩種解決方案的共同關鍵是使用GetChild()函數及DataWindowChild型變數。許多資料稱設定檢索參數是最簡單、最方便的有效解決方案,也提出了幾種隱藏系統自動彈出的“Specify Retrieval”對話方塊的方法。但令人遺憾的是本人竭盡所能也未能如願(主要是無法隱藏系統自動彈出的“Specify Retrieval”對話方塊)。
因此開始考慮使用動態SQL語句。經過一番努力,終於比較滿意地實現了設計要求。具體做法如下:
1、 首先建立應用dddw,有關操作按提示即可。(PowerBuilder8.0中請先建立WorkSpace dddw.pdw,
其他動作基本同PowerBuilder7.0)
2、 建立資料視窗dddw_dept:Grid、Quick Select、表Dept的所有欄位,最好不要定義Where子句以免後面編程複雜化,能將header部分去掉最好(可使顯示簡潔)。
3、 建立資料視窗dddw_unit:Grid、Quick Select、表Unit的所有欄位,其餘同上。
4、 建立資料視窗d_1:FreeForm、Quick Select、表Data的所有欄位,適當排列、編輯一下,關鍵是Dept_id及Unit欄位,必須做成下拉資料視窗。下面就以Dept_id欄位為例:右擊Dept_id欄位(注意:不是欄位標題),在快顯功能表中選“Properties…”, 然後在彈出的“Properties-Dept_id”視窗中選擇“Edit”標籤頁,在“Style Type”下拉框中選擇“DropDownDW”,選中複選框“Always Show Arrow”、“V ScrollBar”,再在“DataWindow”編輯框中輸入“dddw_dept”,或點擊其右邊的“…”進行選擇,在“Display Column”下拉框中選擇“name”(即下拉資料視窗中顯示的是name列值),在“Data Column”下拉框中選擇“id”(即實際存入資料庫的是id列值)。欄位Unit_id如法炮製,只需將“DataWindow”編輯框中的“dddw_dept”改成“dddw_unit”即可。
5、建立主視窗w_main,其上建資料視窗控制項dw_1,其DataObject為d_1。
再在主視窗w_main的Open事件中寫入如下指令碼:
| Long ll_newrow SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = True SQLCA.DBParm = "Connectstring='DSN=SmpDB'"//ODBC資料來源已配置好 connect; dw_1.SetTransObject(SQLCA) dw_1.Retrieve() |
然後再在資料視窗dw_1的ItemFocusChanged事件中寫入如下指令碼:
| Integer rtncode String ls_nowFld,ls_deptid,ls_sql DataWindowChild fld_child rtncode = dw_1.GetChild("Unit_id",fld_child) file://獲得Unit_id欄位下拉資料視窗的控制代碼 If rtncode = -1 Then MessageBox("錯誤!", "不是下拉資料視窗!") fld_child.SetTransObject(SQLCA) file://設定事務對象 ls_sql = Lower(fld_child.GetSQLSelect())// 獲得DDDW的SQL語句 // 去除Sql 語句中的Where條件子句, 如原Sql 語句中須有Where條件子句,此處則需進行較 file://複雜的處理,應視具體情況而定。 if Pos(ls_sql, " where ")>0 then ls_sql = Left(ls_sql,Pos(ls_sql, " where ")) file://重新設定Sql 語句中的Where條件子句 ls_deptid=dw_1.Object.dept_id[GetRow()] file://取得當前dept_id選定值 ls_sql = ls_sql + " Where dept_id = '" +Trim(ls_deptid)+"'" file://重新設定Sql 語句 fld_child.SetSQLSelect(ls_sql) fld_child.Retrieve()//取得滿足條件的資料 |
6、在應用dddw的Open事件中寫入:Open(w_main)
至此,應用建立完畢,已可運行。
註:在Win98/WindowsXP、PowerBuilder8.0/PowerBuilder7.0/PowerBuilder6.5下通過。
補充說明:
(一)、ODBC資料來源設定
開啟Windows作業系統的“開始”菜單--à設定--à控制台--àODBC資料來源,出現“ODBC資料來源管理器”視窗,在“系統DSN”頁簽中點擊“添加(D)…”按鈕,出現“建立新資料來源”視窗,雙擊列表框中“Adaptive Server Anywhere 7.0”選項,即彈出“ODBC Configuration for Adaptive Server…”視窗,在ODBC標籤頁的“Data source name”文字框中輸入SmpDB, 在Database標籤頁的Database name文字框輸入SmpDB, Database file文字框輸入帶路徑的資料庫檔案名及尾碼,如資料庫SmpDB.db在C:/Program Files/Sybase/Adaptive Server Anywhere 7.0檔案夾中,此處即輸入C:/Program Files/Sybase/Adaptive Server Anywhere 7.0/SmpDB.db,或點擊“Browse…”按鈕選擇資料庫檔案,然後點擊“確定”按鈕,ODBC資料來源即設定完畢。其他資料來源可參照設定。
(二)、PowerBuilder8.0有關問題
PowerBuilder8.0中建立應用先須建立(或開啟)WorkSpace(*.pbw)檔案,其他動作基本同PowerBuilder7.0。本樣本在PowerBuilder8.0中運行需如下三個檔案:dddw.pbl, dddw.pbw,dddw.pbt(已壓縮在dddw_db.zip中)。(-)為PowerBuilder8.0中編輯本樣本的主視窗w_main的樣圖。
樣本在PowerBuilder6.0/6.5、PowerBuilder7.0、PowerBuilder8.0中的運行結果圖見下面附圖。
圖(-)PowerBuilder8.0中編輯本樣本的主視窗w_main |
附1 樣本在PowerBuilder6.0/6.5中的運行結果圖
附2 樣本在PowerBuilder7.0中的運行結果圖
附3 樣本在PowerBuilder8.0中的運行結果圖