close

Datawindow 可以讓你設定 retrieve argument,有多少個或類型是什麼都需要預先寫死,在retrieve 的時候一個都不能少,沒彈性可言,但有方法改變這現實嗎?當然有,不然我提這個幹嘛?

方法是這樣的:

  1. 取出原 sql (GetSQLSelect())
  2. 拼湊 where statement
  3. 原 sql 跟 where statement 合併成新 sql
  4. 新 sql 放進 Datawindow 並 retrieve (SetSQLSelect())
  5. 還原原 sql 到 Datawindow (SetSQLSelect())

還是圖比 SQL 好看,弄成圖了:

image


這次 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)


有三點要補充釋一下:

  1. 在 Datawindow sql 加 「 where 1 = 1」,是為了在併湊時不用額外檢查有沒有「where」,直接加上「and … 」的就可以了。
  2. 不要在 Datawindow 加 order by,否則加上的 where statement 就會變成放了在order by 之後 ,導致 sql 語法錯誤了。
  3. 原sql 最好在 open event 就先取好,這可避免在後來放了別的東西。
arrow
arrow
    創作者介紹
    創作者 過時程式員 的頭像
    過時程式員

    過時程式員的部落格

    過時程式員 發表在 痞客邦 留言(0) 人氣()