Year,Month,Day:Word;
begin
DecodeDate(AField.Value,Year,Month,Day);
if Assigned(AYear.ActionValue) then
Year:=AYear.ActionValue.Values[0];
if Assigned(AMonth.ActionValue) then
Month:=AMonth.ActionValue.Values[0];
if Assigned(ADay.ActionValue) then
Day:=ADay.ActionValue.Values[0];
if (EncodeDate(Year,Month,Day) <> dsaOrders.DataSet.FieldByName(AField.FieldName).AsDateTime) then
dsaOrders.DataSet.FieldByName(AField.FieldName).AsDateTime:=
EncodeDate(Year,Month,Day);
end;
procedure TdmData.AdaptSaleDate_YearUpdateValue(Sender: TObject;
Value: Variant);
begin
UpdatePartDate(AdaptSaleDate,AdaptSaleDate_Year,AdaptSaleDate_Month,
AdaptSaleDate_Day);
end;
嘿 ! 我 沒 寫 錯 , 我 只 寫 了 一 個 AdaptSaleDate_Year.OnUpdateValue 函 式 , 那 這 樣 可 以 更 新 三 個 欄 位 嗎 ? 如 果 使 用 者 只 修 改 了 月 怎 麼 辦 ? 這 牽 扯 到 WebSnap 如 何 判 定 使 用 者 是 否 修 改 了 網 頁 中 的 資 料 , 其 實 很 簡 單 , 她 只 需 要 將 ActionValue 中 的 值 與 現 行 的 值 做 比 對 , 當 其 中 有 一 個 值 不 同 時 , 就 會 進 行 Update 的 動 作 , 這 也 就 是 說 當 網 頁 中 的 值 被 改 變 , 並 且 執 行 了 Apply Action 時 , WebSnap 會 進 行 現 行 值 與 ActionValue 的 比 對 動 作 , 當 有 一 個 值 不 同 時 , 就 進 行 Update 的 動 作 , 而 且 會 呼 叫 所 有 的 AdapterField 中 的 OnUpdateValue 事 件 , 這 也 是 我 為 何 可 以 只 寫 一 個 事 件 就 可 以 Update 3 個 欄 位 的 原 因 , 諸 如 此 類 的 小 陷 阱 在 WebSnap 中 到 處 都 是 , 懂 得 利 用 她 們 的 話 , 對 程 式 的 效 率 會 有 相 當 大 的 幫 助 。
12-2 Postback 技 術
接 下 來 我 們 將 介 紹 如 何 在 WebSnap 中 運 用 Postback 技 術 , 這 個 技 術 可 以 讓 我 們 處 理 Lookup Field 的 問 題 , 請 你 回 到 DELPHI IDE 中 , 加 入 兩 個 Table 及 一 個 DataSource 到 Web DataModule 中 , 並 設 定 她 們 的 TableName 分 別 為 Items( 訂 單 明 細 檔 ) 、 Employee( 員 工 檔 ) , 將 Items 與 Orders 設 定 為 Master-Detail 關 係 :
然 後 加 入 一 個 DataSetAdapter , 連 結 至 Items Table , 並 新 增 一 個 DataSetValueList 連 結 至 Employee Table , 並 將 她 的 NamedField 設 為 EmpNo:
接 著 開 啟 dsaOrders 的 Fields Designer 加 入 一 個 AdapterField , 這 是 用 來 顯 示 員 工 名 稱 的 欄 位 :
然 後 選 擇 AdaptEmpNo 這 個 AdapterField , 將 她 的 ValueList 設 為 dsvlEmployee ( 員 工 資 料 的 DataSetValueList 元 件 ):
完 成 後 我 們 就 可 以 開 始 撰 寫 相 關 的 程 式 碼 , 我 們 必 須 加 入 一 個 私 有 變 數 到 這 個 Module 中 , 這 是 為 了 識 別 目 前 的 狀 態 是 否 為 Postback , 亦 或 是 一 般 情 況 :
private
FIsPostBack:Boolean;
接 著 是 取 得 員 工 名 稱 的 AdaptEmpName.OnGetValue 事 件 :
procedure TdmData.AdaptEmpNameGetValue(Sender: TObject;
var Value: Variant);
var
LocateValue:Integer;
begin
if not tbEmployee.Active then tbEmployee.Open;
if Assigned(AdaptEmpNo.ActionValue) and FIsPostBack then
LocateValue:=AdaptEmpNo.ActionValue.Values[0]
else
LocateValue:=AdaptEmpNo.Value;
if tbEmployee.Locate(''''EmpNo'''',LocateValue,[]) then
Value:=tbEmployee.FieldByName(''''LastName'''').AsString+'''' ''''+
tbEmployee.FieldByName(''''FirstName'''').AsString
else
Value:='''''''';
end;
為 了 維 持 Postback 後 的 資 料 , 我 們 還 要 撰 寫 一 個 事 件 , 那 就 是 AdaptOrderNo.OnGetValue 事 件 :
procedure TdmData.AdaptOrderNoGetValue(Sender: TObject; Field: TField;
var Value: Variant);
begin
if Assigned(TDataSetAdapterField(Sender).ActionValue) and
FIsPostBack then
Value:=TDataSetAdapterField(Sender).ActionValue.Values[0]
else
Value:=Field.Value;
end;
將 這 個 事 件 設 定 給 AdaptCustNo,AdaptEmpNo,AdaptSaleDate,AdaptOrderNo 這 四 個 AdapterField:
最 後 開 啟 dsaOrders 的 Action Designer 加 入 一 個 AdapterAction , 並 撰 寫 相 關 的 程 式 碼 就 完 成 了 Postback 的 基 本 功 能 了 :
procedure TdmData.ActionPostBackExecute(Sender: TObject; Params: TStrings);
var
vLocateParams:TLocateParams;
begin
FIsPostBack:=True;
vLocateParams:=dsaOrders.LocateParamsList.Add;
vLocateParams.AdapterName:=dsaOrders.Name;
vLocateParams.AddParam(''''OrderNo'''',AdaptOrderNo.ActionValue.Values[0]);
dsaOrders.Locate;
end;
procedure TdmData.ActionPostBackAfterGetResponse(Sender: TObject;
Params: TStrings);
begin
FIsPostBack:=False;
end;
請 開 啟 原 來 的 Edit Module , 重 新 設 計 網 頁 的 畫 面 , 將 LayoutGroup2.DisplayColumns 設 成 4 , 接 著 加 入 EmpNo 、 EmpName 這 兩 個 欄 位 , 將 EmpName 的 Caption 清 空 , 並 且 把 ViewMode 設 為 vmDisplay:
然 後 在 AdapterCommandGroup2 中 加 入 我 們 剛 剛 新 增 的 Postback Action:
接 著 把 她 的 DisplayType 特 性 設 成 ctAnchor , PageName 設 為 Edit:
完 成 後 請 切 到 HTML 這 一 頁 , 你 會 找 到 下 面 的 這 段 HTML 碼 , 將 她 複 製 起 來 :
回 到 Browser 頁 , 選 擇 LayoutGroup1 中 的 EmpNo 欄 位 , 將 上 面 那 段 碼 貼 到 Custom 特 性 值 中 , 將 onclick 改 成 onchange:
完 成 後 將 AdapterCommandGroup2 中 的 Postback Action 刪 除 掉 , 並 在 AdapterPageProducer 上 按 右 鍵 , 新 增 一 個 AdapterForm , 這 是 用 來 顯 示 明 細 資 料 用 的 , 在 她 之 中 新 增 一 個 AdapterGrid , 連 結 至 dsaItems ( 訂 單 明 細 檔 的 DataSetAdapter):
這 樣 就 完 成 了 Postback 的 技 術 了 , 執 行 畫 面 如 下 :
在 這 個 技 術 中 我 們 學 到 了 如 何 運 用 Custom 加 入 Client-Side Script , 並 且 利 用 她 來 完 成 我 們 的 Postback 技 術 , 這 個 技 術 相 當 有 趣 , 你 可 以 試 著 將 CustNo 也 改 成 同 樣 的 Select , 相 信 你 會 得 到 許 多 靈 感 !
本 章 後 記
Postback 技 術 在 撰 寫 資 料 庫 網 頁 中 是 很 重 要 的 , 幾 乎 是 不 可 缺 的 , 上一页 [1] [2] [3] 下一页 [聊天工具]Gmail推出新功能:Web Clip__天极Yesky [聊天工具]Web MSN你玩了吗__天极Yesky [系统软件]Web Browser Express 概述 [系统软件]对Internet Explorer Web 控件做一点修改 [常用软件]小技巧:三步实现Web迅雷录制PPLive节目 [常用软件]天网防火墙:打开WEB和FTP服务 [VB.NET程序]使用VB.Net做一个配置web.config功能的WinForm(原… [VB.NET程序]vb.net控件、web service简述 [VB.NET程序]使用vbscript脚本调用web服务 [VB.NET程序]*** Web 存储系统窗体:窗体注册表 (new)***
|