com+技术的三层系统的商业逻辑实现及更新(200分)

  • 主题发起人 主题发起人 glpttlb
  • 开始时间 开始时间
G

glpttlb

Unregistered / Unconfirmed
GUEST, unregistred user!
com+技术的三层系统的商业逻辑实现及更新一般用 用clientdateset的applyupdates(0),
这样不灵活,我希望使用多个adoquery控件进行复杂的运算后再用adoquery更新。
 
不懂楼主是什么意思呢???
 
我更不懂楼主是什么意思呢???
好象你说的不现实
 
我是说如何将客户端数据更新到服务器,但需自己加工,并加上自己的处理。
用clientdateset的applyupdates(0)不灵活。
 
这就要看你的服务器端是如何做的了。
若服务器端写的好,有很强的处理逻辑的话,那么操作起来也是很简单的。
一般来说,业务逻辑是实现由复杂到简单的关键,业务逻辑把握的好,数据库建立的合理,那么你的问题也就可以得到很好的解决。
具体的问题需要具体的分析。
比如建一个表,若在客户端进行业务操作,则需要和服务器通讯至少两次以上,但若是在服务器端进行操作,只需一个调用过程,减少了服务器的开支。
以上这个例子只是说明服务器业务逻辑操作的极小的一方面,更多的是要根据你自己的需求来建立服务器的业务逻辑。
偶说完了,呵呵,想想,还有的话偶再补充:)
 
to 阿西喊佛
能否举个例子,附部分代码
 
好的,偶找找以。
 
这是偶以前回答的一个问题里面的源码,呵呵,就是建表和删除表的,你看看吧。
这样避免了数据服务器与事物处理器所结合而带来的低效率问题。
写中间层规则也就是写用户的函数或者方法接口,尽量的把用户经常需要的函数或者查询写在
中间层,这样避免了网络通讯的数据量大的问题。
unit Uit_NumPlan;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComServ, ComObj, VCLCom, StdVcl, bdemts, DataBkr, DBClient,
MtsRdm, Mtx, NumPlan_TLB, Provider, DB, ADODB;
type
TMST_NumPlan = class(TMtsDataModule, IMST_NumPlan)
Adc_Numplan: TADOConnection;
Adq_NumPlan: TADOQuery;
Dsp_NumPlan: TDataSetProvider;
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
procedure sAddTable(var sTableName: OleVariant);
safecall;
procedure sDropTable(var sTableName: OleVariant);
safecall;
public
{ Public declarations }
end;

var
MST_NumPlan: TMST_NumPlan;
implementation
{$R *.DFM}
class procedure TMST_NumPlan.UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

procedure TMST_NumPlan.sAddTable(var sTableName: OleVariant);
var
sSQL : String;
begin
//检测是否存在表
sSQL := 'SELECT name FROM sysobjects WHERE rtrim(name)='''+sTableName+'''';
Try
With Adq_NumPlando
begin
Close;
SQL.Clear;
SQL.Add(sSQL);
Prepared;
Open;
//如果不存在,则建立,并设置主键与默认值
if Adq_NumPlan.RecordCount = 0 then
begin
Close;
sSQL := 'CREATE TABLE [dbo].['+sTableName+'] ('
+'[f_ibusnoid] [int] NOT NULL ,'
+'[f_iseatid] [int] NOT NULL ,'
+'[f_cvseatnu] [char] (4) COLLATE Chinese_PRC_BIN NOT NULL ,'
+'[f_cuserid] [char] (6) COLLATE Chinese_PRC_BIN NULL ,'
+'[f_ctickstatu] [char] (1) COLLATE Chinese_PRC_BIN NULL ,'
+'[f_istatorder0] [int] NULL ,'
+'[f_istatorder1] [int] NOT NULL'
+'[f_dtgq] [datetime] NULL,'
+') ON [PRIMARY]';
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
Close;
sSQL := 'ALTER TABLE [dbo].['+sTableName+'] WITH NOCHECK ADD'
+' CONSTRAINT [PK_'+sTableName+'] PRIMARY KEY CLUSTERED'
+' ('
+' [f_ibusnoid],'
+' [f_iseatid]'
+' ) ON [PRIMARY]';
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
Close;
sSQL := 'ALTER TABLE [dbo].['+sTableName+'] WITH NOCHECK ADD'
+' CONSTRAINT [DF_'+sTableName+'_f_ctickstatu] DEFAULT ('
+'0'
+') FOR [f_ctickstatu],'
+' CONSTRAINT [DF_'+sTableName+'_f_istatorder0] DEFAULT (1) FOR [f_istatorder0],'
+' CONSTRAINT [DF_'+sTableName+'_f_istatorder1] DEFAULT (99) FOR [f_istatorder1]';
Close;
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
end;
end;
except
on Exceptiondo
begin
SetAbort;
Raise;
end;
end;
end;

procedure TMST_NumPlan.sDropTable(var sTableName: OleVariant);
var
sSQL : String;
begin
Try
With Adq_NumPlando
begin
sSQL := 'DROP TABLE '+sTableName;
Close;
SQL.Clear;
SQL.Add(sSQL);
ExecSQL;
end;
except
on Exceptiondo
begin
SetAbort;
Raise;
end;
end;
end;

initialization
TComponentFactory.Create(ComServer, TMST_NumPlan,
Class_MST_NumPlan, ciMultiInstance, tmApartment);
end.

这只是其中的两个接口而已。
一个是建表,一个是删表,看了就应该有点头绪了。
 
参不透你的意思[:)][:)]
 
to 阿西喊佛
李唯的书我看过,但客户端如何调用?
假如在进销存中,我需更新一进货单(01),
我如何调用方法?如多人同时调用会有问题吗?
我想在应用服务器中
先将进货单(01)删出,库存计算,将客户端数据集插入,库存计算,以上
应该是一个整体和事物处理。
客户端如何调用?应用服务器如何实现?
分不够可加!
 
呵呵,看那小子的书没多大用,呵呵,开玩笑了~
客户端我用的是WebConnection
这样调用
sTableName : String;//要建立的表名
WebConnection1.Appserver.sAddTable(sTableName);
这样就实现了从客户端调用中间层建表的过程~
若有多人,则可锁定记录,这个比较复杂。
个人看法如下:
在表单中增加一个字段state,若有用户使用,则为1,若没有,则为0。
当客户端调用中间层时,首先判断你所需要提取的记录的信息,若state为1,则放弃调用,等待一定时间段(时间段由你自己设定,不可以太长,不然用户会认为死机)再继续调用,直到调用成功。若成功,则把state状态值从0改为1,通知其他要调用此记录客户知道此记录有人占用。
具体的程序实现要看你的具体程序思想和你的数据库实现。
 
to 阿西喊佛
多谢!
本人delphi的二层系统做了许多,三层怕不稳定,一直不敢给客户,
希望有空能交流!
longbin@gliet.edu.cn
 
多人接受答案了。
 
偶的MSN是
hanfoer@msn.com
多交流,呵呵~!
 
后退
顶部