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