在PowerScript腳本中訪問數據窗口中的數據

在PowerScript腳本中訪問數據窗口中的數據


張健姿
01-6-22 下午 03:50:25


在4.0 以 前 的 版 本, 如 果 您 想 在PowerScript 腳 本 中 訪 問數 據 窗 口 中 的 數 據, 方 法 只 有 一 種, 那 就 是 使 用SetItem 和GetItem 系 列 的 函 數, 指 定 您 所 要 訪 問 的 某 一 行 列 的 值, 這 一 方 法的 局 限 性 在 於 您 一 次 只 能 訪 問 到 一 個 數 值。 而 在5.0 版 中,PowerBuilder 拓 展 了 數 據 窗 口 的 屬 性, 使 數 據 窗 口 中 的 數 據 成 爲 了 該對 象 的 一 個 屬 性, 而 使 用 戶 可 以 象 訪 問 其 它 對 象 屬 性 一樣 直 接 訪 問 數 據 窗 口 的 數 據 了。 這 樣 我 們 就 有 了 兩 種 訪問 數 據 的 方 法 了。
1. 傳 統 的 使 用SetItem 和GetItem 系 列 函 數, 如:
dw_1.SetItem(1, "empname", "Phillips")
ls_name = dw_1.GetItemString(1, "empname")
2. 表 達 式 的 方 法, 這 種 方 法 可 以 指 定 某 一 列、 某 一行、 某 一 塊、 或 是 用 戶 選 中 的 行 列、 甚 至 整 個 數 據 窗 口 控件 的 全 部 數 據, 如:
dw_1.Object.empname[1] = "Phillips"
dw_1.Object.Data[1,1] = "Phillips"
這 兩 種 方 法 都 可 以 允 許 用 戶 指 定 特 定 的 數 據 緩 衝區, 也 就 是 說 您 採 用 任 何 一 種 方 法 都 可 以 訪 問 到 數 據 被修 改 前 的 原 始 值、 被 過 濾 掉 的 值、 被 刪 去 的 值 及 當 前 值 等。
在 大 多 數 情 況 下, 您 可 以 採 用 這 兩 種 方 法 中 的 任 一種, 但 這 兩 種 方 法 在 使 用 時 也 是 各 有 利 弊 的。
如 果 您 只 是 要 訪 問 某 行 某 列 的 一 個 數 值, 兩 種 方 法在 執 行 效 率 上 是 基 本 相 同 的 的。
如 果 您 打 算 採 用 數 據 窗 口 的 列 名 而 不 是 數 值 來 表示 某 一 列, 而 這 一 列 的 列 名 在 運 行 前 又 不 知 道, 或 是 要 根據 用 戶 的 不 同 輸 入 來 決 定, 那 您 只 能 採 用 函 數 法, 因 爲 這一 方 法 可 以 動 態 地 改 變 列 名。
如 果 您 需 要 訪 問 的 數 據 不 止 一 列, 而 是 確 定 範 圍 的多 行 多 列, 那 您 採 用 表 達 式 法 將 獲 得 更 高 的 效 率。
表 達 式 法 是PowerBuilder5.0 新 增 加 的 功 能, 雖 說 這 種 方法 可 使 得 數 據 窗 口 的 面 向 對 象 的 特 性 更 爲 明 顯, 語 言 的表 達 也 更 爲 直 觀, 易 於 使 旁 觀 者 閱 讀 他 人 的 程 序 時 容 易看 懂, 但 是 這 種 方 法 的 語 法 形 式 卻 是 很 復 雜 多 樣, 使 用 起來 卻 不 太 容 易。
總 體 上 講, 表 達 式 的 語 法 可 以 分 成3 組:
直 接 指 定 列 名 稱 法: 如 果 您 事 先 知 道 您 需 要 訪 問 數 據的 列 名, 而 且 僅 訪 問 這 一 列, 可 以 採 用 這 種 方 法。
選 擇 這 一 控 件 中 一 條 記 錄 或 多 條 記 錄
dwcontrol.object.columnname {.buffer } {.datasource } { [ startrownum{, endrownum} ] }
我 們 在 前 面 的 專 題 中 曾 經 介 紹 過 關 於 數 據 窗 口 的四 個 緩 衝 區, 在 這 條 命 令 的 語 法 中buffer 選 項 就 可 以 選 擇Primary,Filter 或Delete 這 三 個 緩 衝 區, 缺 省 爲Primary;datasource 選 項 爲Current 或Original, 缺 省 爲Current。 如 果 您 選 擇Original, 則 系 統 將 到數 據 窗 口 的Original 緩 衝 區 中 去 讀 取 數 據, 顯 然Original 緩 衝區 是 只 讀 的, 您 不 能 對 其 賦 值。 在 後 面 的 方 括 號 中, 您 可以 指 定 您 打 算 訪 問 的 這 一 列 中 的 起 止 記 錄 數, 如 果 只 是一 條 記 錄, 您 在StartRownum 中 指 定 行 號 就 可 以 了; 如 果 方 括號 中 兩 個 參 數 全 部 缺 省, 則 指 這 一 列 的 全 部 記 錄。
例 如:
string ls_name
ls_name = dw_1.Object.name[1]
又 如:
dw_1.Object.salary[8,12] = id_salary
id_salary 是 一 個 數 組, 如 果 其 中 只 有 四 個 元 素, 則 第12 行salary 的 值 爲 空。
選 擇 這 個 數 據 窗 口 控 件 中 加 亮 的 記 錄
dwcontrol.Object.columnname {.Primary }{.datasource } .Selected
在 數 據 窗 口 中 加 亮 的 記 錄 就 是 您 曾 經 使 用 過SelectRow 函 數 對 其 進 行 加 亮 表 示 這 一 行 選 中 的 記 錄。 顯 然, 對 這 一特 性 數 據 的 訪 問 只 能 是Primary 緩 衝 區 中 的, 不 過 數 據 源 仍然 可 以 選 擇 是 當 前 還 是 原 始 的。 如 果 選 擇 原 始, 也 就 是 說您 得 到 的 數 據 是 從 數 據 庫 中 查 到 的, 修 改 前 的 數 據。
例 如:
string ls_name
ls_name = dw_1.Object.name.Selected
使 用 數 值 來 表 示 列:
dwcontrol.Object.Data {.buffer } {.datasource } [ startrownum, startcolnum,
endrownum, endcolnum ]
我 們 知 道 在SetItem 和GetItem 系 列 的 函 數 中, 對 列 的 表達 既 可 以 用 列 名 也 可 以 採 用 數 值 指 示, 在 這 裏 也 是 同 樣。如 果 我 們 採 用 數 值 指 代 列 名 的 方 法, 同 上 一 種 比 較, 我 們要 將 列 名 換 成 了 關 鍵 詞Data, 在 後 面 的 方 括 號 中, 參 數 變成 了 四 個。 這 一 表 達 式 的 返 回 值 將 是 一 個 結 構 數 組, 或 是一 個 用 戶 對 象。 必 須 注 意, 您 所 定 義 的 結 構 或 用 戶 對 象 必須 與 數 據 窗 口 的 這 幾 列 的 數 據 類 型 相 匹 配, 否 則PowerBuilder 將 出 現 錯 誤。
對 整 行 記 錄 的 操 縱:
dwcontrol.Object.Data {.buffer } {.datasource } { [ rownum ] }
這 一 種 方 法 是 上 一 種 方 法 的 特 例, 如 果rownum 中 的 數值 缺 省, 將 表 示 整 個 數 據 窗 口 的 全 部 數 據。
例 如 數 據 窗 口 中 的 列 名 及 數 據 類 型 是 這 樣 的:
ID (number)
name (string)
retired_status (boolean)
birth_date (date)
首 先 我 們 要 在 結 構 畫 筆 中 定 義 一 個str_empdata 的 數 據結 構。 它 包 括 四 個 元 素, 類 型 分 別 是:
integer, string, boolean 和date
執 行 下 列 代 碼:
str_empdata lstr_currdata[]
lstr_currdata = dw_1.Object.Data
這 樣lstr_currdata 結 構 中 數 組 的 上 界 將 用 數 據 窗 口 控件 中 記 錄 的 行 數 相 等, 並 完 成 了 賦 值。
我 們 還 可 以 用 這 種 方 法 指 定 這 一 控 件 中 高 亮 度 的行
dwcontrol.Object.Data {.Primary } {.datasource } .Selected
這 三 種 形 式 的 功 能 比 較 如 下:
訪 問 範 圍
語 法
訪 問 控 件 中 高 亮 度 的 行
1
一 列
dwcontrol.object.columnname{.buffer } {.datasource}
2
多 列
dwcontrol.object.data{.buffer } {.datasource}
不 能
3
一 條 記 錄 的 全 部 列
dwcontrol.object.data{.buffer } {.datasource}
能 在 使 用 這 些 語 句 時 我 們 要 注 意 以 下 幾 點:
同 使 用SetItem 和GetItem 系 列 函 數 一 樣, 在 編 譯 時PowerBuilder 將 不 檢 查 您 所 指 示 的 列 的 有 效 性, 您 必 須 自 行 檢 查 並 確保 引 用 的 有 效 性。
在 第 一 種 方 法 中 我 們 必 須 注 意 在 列 名 後 面 一 定 要有 所 後 綴, 例 如:
ld_salary[] = dw_1.object.emp_salary.primary
ld_salray = dw_1.object.emp_salary[5]
上 述 表 達 式 都 是 合 法 的, 但 是
ld_salary[] = dw_1.object.emp_salary
就 是 非 法 表 達 了。
因 爲dw_1.object.emp_salary 指 代 的 是 這 個emp_salary 列 的DWObject 對 象, 而 不 是 在emp_salary 列 中 的 數 據。 我 們 可 以 用dw_1.object.emp_salary 來 指 代 數 據 窗 口 中 的 對 象, 如:
integer li_data
DWObject dwo_empsalary
dwo_empsalary = dw_1.Object.emp_salary
FOR li_cnt = 1 to 100
li_data = dwo_empsalary[li_cnt]
.........
NEXT
這 種 表 達 式 法 返 回 的 數 據 類 型 是ANY 型 的,PowerBuilder 將 根 據“ 兼 容” 原 則 轉 換 數 據 庫 與PowerBuilder 的 數 據 類 型,因 此 如 果 您 調 用 的 重 載 函 數 要 使 用 表 達 式 法 得 到 數 據 窗口 的 數 據 作 爲 參 數, 建 議 您 一 定 使 用 一 個 強 制 轉 換 數 據類 型 的 函 數。 例 如:
wf_overload(real(dw_1.object.dept_id[1]))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章