Datawindow 可以讓你設定 retrieve argument,有多少個或類型是什麼都需要預先寫死,在retrieve 的時候一個都不能少,沒彈性可言,但有方法改變這現實嗎?當然有,不然我提這個幹嘛?
方法是這樣的:
- 取出原 sql (GetSQLSelect())
- 拼湊 where statement
- 原 sql 跟 where statement 合併成新 sql
- 新 sql 放進 Datawindow 並 retrieve (SetSQLSelect())
- 還原原 sql 到 Datawindow (SetSQLSelect())
還是圖比 SQL 好看,弄成圖了:
這次 Datawindow (dw_list)裏的 SQL 長這樣,不需要 retrieve arguments ,sql 要加 where 1 = 1,不能加 order by:
Select year, class, studend_id, student_name, join_date
From student
Where 1 = 1
// 程式內代碼
// 定義變量
String ls_org_sql, ls_new_sql, ls_where
//在 GetSQLSelect()前必須先指定 transaction,否則會取出 PB 版的 sql,這不能用於拼湊,想知道原因就取出來對比一下
Dw_list.SetTransObject(SQLCA)
// 取得 dw_list 原 sql 語句
ls_org_sql = dw_list.GetSQLSelect()
// 從畫面上取得用戶輸入的查詢條件
ls_where = " and class = '" + '2020' + "'"
ls_where = ls_where + " and student_id = '" + '1' + "'"
// 併湊新 sql
ls_new_sql = ls_org_sql + ls_where
// 把新 sql 放到 dw_list
dw_list.SetSQLSelect(ls_new_sql)
dw_list.Retrieve()
// 還原 sql
dw_list.SetSQLSelect(ls_org_sql)
有三點要補充釋一下:
- 在 Datawindow sql 加 「 where 1 = 1」,是為了在併湊時不用額外檢查有沒有「where」,直接加上「and … 」的就可以了。
- 不要在 Datawindow 加 order by,否則加上的 where statement 就會變成放了在order by 之後 ,導致 sql 語法錯誤了。
- 原sql 最好在 open event 就先取好,這可避免在後來放了別的東西。