当前位置:主页>销售管理软件> 列表

三层问题,我想更新多个表的数据,待解答 找进销存管理系统

仓库管理软件版1楼: 看过李维的基本书,从中有所收益,但对实际问题似乎又无从下手,要做一小型系统,想
使用三层结构:
1.数据的处理在哪层实现,是中间逻辑层,服务端还是客户端?
A.查询
B.添加,修改,删除
备注:在进行多表更新时的用法,我不准备用关联表的方法来更新,对于业务上繁琐的要求用SQL可能比较灵活些.
2.数据在更新过程中的容错问题.如何解决.
如我有个事物,在更新第一表的时候正常,第二张表的时候出现异常,如何处理?
以上两个问题我需要详细的代码.
请各位三层高手或者对该问题感兴趣的朋友能够给予帮助,多谢了
可能提的问题还不是很明确,请多多包含啊!

2楼: 没人回答啊?那我先详细问个问题
在客户端用CLIENTDATASET时,我想在表table1中增加一条数据,并且table2中也相应增加一条,如何在中间层实现?
结构如下:
table1:
id varchar(10)
name varchar(20)
id1 varchar(10)
table2:
id1 varchar(20)
name1 varchar(20)
1.客户端实现方式
客户端代码部分:
ClientDataSet1.ApplyUpdates(0)
ClientDataSet2.ApplyUpdates(0)
但我不想这样实现因为该窗口只是显示ClientDataSet1的数据
2.中间层实现方式代码部分
a.客户端代码部分:
var qCoor:IMTSDemoQueryCoor;
vDatas:OleVariant;
begin
qCoor:=CoMTSDemoQueryCoor.CreateRemote(''127.0.0.1'');
//我如何把要添加的数据传给变量vDatas?
qCoor.Inserttable1(vDatas);
end
b.中间层代码部分:
我如何获取传过来要添加的数据啊?
求教各位了! 如免费仓库管理软件

3楼: 难道大家都在忙着学windows吗?

4楼: 各位我等了一个下午了,都没有个人回个贴
我在细说一下,用MTS如何在逻辑层(中间层)与数据层(服务端)进行通讯(我用的是MTS OBJECT+MTS DATA),实现数据的处理啊(是多表)?(添加,删除,修改)我不调用存储过程如何实现啊?
可否给个例子啊?或者在我上面的代码中添加,急啊
多谢了

5楼: 你的问题太大了,恐怕用几页纸都写不完,谁能答得上呀!不过我这里有个东西给你借鉴
看我们是怎样解决的
www.szmax.net/webpush-8.htm
关于webpush是花了不少心血和技巧的产品,一直是用来做公司的项目的,在这不是做广告,只希望大家捧个场,提个意见!
谢谢

6楼: 问题在大,也可一一剖析出来解决啊?
知道多少说多少啊!
全当时讨论的了啊,一贴不回不免有些寒心啊!

仓库管理软件版7楼: 1。我觉得涉及到数据库操作都应该放在服务端
2。在服务端些接口进行数据处理,出错就事务回滚并给客户端返回错误信息

8楼: 各位请指教,并提出指正:
客户端(插入代码):
procedure TForm1.Button4Click(Sender: TObject);
var qCoor:IMTSDemoQueryCoor;
vDatas: array of string;
begin
qCoor:=CoMTSDemoQueryCoor.CreateRemote(''127.0.0.1'');
SetLength(vDatas,2);
vDatas[0]:=Edit1.Text;
vDatas[1]:=Edit2.Text;
qCoor.InsertPublishers(vDatas[0],vDatas[1]);
end;
业务层(更新代码):
procedure TMTSDemoQueryCoor.InsertPublishers(const vDatas1,
vDatas2: WideString);
var Publishers : IMTSPublishers;
begin
//InsertPublishers
if not assigned(Publishers) then
Publishers := CoMTSPublishers.Create;
Publishers.InsertPublishers(vDatas1,vDatas2);
end;
数据处理层(更新代码):
procedure TMTSPublishers.InsertPublishers(const vData1,
vData2: WideString);
begin
try
ADOCPublishers.BeginTrans;


