線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1798
推到 Plurk!
推到 Facebook!

CB2009 TSQLQuery Public Event 如何使用?

答題得分者是:GrandRURU
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-03 17:56:58 IP:211.72.xxx.xxx 訂閱
TQuery 的 BeforeEdit, BeforeInsert, AfterEdit, AfterInsert 等皆為 Published,
但 TSQLQuery 的都變成了 Public.
請問, Design-Time TSQLQuery 之 Object Inspector 無這些 Event 可 Click,
則要如何設計這些 Event 的 Code ?

抱歉! 弄混淆了! TSQLQuery 是 ReadOnly 只准往下單向 Next() 的, 故不可能有 AfterEdit 等.
只是有點搞不懂, 為何提供 Public 的 AfterEdit 等?

又 TSimpleDataSet 有點類似 TQuery, 但無類似 TQuery->UpdateObject,
若不想直接 Post 到後端, 而想透過 TSQLStoredProc 做 Post,
(以往用 TUpdateObject 做 Update 另一個 Table 以完成 Post 動作,
再用 TStoredProc 傳真正的 Record Data 給 Server 之 StroredProcedure 做 Insert 與 Update)
不知可有何恰當的方法?
編輯記錄
herbert2 重新編輯於 2008-11-03 20:00:35, 註解 無‧
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-03 19:55:37 IP:118.167.xxx.xxx 未訂閱
DBX大部份是唯讀元件,基本上是不能用這些東東的

如果有特殊需求,請用SIMPLEDATASET或是ClientDataSet吧!
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-03 20:07:38 IP:211.72.xxx.xxx 訂閱
謝謝指正! 因一直使用 BCB5, 對 DBExpress 不熟, 弄錯了!
但有新的問題如 #1 修改之內文, 可否撥冗賜教!

===================引 用 GrandRURU 文 章===================
DBX大部份是唯讀元件,基本上是不能用這些東東的

如果有特殊需求,請用SIMPLEDATASET或是ClientDataSet吧!
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-03 21:17:26 IP:118.167.xxx.xxx 未訂閱
一、因為繼承的物件有通用,所以看得到卻無法使用。

二、你可以參考
[code cpp]
SimpleDataSet->ApplyUpdates(0);
[/code]
將上述的程式放在
OnAfterPost事件之後。

其實我蠻好奇你的StoredProc內容是怎麼寫的(因為我不會用......(汗)),能給個參考嗎?

===================引 用 herbert2 文 章===================
只是有點搞不懂, 為何提供 Public 的 AfterEdit 等?

又 TSimpleDataSet 有點類似 TQuery, 但無類似 TQuery->UpdateObject,
若不想直接 Post 到後端, 而想透過 TSQLStoredProc 做 Post,
(以往用 TUpdateObject 做 Update 另一個 Table 以完成 Post 動作,
再用 TStoredProc 傳真正的 Record Data 給 Server 之 StroredProcedure 做 Insert 與 Update)
不知可有何恰當的方法?
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-03 22:50:12 IP:211.72.xxx.xxx 訂閱
謝謝 GrandRURU 兄台如此快速的回覆!
當初是考慮有很多重複的防止, 不是 Primary Key 可解決, 例如:
Key1 Key2 Key3 為 Unique, Key2 可以重複, 但新舊兩 Row 之 Key1 在一定條件下也要算是重複.
最明顯例子: Key1 年月, Key2 發票號碼, Key3 進銷別,
當 Key1 Key2 重複, Key3 一為銷貨, 另一為退貨, OK. 但另一 Key3 為銷貨或進貨則不准 Pass.
(因不可能進貨與銷貨同一張發票, 銷貨不會兩張同號, 但同一張發票可退貨多次 . . . . .)
又 Key2 Key3 重複, Key3 都為進貨, 但 Key1 相距 3 年以上 OK, 否則不准 Pass.
(因發票號不斷循環, 約 3年便有可能會重複)
類似此種邏輯, 實難以簡單的 Primary Key 可解決.

