PB中相關聯下拉資料視窗的實現

來源:互聯網
上載者:User
  近日在開發過程中遇到使用下拉資料視窗的情況:資料表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中的運行結果圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.