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

datasnap 如何觸發 tirgger 的功能

尚未結案
P.D.
版主


發表:557
回覆:3833
積分:3614
註冊: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
積分:292
註冊: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.
版主


發表:557
回覆:3833
積分:3614
註冊:2006-10-31

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


發表:29
回覆:381
積分:292
註冊: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.
版主


發表:557
回覆:3833
積分:3614
註冊: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
尊榮會員


發表:139
回覆:727
積分:578
註冊: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 产生的最大号。
系統時間:2017-03-23 22:18:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!