CB2009 TSQLQuery Public Event 如何使用? |
答題得分者是:GrandRURU
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
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
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
一、因為繼承的物件有通用,所以看得到卻無法使用。
二、你可以參考 [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 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
謝謝 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
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
呃…看得出來是很繁鎖的流程
沒有正規不正規,能解決問題的就是正規! 以下是個人淺見: 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 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
看了 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 屬性嗎? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |