全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:889
推到 Plurk!
推到 Facebook!

datasnap 如何觸發 tirgger 的功能

答題得分者是:pcplayer99
P.D.
版主


發表:564
回覆:3841
積分:3617
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-02-02 15:49:48 IP:59.120.xxx.xxx 未訂閱
請問各位

我的 server 端是搭 FireBird 2.x版資料庫, 使用 ClientDataSet(cds) 透過DataSanp 連結到工作端的電腦,
而在我的 xxx.gdb(Server端)的 Table 內含一個Trigger 的設定, 以往使用 IBX 元件可以指定IBQuery 要觸發的 Trigger name
但前端使用 cds 連 FB 時, 有沒有什麼方法可以在
ClientDataSet1.Append 時去觸發該 gdb 的 Trigger(這個Trigger 是 FireBird 自動累加序號的function),
而不用再寫另一個 Query 來取得 FB Trigger 自動產生出來的值?

謝謝!
leveon
資深會員


發表:29
回覆:381
積分:297
註冊:2012-02-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-02-05 20:04:18 IP:220.132.xxx.xxx 未訂閱
只能自己想辦法取值

http://docwiki.embarcadero.com/Libraries/Seattle/en/Data.DB.TDataSet.OnNewRecord

OnNewRecord 可能是個時機點




===================引 用 P.D. 文 章===================
請問各位

我的 server 端是搭 FireBird 2.x版資料庫, 使用 ClientDataSet(cds) 透過DataSanp 連結到工作端的電腦,
而在我的 xxx.gdb(Server端)的 Table 內含一個Trigger 的設定, 以往使用 IBX 元件可以指定IBQuery 要觸發的 Trigger name
但前端使用 cds 連 FB 時, 有沒有什麼方法可以在
ClientDataSet1.Append 時去觸發該 gdb 的 Trigger(這個Trigger 是 FireBird 自動累加序號的function),
而不用再寫另一個 Query 來取得 FB Trigger 自動產生出來的值?

謝謝!
P.D.
版主


發表:564
回覆:3841
積分:3617
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-02-11 21:07:42 IP:118.169.xxx.xxx 未訂閱
感謝 leveon 指導, 但這個方法並不能對 trigger 觸發事件, 可能只能自己再寫一段取值去找出最大號再手動填入了!
leveon
資深會員


發表:29
回覆:381
積分:297
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2017-02-12 13:17:24 IP:220.132.xxx.xxx 未訂閱
基本上 這是基於你的提問做的回答
"ClientDataSet1.Append 時去觸發該 gdb 的 Trigger"


Function GetNO:string;
begin
result := 自己取回序號;
end;


procedure TForm1.ClientDataSet1NewRecord(DataSet: TDataSet);
begin
DataSet.fieldbyname('NO').asstring := GetNO;
end;

當ClientDataSet1.Append 時 便會觸發Clientdataset 上的OnNewRecord事件
並且填入序號

如果你試不行 或這不是你要的 你應該詳述你想要的效果才有辦法討論





===================引 用 P.D. 文 章===================
感謝 leveon 指導, 但這個方法並不能對 trigger 觸發事件, 可能只能自己再寫一段取值去找出最大號再手動填入了!
P.D.
版主


發表:564
回覆:3841
積分:3617
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2017-02-13 12:42:22 IP:59.120.xxx.xxx 未訂閱
感謝提供方法, 我先試著做看看, 如果還是不行, 再把整個trigger 的過程發上來, 謝謝!
===================引 用 leveon 文 章===================
基本上 這是基於你的提問做的回答
"ClientDataSet1.Append 時去觸發該 gdb 的 Trigger"


Function GetNO:string;
begin
result := 自己取回序號;
end;


procedure TForm1.ClientDataSet1NewRecord(DataSet: TDataSet);
begin
DataSet.fieldbyname('NO').asstring := GetNO;
end;

當ClientDataSet1.Append 時 便會觸發Clientdataset 上的OnNewRecord事件
並且填入序號

