天天看點

主題:講解三層代碼講解--第三課(*****) DATE:2004-05-28

主題:講解三層代碼講解--第三課(*****)

主講: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,這辦法可行,這就是我下一個版本要加入的功能。