描述:
   主要功能:  我要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;