如果你試不行 或這不是你要的 你應該詳述你想要的效果才有辦法討論





===================引 用 P.D. 文 章===================
感謝 leveon 指導, 但這個方法並不能對 trigger 觸發事件, 可能只能自己再寫一段取值去找出最大號再手動填入了!
pcplayer99
尊榮會員


發表:141
回覆:733
積分:584
註冊:2003-01-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2017-03-21 14:50:12 IP:183.239.xxx.xxx 未訂閱
我用 FireBird 没用过 InterBase。不过看起来应该差不多。

最大号的话,用 Generator 来产生,保证最大唯一。

用一个 procedure 来生成这个 Generator 的最大号。

然后,如果你要在 DataBase 里面,当有一条新的 record 进去的时候,自动填入最大号,就要自己在 DataBase 里面写 trigger 了。这样做完,基本上就是一个 AutoInc 类型的 Field 。

不过我自己喜欢在客户端, ClientDataSet.AfterInsert 的地方,将 FireBird 的 procedure 产生的最大号拉过来,填入 ClientDataSet 的 Field 里面。

办法是在服务器端,有一个 DBExpress 或者 FDStore 之类的元件,对应 FireBird 的 procedure,然后它的参数就自动对应到这个 procedure 的 out 参数,也就是那个最大号。然后用一个 DataSetProvider 输出,在客户端,拉一个 ClientDataSet 来对应它。然后,这个 ClientDataSetMaxNo.Execute,MaxNo := ClientDataSetMaxNo.Params[0].Value 就可以拿到由 FireBird 产生的最大号。
P.D.
版主


發表:564
回覆:3841
積分:3617
註冊:2006-10-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2017-03-25 15:18:28 IP:220.136.xxx.xxx 未訂閱
感謝 pc兄的指點, 已經解決了, 我再把部份詳述一下 (以下環境是 Win7 + Berline 10.1 U2 + Win32 Vcl 模組)

1. 在 RestServer 端的 ServerMethodunit 上拉 FDconnect, DataSetProvider, FDStoredProc 三組元件, 並串連好關係
2. FDconnect 指定好 Firebird 資料庫來源及 Driver (FB) 並啟動它(Connect true)
3. FDStoredProc 的Properity 中的 StoredProcName 應該就可以看到 FB 原已設定的 Generator (是StoreProcedure 型式), 並指定正確的procname
4. 在 FDStoredProc 的 FieldEditor 內加入該 Generator 指定的變數(以Add Fields 即可拉進來)
5. 儲存, 編譯, RUN DataSnap Server 起來

6. 在 Client 端, 原本存取 ClientDataSet 的 DataModule 中, 拉一個新的 ClientDataSet1, 把上面的 DataSetProvider 當成一個 Server來源加入到 ClientDataSet1 中(即指定要處理的ProviderName), 一樣在 ClientDataSet1 的 FieldEditor 內把Server端的欄位導入進來
7. 在 ClientDataSet1 的事件 (AfterExecute) 中寫一行指定 MaxNo1 := ClientDataSet1.Params[0].Value
(maxno1 是宣告一個 public 變數, 在 DataMoudle上)
以及在 AfterInsert 中寫入 ClientDataSet1.Execute;
8.最後在實作部份, 於要新增一筆Record 的地方撰寫
with DataMoudle1 do
begin
ClientDataSet1.Open;
ClientDataSet1.Append;
showmessage(.maxno1.tostring) -> 這裡就會令 server端的 generator 的值自動加1, 同取回最大號了, 再做一次也會自動加值, 我們完全無須手動處理理會
end;

實在感謝 pc兄的說明, 解決了我一大難題, 因為我所有的 firebird 資料庫均有使用 generator 的做法, 如果不能解決, 程式完全不能繼續下去了!



編輯記錄
P.D. 重新編輯於 2017-03-25 15:23:13, 註解 無‧
系統時間:2017-05-28 1:24:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!