天天看点

主题:讲解三层代码讲解--第三课(*****) 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,这办法可行,这就是我下一个版本要加入的功能。