主题:讲解三层代码讲解--第三课(*****) 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 烟灰缸
刚才我们要讲到客户端的
  Cmd.Ole.Action:=1;
  Cmd.Execute(dmFirstDemo);
 

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.Execute(StoreProc.SqlLanguage);
    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';
    StoreProc['@mm_pay'] := 1.15;
就类似于我们所说的“意义”上的规则了

2004-05-28 16:00:01 dana
是不是传入给存储过程的两个参数?
 
2004-05-28 16:00:11 烟灰缸
是。

2004-05-28 16:00:57 dana
    StoreProc.LoadFromStore(100006);
这句是生成存储过程是吧?

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,这办法可行,这就是我下一个版本要加入的功能。

上一篇:树莓派开启VNC远程桌面


下一篇:panel.sh:一个nginx+docker的云函和在线IDE面板,发明你自己的paas(2)