描述:
主要功能: 我要ACCESS中的一对主从表提取部分数据做为存储过程上传到ASA的主从表中。
我想请问各位大虾们如何保持整个过程的完整性,用事务如何做更好??
在ASA端我用两个存储过程
来负责接收数据,从表要得到主表的一个字段做为一个参数
在本地是一个主从表,
主表:返回irdid
procedure DBA.add_rd(@ccuscode char(7),@cmaker varchar(8))
as
begin
declare @iRdID integer, --当前预定单号
@cHandler varchar(12), --业务员编号,从客户表中绑定
@cWhCode varchar(10), --仓库编码,从客户表中绑定
@cVouchCode varchar(10) --预定单号
--生成当前预定单号
select @iRdID = max(irdid)+1 from tmp_rdrecord
select @cVouchCode=REPLICATE('0',6-length(trim(str(@iRdID,6))))+trim(str(@iRdID,6))
--从customer表中读出业业务员号,与仓库号
select @ccuscode=trim(@ccuscode)
select @chandler = cCusHeadCode,@cWhCode = ccushand from Customer where ccuscode = @ccuscode
--增加新的预订单
insert into tmp_rdrecord(iRdID,brdflag,cbustype,cSource,cVouchType,cWhCode,cMaker,cVouchCode,cHandler,dVouchDate,cCusCode,cSTCode) values(@iRdID,0,'预定','网点','06',@cWhCode,@cmaker,@cVouchCode,@cHandler,GETDATE(*),@ccuscode,'02')
select irdid=@iRdID
return
end从表:
procedure DBA.add_rds(in @irdid integer,in @cInvCode varchar(20),in @iQuantity integer)
on exception resume --,out @result integer
begin
declare @iRdsID integer; --当前详细预定单号
declare @iNum real; --件数=iQuantity/iInvExchRate
declare @iUnitCost decimal(16,6); ---条价
declare @iPrice decimal(16,6); ---总价=iQuantity*iPrice
declare @iInvExchRate real; ---换算单位
select max(irdsid)+1 into @iRdsID from tmp_rdrecords;
select @iQuantity/iInvExchRate,iinvrcost,@iQuantity*iinvrcost,iinvexchrate into @iNum,@iunitcost,@iprice,@iinvexchrate from inventory where cinvcode = @cInvCode;
insert into tmp_rdrecords(iRdID,iRdsId,cInvCode,iNum,iQuantity,iUnitCost,iPrice,iInvExchRate) values(@irdid,@iRdsID,@cInvCode,@iNum,@iQuantity,@iunitcost,@iPrice,@iInvExchRate);
select @iRdsID as irdsid;
return
end
代码: while (not adoq_sq.Eof) do //本地主表
begin
ccuscode:=adoq_sq.FieldByName('ccuscode').AsString;
adosp_rd.Close;
//预订单主表的增加以 客户编号 操作员为参数
adosp_rd.Parameters[0].Value:=ccuscode;
adosp_rd.Parameters[1].Value:=loginfrm.loginname;
adosp_rd.Prepared:=true;
try
adosp_rd.open;
except
on Exception do
ShowMessage('上传中断!');
exit;
end;
s_irdid:=adosp_rd.FieldByName('irdid').asinteger; //得到的预订单号
{
在此要修改ADOQ_SQ中当前记录的状态,即把上传标识符字段设为1
}
i:=i+1;
WHILE (not adot_Sq.eof) do // 在 adot_Sq 只包含了与主表相关关的详细订单信息
begin cInvCode:=trim(adot_sq.FieldByName('cInvCode').AsString); //商品编码
iQuantity:=adot_sq.FieldByName('inum').Asinteger; //数量
adosp_rds.Close;
adosp_rds.Parameters[0].Value:=s_irdid;
adosp_rds.Parameters[1].Value:=cInvCode;
adosp_rds.Parameters[2].Value:=iQuantity;
adosp_rd.Prepared:=true;
adosp_rds.ExecProc;
adot_sq.Next;
end;
adoq_sq.Next;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货