主題:講解三層代碼講解--第三課(*****)
主講:A1
時間:2004-05-28 15:00
2004-05-28 15:02:12 煙灰缸
大家好。
2004-05-28 15:18:20 煙灰缸
我把Demo1簡單的說一下,這樣對下面才比較好講。
2004-05-28 15:18:26 煙灰缸
procedure TForm1.Button3Click(Sender: TObject);
begin
cdsDemo1.OpenStoreProc(100001);
end;
2004-05-28 15:19:03 煙灰缸
簡單的說,cdsDemo1是通知swServer說:我要100001号資料。
2004-05-28 15:19:18 煙灰缸
這一點大家都應該看得明白吧。
2004-05-28 15:19:52 斜陽
100001好像讓服務端執行的是一個存儲過程啊
2004-05-28 15:21:24 煙灰缸
實際是傳回的也是Data,隻不過是統一由OpenStoreProc來做而已
2004-05-28 15:22:17 斜陽
我這裡反不回來,因為沒有那個表和那個存儲過程
2004-05-28 15:22:37 煙灰缸
實際上也這下面這一段是一樣的
cdsDemo1.BeginOle;
cdsDemo1.Ole.StoreProcIndex := 100001;
cdsDemo1.Ole.Action := acOpenStoreProc;
cdsDemo1.OpenData(dmDefault);
2004-05-28 15:25:23 煙灰缸
意思更明了,
(1).cdsDemo1清除參數
(2).Ole參數指定存取過的的序号為100001
(3).Ole參數指定服務層的“小規則”為acOpenStoreProc
(4).指定“規則”為dmDefault,并打開傳回資料
2004-05-28 15:25:54 煙灰缸
dmDefault對應到dmDefault.dll
2004-05-28 15:26:06 八戒公子
噢,原來是調用了存儲過程,然後傳回資料。
2004-05-28 15:27:08 煙灰缸
存取過程不在SQLSERVER裡,而是在服務層動态中生成。
2004-05-28 15:27:55 煙灰缸
第二個
cdsDemo2.BeginOle;
cdsDemo2.Ole['@mm_State'] := edit1.Text;
cdsDemo2.OpenStoreProc(100002);
2004-05-28 15:28:04 八戒公子
存儲過程應該是存儲在伺服器中的啊。
2004-05-28 15:28:27 斜陽
怪不得我得不到資料
2004-05-28 15:28:29 煙灰缸
跟上面的差不多,隻是指定了參數。
2004-05-28 15:30:29 煙灰缸
if cdsDemo3.Modified then cdsDemo3.Post;
if cdsDemo3.ChangeCount > 0 then
begin
Cmd.BeginOle;
Cmd.Ole['Delta'] := cdsDemo3.Delta;
Cmd.Ole['KeyField'] := 'title_id';
Cmd.Ole['TableName'] := 'titles';
if Cmd.ApplyUpdates then
begin
cdsDemo3.MergeChangeLog;
ShowMessage('Update Success');
end;
end;
2004-05-28 15:30:40 煙灰缸
這個第三點
2004-05-28 15:33:22 煙灰缸
第三點的意思是,更新cdsDemo3資料
2004-05-28 15:34:08 煙灰缸
最後,我們看看如何用到dmDemo.dll裡的第一條規則
2004-05-28 15:34:16 煙灰缸
Cmd.BeginOle;
Cmd.Ole.Action:=1;
Cmd.Execute(dmFirstDemo);
ShowMessage(Cmd.LastMsg);
2004-05-28 15:34:45 llyygg
如果伺服器端改變了用戶端送出的資料,那用戶端在送出以後會得到這個資料嗎?
2004-05-28 15:35:51 煙灰缸
Cmd.Ole.Action指定“小規則”為1 (請參照dmDemo.prj)
Cmd.Execute(dmFirstDemo)指定規則子產品,并執行
2004-05-28 15:36:15 煙灰缸
你是指那裡改變了?
2004-05-28 15:36:55 llyygg
伺服器端改變用戶端送出的資料.就是送出的Delta
2004-05-28 15:38:02 llyygg
比如某條記錄的操作時間在伺服器端改變了,用戶端送出完資料後MergeChangelog可以的到嗎.
2004-05-28 15:39:16 煙灰缸
如果在規則中有改變Delta,則可以把改變後的資料傳回,有一個技七在裡面。
2004-05-28 15:41:34 煙灰缸
這一點還是晚一點再說,要不就會象竹子一樣,越講就越長了。。。
2004-05-28 15:43:05 煙灰缸
課間休息5分鐘,大家可以先問問關于這個Demo1.prj的問題,但先别問swServer的問題,因為下面會開始講。
2004-05-28 15:44:31 llyygg
我覺得應該先講伺服器端的,用戶端涉及的都是調用,伺服器端明白了,用戶端其實就很簡單了,沒有什麼内容,我覺得.
2004-05-28 15:45:34 煙灰缸
這裡就是先要知道,用戶端是如何得到資料的,服務層才好開講。
2004-05-28 15:46:51 煙灰缸
新來的朋友可以先看看以往的記錄,之前有讨論過了。
2004-05-28 15:47:19 dana
為什麼你不用Clientdataset 而要用你寫的HMClientCommand ?
2004-05-28 15:47:49 llyygg
封裝了很多操作,不用寫重複的代碼.
2004-05-28 15:47:55 煙灰缸
你可以不用HMClientCommand,我隻是為了友善而已。
2004-05-28 15:48:22 松鼠
封裝了哪些東東,比如呢
2004-05-28 15:49:02 煙灰缸
一時也說不清楚,打開原代碼看一下吧。
2004-05-28 15:50:26 煙灰缸
下面,繼續講dmDemo.prj
2004-05-28 15:50:41 煙灰缸
請大家打開。
2004-05-28 15:52:31 煙灰缸
其實,我總的思路是,讓背景開發人員隻關心“規則”而不用去關心“事務和資料庫”
2004-05-28 15:54:01 煙灰缸
請大家看看我們的第一條“小規則”Action1
2004-05-28 15:54:56 煙灰缸
剛才我們要講到用戶端的
2004-05-28 15:55:06 煙灰缸
它指的就是這裡。
2004-05-28 15:55:29 煙灰缸
Service.BeginTrans;
StoreProc.LoadFromStore(100006);
StoreProc['@mm_id'] := '1389';
StoreProc['@mm_pay'] := 1.15;
Service.Execute(StoreProc.SqlLanguage);
StoreProc['@mm_id'] := '0877';
StoreProc['@mm_pay'] := 0.88;
Service.CommitTrans;
Service.ReceiveDataWithNoData;
2004-05-28 15:56:40 煙灰缸
StoreProc是存取過程生成器,他取得100006号語句,并在些規則裡指定參數
2004-05-28 15:57:37 煙灰缸
用戶端并不知道此規則給的是什麼樣的參數,而且它也不關心
2004-05-28 15:58:43 煙灰缸
是以,這裡的
StoreProc['@mm_id'] := '1389';
就類似于我們所說的“意義”上的規則了
2004-05-28 16:00:01 dana
是不是傳入給存儲過程的兩個參數?
2004-05-28 16:00:11 煙灰缸
是。
2004-05-28 16:00:57 dana
這句是生成存儲過程是吧?
2004-05-28 16:01:11 煙灰缸
Action2和Action3的示例我下個星期寫了之後再放上來。
2004-05-28 16:01:14 煙灰缸
是
2004-05-28 16:01:34 煙灰缸
StoreProc.LoadFromStore(100006);是取得語句,還沒生成。
StoreProc.SqlLanguage才是生成
2004-05-28 16:02:09 dana
明白了.
2004-05-28 16:03:01 煙灰缸
請大家打開dmDefault.prj
2004-05-28 16:03:36 煙灰缸
都打開了嗎?
2004-05-28 16:03:44 松鼠
等等
Service.ReceiveDataWithNoData;這個作什麼用的
2004-05-28 16:04:11 煙灰缸
通知服務層,此規則沒有傳回資料。
2004-05-28 16:04:45 煙灰缸
function TdmDefault.ActionList(CmdIndex: integer; var Data, Msg: OleVariant): WordBool;
2004-05-28 16:04:53 煙灰缸
看看這個實作部分。
2004-05-28 16:05:55 煙灰缸
有沒有發現,實際上,這裡也是一個個小規則,隻不過是有特定的意義。
2004-05-28 16:06:33 煙灰缸
它可以讓前台人員和背景人員都少作一些事情。
2004-05-28 16:09:31 煙灰缸
function TdmDefault.OpenStoreProc(var Data, Msg: OleVariant): WordBool;
2004-05-28 16:09:43 dana
剛才dmDemo也有 ActionList這個,
跟現在這個有什麼差別?
2004-05-28 16:09:50 煙灰缸
請大家看看這一個實作。
2004-05-28 16:10:14 煙灰缸
ActionList是“規則”DLL的“小規則清單”
2004-05-28 16:11:13 煙灰缸
類似TComponent的Override一樣。
2004-05-28 16:11:34 煙灰缸
LoadStoreProcWithParam(Ole.StoreProcIndex);
Service.Query.LoadSql(StoreProc.SqlLanguage);
Service.ReceiveDataWithDefault;
2004-05-28 16:12:32 煙灰缸
這一段和用戶端cdsDemo1.OpenStoreProc(100001)對應
2004-05-28 16:13:47 煙灰缸
他是讓服務層的Query打開存取過程的資料并傳回的Client
2004-05-28 16:16:27 Jackey
不明。cdsDemo1.OpenStoreProc調用的是thmclientdataset的OpenStoreProc. dmDafault如何知是哪個action? thmclientdataset的OpenStoreProc. 用了acOpenStoreProc?
2004-05-28 16:17:18 煙灰缸
To Jackey 打開thmclientdataset 看看就知道了。
2004-05-28 16:22:18 Jackey
還真是将902封裝在了hmclientdataset中了..
2004-05-28 16:23:13 煙灰缸
課間休息,大家問問和這個相關的問題。
2004-05-28 16:24:02 斷翅
最後執行Sql語句的地方在哪裡啊
2004-05-28 16:24:27 煙灰缸
Service.Execute和Service.Query
2004-05-28 16:24:56 松鼠
IBaseService這個是什麼元件?
2004-05-28 16:25:18 煙灰缸
不是元件,而是服務層接口。
2004-05-28 16:25:19 Jackey
IBaseService是接口不是元件
2004-05-28 16:26:27 煙灰缸
有個問題問問大家。
2004-05-28 16:27:16 煙灰缸
用戶端輸入了很多資料,還沒ApplyUdates,但停電了,怎麼辦?
2004-05-28 16:27:46 八戒公子
用事務進行處理就可以了吧,
2004-05-28 16:27:57 llyygg
從新錄入,裝UPS.:)
2004-05-28 16:28:09 煙灰缸
我都把這個QQ組資訊放到最大并開着來看,不關它。
2004-05-28 16:28:26 煙灰缸
UPS也沒電了呢?
2004-05-28 16:28:27 Jackey
save./ load.
2004-05-28 16:28:36 llyygg
輸入一條,儲存一條(本地)
2004-05-28 16:28:49 煙灰缸
怎麼Save,他都不知幾時停電。
2004-05-28 16:28:52 八戒公子
送出資料是用事務處理了嗎?
2004-05-28 16:29:02 Jackey
save到本地.
2004-05-28 16:29:14 煙灰缸
幾時Save?
2004-05-28 16:29:29 llyygg
輸入一條,儲存一條,Post的時候
2004-05-28 16:29:36 八戒公子
就是采用事務復原處理啊。
2004-05-28 16:29:56 斜陽
可不可以這樣講課啊,講一筆資料的獲得的過程。
從用戶端送出請求開始,到用戶端獲得資料為止。先講整個流程,等大家都明白後再逐一展開了講
2004-05-28 16:30:21 Jackey
輸一條save一條,最後update.如果掉電。 開機後再load出來。
2004-05-28 16:30:22 斜陽
這樣可能會清晰點
2004-05-28 16:30:23 煙灰缸
好。
2004-05-28 16:30:59 煙灰缸
To Jackey,這辦法可行,這就是我下一個版本要加入的功能。