故, 先於 BeforePost 將 Record 各 Field 之 Data 以 Char(1) 分隔, 包裝成一 VARCHAR2
(因無法傳出 Cursor, 只好變通一下) 傳給 Server 之 Stored Procedure,
由它進行解析回各 Column 值進行 Insert 或 Update 前之參照、相依、重複等之檢查,
OK 後才 Insert 或 Update 進 Table, 並傳回成功與否之代碼與 Error Message.

若後端傳來失敗代碼, 則於 BeforePost 便 Abort 讓 User 依 Message 繼續進行編輯或 Cancel.
若後端傳來成功代碼, 則用 TQuery->TUpdateObject = TUpdateSQL
(各 SQL 皆用 Update MyTable SET Col1 = 1, MyTable 只有一欄, 只有一 Row,
用 Trigger 防止 Insert、Delete) 讓 TQuery 進行 Post 以騙過 TQuery,
令其相信已 Insert、Update、Delete 完成.

或許這是很不正規的作法, 但卻可以完成很多奇怪的檢查規則.
不知 GrandRURU 兄有良方可供參考?
GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-03 23:54:06 IP:118.167.xxx.xxx 未訂閱
呃…看得出來是很繁鎖的流程
沒有正規不正規,能解決問題的就是正規!

以下是個人淺見:
SQLConnection的屬性中,有一個項目是「Transaction」
也就是「交易模式」;以下是相關的討論串
https://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=69963

啟動交易模式之後,再進行你所需要的動作,當一切流程都沒有拋出例外時才進行commit
否則就rollback
這樣就可以確保資料都會正常寫入

以上。

===================引 用 herbert2 文 章===================
43...
故, 先於 BeforePost 將 Record 各 Field 之 Data 以 Char(1) 分隔, 包裝成一 VARCHAR2
(因無法傳出 Cursor, 只好變通一下) 傳給 Server 之 Stored Procedure,
由它進行解析回各 Column 值進行 Insert 或 Update 前之參照、相依、重複等之檢查,
OK 後才 Insert 或 Update 進 Table, 並傳回成功與否之代碼與 Error Message.

若後端傳來失敗代碼, 則於 BeforePost 便 Abort 讓 User 依 Message 繼續進行編輯或 Cancel.
若後端傳來成功代碼, 則用 TQuery->TUpdateObject = TUpdateSQL
(各 SQL 皆用 Update MyTable SET Col1 = 1, MyTable 只有一欄, 只有一 Row,
用 Trigger 防止 Insert、Delete) 讓 TQuery 進行 Post 以騙過 TQuery,
令其相信已 Insert、Update、Delete 完成.

或許這是很不正規的作法, 但卻可以完成很多奇怪的檢查規則.
不知 GrandRURU 兄有良方可供參考?
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-04 08:12:40 IP:211.72.xxx.xxx 訂閱
看了 ashxin2002 版主與 gdennis 兄的提示, 完全瞭解.
當初用 BDE TQuery 原也擬如此使用, 但這樣則每個 Table 都需設 Insert 與 Edit 之 Trigger,
對整個系統而言, 因同時又要 Update 多個 Table, 常造成觸發多個 Table 之 Trigger 而造成問題,
故才改用 Server 之 Stored Procedure 寫整個 Transection,
由 Stored Procedure 控制 Commit 或 Rollback, 不想由前端直接將 Record Data 存入 Table.

看來, CBC 自新加了 ADO, DBX 以來, 都不再提供 TUpdateSQL 的方式,
故若想不由前端直接將 Record Data 存入 Table, 將會是一件很難達成的任務,
(因 LookUp Field 設計得不是很好用, 無法有複雜的 Filter 條件或連結不同的 Table, 故不採用;
所以 Edit 者常是多 Table Join 之 View, 根本無法直接 Post 至後端 Table.)
可能須再好好想想, 重新擬定一個新流程來解決.

又, AfterEdit 等用 Public 屬性還是令我覺得奇怪, 一般只供繼承用者, 不是都用 Protect 屬性嗎?
系統時間:2017-10-23 23:20:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!