想学习做个简单的进销存,思路如下:
进,销,退货的录入界面都是一样的,因此写个基类TfrmBase,录入的数据先保存在ClientDataSet的delta,录入完后再用DataSetProvider.ApplyUpdates保存到数据库中,但我执行这个过程时提示“操作失败!”,但我察看数据库中所有记录都已保存好了,请问是为什么?
相关代码如下:
//业务类中定义的更新过程
procedure TMaint.uplateToBase(data: OleVariant; ErrCount: integer;tbName:string);
begin
 with DM do
 begin
  utbUplate.TableName:=tbName;//在数据模块中指定dspUplate相连的utbUplate的表名
  dspUplate.ApplyUpdates(data,0,ErrCount);
 end;
end;//基类代码
procedure TfrmBase.FormCreate(Sender: TObject);
begin
objMaint:=TMaint.create;//创建业务类TMaint的一个实例
end;procedure TfrmBase.SaveToBase(tbName:string);
var
nErr:integer;
begin
 with dscds do
 begin
 if changecount>0 then
  begin
  objMaint.uplateToBase(delta,nErr,tbName);//调用更新过程
  if nErr>0 then
   application.MessageBox('操作失败!',M_TITLE,MB_ICONWARNING)
   else
   application.MessageBox('操作成功!',M_TITLE,MB_ICONINFORMATION);
   end;
  MergeChangeLog;
 end;
end;//在派生类中执行这个过程提示“操作失败!”,但我察看数据库中所有记录都已保存好了
procedure TfrmJH.actSAVE2BASEExecute(Sender: TObject);
begin
   SaveToBase('jh');
   inherited;
end;

解决方案 »

  1.   

    小小修改。定义:
    procedure TMaint.uplateToBase(data: OleVariant;ErrCount: integer;tbName:string);
    改为:
    procedure TMaint.uplateToBase(data: OleVariant;var ErrCount: integer;tbName:string);
    试试!
      

  2.   

    这可以考虑一个问题:提交数据时参数可以设置为有多少个错误才进行rollback,否则尽量提交.
    你数据提交了,但提示失败,估计是已经提交了部分数据,但有失败的数据存在,所以提示操作失败.可以看看是否是数据库的字段不匹配(长度,类型等)!
    呵呵,谨供参考.高手指点.
      

  3.   

    Kevin_Lmx(繁华阅尽) var ErrCount: 
    可能是没用var 导致参数没变化吧,应该是这问题
      

  4.   

    真是一时糊涂啊!谢谢Kevin_Lmx(繁华阅尽)