ADOQUpdate.Close;
ADOQUpdate.SQL.Clear;
ADOQUpdate.SQL.Add(''Insert into Publishers (VID,PublisherName) values (:VID,:PublisherName)'');
ADOQUpdate.Parameters.ParamByName(''VID'').Value:=vData1;
ADOQUpdate.Parameters.ParamByName(''PublisherName'').Value:=vData2;
ADOQUpdate.ExecSQL;
ADOQUpdate.Close;
ADOQUpdate.SQL.Clear;
ADOQUpdate.SQL.Add(''Insert into Books (VID,BookID,BookName) values (:VID,:BookID,:BookName)'');
ADOQUpdate.Parameters.ParamByName(''VID'').Value:='''';
ADOQUpdate.Parameters.ParamByName(''BookID'').Value:='''';
ADOQUpdate.Parameters.ParamByName(''BookName'').Value:=''测试'';
ADOQUpdate.ExecSQL;
ADOCPublishers.CommitTrans;
//SetComplete;
except
ADOCPublishers.RollbackTrans;
//SetAbort;
end;
end;
谢谢了

9楼: 以上代码拙劣,请各位指教,希望人人参与

10楼: 做个MTS/COM+对像并一定要启动事务,三个更新都放在一个事务中就可以了

11楼: 你上面结构很好,我们一直都是3层结构,client-业务-数据处理,
这样可以将数据处理采用both可以共享,非常好用。
提示:千万不要采用ClientDataSet,这个会让你死得难看,直接采用olevariant作为数据参数。

12楼: to djrj:
"做个MTS/COM+对像并一定要启动事务,三个更新都放在一个事务中就可以了"
以上是否可以理解成:如果要进行三个更新处理,MTS对象中并不需要启动事务,只要支持就可以了,而MTSDATA中一定要有个事务!
是否?
to dcsdcs:
1.多谢夸奖,我其实也是按部就班的照着书做的,只不过书中说的是更新,我用的是插入罢了.
2."client-业务-数据处理"中的业务我这里似乎没有什么功能只是个中转(调用)的作用,并没有实现真正功能.我想问是不是业务就是这样啊?你可否给我提供个例子啊,代码和文字都可以的,麻烦了.
3."千万不要采用ClientDataSet,这个会让你死得难看,直接采用olevariant作为数据参数。"首先谢谢你的提醒,但我还是有点不明白,书中说是查询的时候可以通过CLIENTDATASET来传输,这样可以提高代码效率.书中说的CLIENTDATASET是在CLIENT与业务层中加,而CLIENT中的并不进行通讯,是独立的,数据是通过借口涵数来获取的,而业务层是通过通讯设置来获取数据处理端的某个DATASETPROVID中的数据的.
我现在是通过这种方式做的,是否可以啊?
你所顾及的是什么情况下用会导致什么问题啊?可以给予一些明确的提示啊?
多谢各位了,继续........ 如进销存管理系统

13楼: 路过学习 帮你顶

仓库管理软件版14楼: 2."client-业务-数据处理"中的业务我这里似乎没有什么功能只是个中转(调用)的作用,并没有实现真正功能.我想问是不是业务就是这样啊?你可否给我提供个例子啊,代码和文字都可以的,麻烦了.

我的理解是,所有与业务逻辑有关,有可能会经常变动的东西,都要想办法写在中间层。举个简单的例子,有这样一个需求:

系统在列表时应把所有开支大于50元的记录显示为红色。

这个50元就属于业务逻辑,以后可能会调整成60,70。也有可能变整个需求变为“开支大于收入80%时记录显示为红色”

那么就不要在客户端判断开支是否大于50。而应该在中间层处理DATASET时加一个叫Emergent的计算字段。判断开支大于50时,字段值为True.否则为false. 在客户端根据emergent的值来显示。也就是把上面的一条需求理解为:

业务层需求:开支大于50的记录应视为紧急记录
表达层需求:在列表时把紧急记录显示为红色