access数据库中,存在“临时表”和“药库”这样两个表,两个表结构是一样的,有这些字段
“序号”“ 药名” “类名”“药品数量”“药品单价”“药品总价” …… 
   我希望把“临时表”中的所有数据复制到“药库”表中,“药库”表中已经存在很多药的信息
   要求是:
      如果在“药库”中已存在这种药品,则只须把这种药的数量、总价加上去就好,
      如果在“药库”中不存在这样药品名,则须把全部信息添加到“药库”表中;
请问具体语句怎么写呢,哪位好心人帮帮忙呢
   如果有别的办法能达到这样结果也可以,

解决方案 »

  1.   

    遇到同样的问题,关注中!如果有答案了,请告诉小弟,[email protected]先谢谢了
      

  2.   

    假设序号是主键,那么(如果不是,修改where 后面的条件)
    update 药库 a,临时表 b set a.数量=a.数量+b.数量,.... where a.序号=b.序号
    insert into 药库 select * from 临时表 where 序号 not in (select 序号 from 药库)
      

  3.   

    1.在药库中存在
    update 药库 a set 药品数量=药品数量 + (select 药品数量 from 临时表 where 序号=a.序号),
    药品总价 = 药品总价 + (select 药品总价 from 临时表 where 序号=a.序号) 
    where a.序号 in (select 序号 from 临时表)2.在药库中不存在
    insert into 药库('序号','药名','类名','药品数量','药品单价','药品总价')
    select '序号','药名','类名','药品数量','药品单价','药品总价' from 临时表 
    where 序号 not in (select 序号 from 药库)如果上面的代码不能在Access数据库中运行,见意用循环方式更新或增加!
    with ADOQuery1 do   //打开临时表
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from 临时表 ');
      Open;
    end;with ADOQuery2 do  //打开药库表
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from 药库 ');
      Open;
    end;while not ADOQuery1.Eof do
    begin
      if ADOQuery2.Locate('序号', ADOQuery1.FieldByName('序号').AsString, []) then
      begin
        ADOQuery2.Edit;
        ADOQuery2.FieldByName('药品数量').AsFloat := ADOQuery2.FieldByName('药品数量').AsFloat + ADOQuery1.FieldByName('药品数量').AsFloat;    ADOQuery2.FieldByName('药品总价').AsFloat := ADOQuery2.FieldByName('药品总价').AsFloat + ADOQuery1.FieldByName('药品总价').AsFloat;
        ADOQuery2.Post;
      end
      else begin
        ADOQuery2.Append;
        ADOQuery2.FieldByName('序号).AsString := ADOQuery1.FieldByName('序号).AsString;
        ADOQuery2.FieldByName('药名).AsString := ADOQuery1.FieldByName('药名).AsString;
        ADOQuery2.FieldByName('类名).AsString := ADOQuery1.FieldByName('类名).AsString;
        ADOQuery2.FieldByName('药品数量').AsFloat := ADOQuery1.FieldByName('药品数量').AsFloat;
        ADOQuery2.FieldByName('药品单价').AsFloat := ADOQuery1.FieldByName('药品单价').AsFloat;    ADOQuery2.FieldByName('药品总价').AsFloat := ADOQuery1.FieldByName('药品总价').AsFloat;
        ADOQuery2.Post;
      end;
      ADOQuery1.Next;
    end;
      

  4.   

    update  药库表  set 药库表.药品数量=药库表.药品数量+b.药品数量 from 临时表 Ttmp  where 药库表.序号=Ttmp.序号insert into 药库表 select  (select * from 临时表) Ttmp where 药库表.序号!=Ttmp.序号
      

  5.   

    hqhhh(枫叶) 你好,先谢谢你拉,不过还遇到个问题,我去判断“药库”中是否已存在这种药时是根据药名去判断的,不是用序号 
    当“药库”中没这个记录时是行的,可有相同药名时就不行了,我是希望在某种具体药中添加数量
    比如说:
    我“药库”中已经存在这样的记录
    药名  数量  总价  单位
    人丹   3     9      盒
    鼻炎片 8     53     盒
    当我临时表中也有“人丹”和“鼻炎片”记录,数量各7,2,我希望入库后“药库”中“人丹”、“鼻炎片”的数量变为10、10请问下面语句该如何修改下
    while not ADOQuery1.Eof do
    begin
      if ADOQuery2.Locate('药名', ADOQuery1.FieldByName('药名'').AsString, []) then
      begin
        ADOQuery2.Edit;
        ADOQuery2.FieldByName('药品数量').AsFloat := ADOQuery2.FieldByName('药品数量').AsFloat + ADOQuery1.FieldByName('药品数量').AsFloat;    ADOQuery2.FieldByName('药品总价').AsFloat := ADOQuery2.FieldByName('药品总价').AsFloat + ADOQuery1.FieldByName('药品总价').AsFloat;
        ADOQuery2.Post;
      end
      

  6.   

    晕!搞得这么复杂,我支持 fontain() 的做法!请楼主不妨试试!
      

  7.   

    fontain() 他的方法我试了,可不行呢,可能是我格式错了
            YKQry.Close;
            YKQry.SQL.Clear;
            //YKQry.Open;
            ShowMessage('1');
            YKQry.SQL.Add('update yaoku set 数量=数量 + (select 数量 from jinyaolinshibiao where 药名=yaoku.药名),总价 = 总价+ (select 总价 from jinyaolinshibiao where 药名=yaoku.药名)where yaoku.药名 in (select 药名 from jinyaolinshibiao)');
            ShowMessage('2');
            YKQry.SQL.Add('insert into yaoku values(select 类名,药名,规格,单价,数量,单位,总价 from jinyaolinshibiao where 药名 not in (select 药名 from yaoku))');
            //JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
            YKQry.ExecSQL;
    那你们能该我改正下吗? hqhhh(枫叶) 我已经把序号换成药名,可就是添加不进去,
      

  8.   

    我的代码你们看看
    procedure TfrmYaopinLuru.Button2Click(Sender: TObject);
    var
      LSQry,YKQry: TADOQuery;
    begin
      if Application.MessageBox('确定要把表中药品录入药库中吗?','系统提示', MB_yesno + MB_ICONINFORMATION)=mryes then
      begin
        LSQry := TADOQuery.Create(nil);
        YKQry := TADOQuery.Create(nil);
        LSQry.Connection:=frmMain.ADOConnection1; //你的数据连接
        YKQry.Connection:=frmMain.ADOConnection1;
        try
          frmMain.ADOConnection1.BeginTrans;
          try
            with LSQry do   //打开临时表
            begin
                Close;
                SQL.Clear;
                SQL.Add('select * from jinyaolinshibiao ');
                Open;
            end;
            with YKQry do  //打开药库表
            begin
                Close;
                SQL.Clear;
                SQL.Add('select * from yaoku ');
                Open;
            end;
            {//在药库中存在
            YKQry.Close;
            YKQry.SQL.Clear;
            //YKQry.Open;
            ShowMessage('1');
            YKQry.SQL.Add('update yaoku set 数量=数量 + (select 数量 from jinyaolinshibiao where 药名=yaoku.药名),总价 = 总价+ (select 总价 from jinyaolinshibiao where 药名=yaoku.药名)where yaoku.药名 in (select 药名 from jinyaolinshibiao)');
            ShowMessage('2');
            YKQry.SQL.Add('insert into yaoku values(select 类名,药名,规格,单价,数量,单位,总价 from jinyaolinshibiao where 药名 not in (select 药名 from yaoku))');
            //JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
            YKQry.ExecSQL;
            //在药库中不存在 }        while not LSQry.Eof do
            begin
              if YKQry.Locate('药名', LSQry.FieldByName('药名').AsString, []) then
              begin
                //YKQry.SQL
                //update  yaoku  set yaoku.数量=yaoku.数量+jinyaolinshibiao.药品数量 from
                //jinyaolinshibiao  where yaoku.药名=jinyaolinshibiao.药名
                YKQry.Edit;
                YKQry.FieldByName('数量').AsInteger := YKQry.FieldByName('数量').AsInteger+ LSQry.FieldByName('数量').AsInteger;
                YKQry.FieldByName('总价').AsCurrency := YKQry.FieldByName('总价').AsCurrency+ LSQry.FieldByName('总价').AsCurrency;
                YKQry.Post;
              end
              else begin
                YKQry.Append;
                YKQry.FieldByName('药名').AsString := LSQry.FieldByName('药名').AsString;
                YKQry.FieldByName('规格').AsString := LSQry.FieldByName('规格').AsString;
                YKQry.FieldByName('类名').AsString := LSQry.FieldByName('类名').AsString;
                YKQry.FieldByName('单位').AsString := LSQry.FieldByName('单位').AsString;
                YKQry.FieldByName('数量').AsInteger := LSQry.FieldByName('数量').AsInteger;
                YKQry.FieldByName('单价').AsCurrency := LSQry.FieldByName('单价').AsCurrency;
                YKQry.FieldByName('总价').AsCurrency := LSQry.FieldByName('总价').AsCurrency;
                YKQry.Post;
              end;
              LSQry.Next;
              Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
                 MB_ICONINFORMATION);
              Exit;
            end;
            frmMain.ADOConnection1.CommitTrans;
          except
            frmMain.ADOConnection1.CommitTrans;
            Application.MessageBox('录入失败,请仔细核查后再录入!','系统错误提示',MB_OK+
               MB_ICONINFORMATION);
            Exit;
          end;
        finally
          LSQry.Free;
          YKQry.Free;
        end;    {ADOQuery1.open;
        for i:=0 to ADOQuery1.recordcount-1 do
        begin
          ADOQuery2.open;
          ADOQuery2.insert;      ADOQuery2.FieldByName('字段1').asinteger := ADOQuery1.FieldByName('字段1').asinteger ;
          ADOQuery2.FieldByName('字段2').asinteger := ADOQuery1.FieldByName('字段2').asinteger ;
          ADOQuery2.post;
          ADOQuery1.next;
        end;}
      end
      else
      begin
        ShowMessage('no');
      end;end;
      

  9.   

    下面的代码有点小问题:
            LSQry.Next;
    //          Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
    //             MB_ICONINFORMATION);
    //          Exit;
            end;
            //应放在循环这后
              Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
                 MB_ICONINFORMATION);
              Exit;        frmMain.ADOConnection1.CommitTrans;
          except
            frmMain.ADOConnection1.CommitTrans;
            Application.MessageBox('录入失败,请仔细核查后再录入!','系统错误提示',MB_OK+
               MB_ICONINFORMATION);
            Exit;
          end;
      

  10.   

    用异常处理不行吗?
    try
      insert into 药库  //不存在的直接insert
    except
      updata 药库 set 药品数量=xxxx   //存在的就updata
    end;在access中将总价设成:总价=数量*单价
      

  11.   

    hqhhh(枫叶) 你的方法是可以的,我一直不行,竟然是事务机制原因,就以上
    frmMain.ADOConnection1.BeginTrans;
    frmMain.ADOConnection1.CommitTrans;
    frmMain.ADOConnection1.RollbackTrans;
    这几句原因
    我把它注释掉就可以了,不过我想问,为什么不能家事务回滚操作呢,
    是不是一个模块里只能用一次的,我在别的地方也用了下,能行的
    procedure TfrmYaopinLuru.BtnQuerenClick(Sender: TObject);
    var
      Price,Allprice,Num:Double;
      LSQry,JYQry:TADOQuery;
    begin
      if EdtName.Text='' then
      begin
        Application.MessageBox('药品名不能为空!','提示',MB_OK+
          MB_ICONINFORMATION);
        ActiveControl:=EdtName;
        Exit;
      end
      else
      begin
        //同时向进药临时表和进药表添加数据
        LSQry:= TADOQuery.Create(nil);
        JYQry:= TADOQuery.Create(nil);
        LSQry.Connection:=frmMain.ADOConnection1; //你的数据连接
        JYQry.Connection:=frmMain.ADOConnection1;
        try
          //采用事物对数据进行存储,
          frmMain.ADOConnection1.BeginTrans;
          try
            //向进药临时表添加信息
            LSQry.Close;
            LSQry.SQL.Clear;
            LSQry.SQL.Add('select * from jinyaolinshibiao');
            LSQry.Open;
            LSQry.Append;
            LSQry.FieldByName('药名').AsString:=EdtName.Text;
            LSQry.FieldByName('规格').AsString:=EdtSpec.Text;
            LSQry.FieldByName('单价').AsString:=EdtPrice.Text;
            LSQry.FieldByName('数量').AsString:=EdtNum.Text;
            //计算药品总额
            Num:=StrToFloat(EdtNum.Text);
            Price:=StrToFloat(EdtPrice.Text);
            Allprice:=Num*Price;
            LSQry.FieldByName('总价').AsFloat:=Allprice;
            LSQry.FieldByName('单位').AsString:=ComboBox1.Text;
            LSQry.FieldByName('类名').AsString:=ComboBox2.Text;
            LSQry.Post;        //向进药表添加信息
            JYQry.Close;
            JYQry.SQL.Clear;
            JYQry.SQL.Add('select * from jinyao');
            JYQry.Open;
            JYQry.Append;
            JYQry.FieldByName('药名').AsString:=EdtName.Text;
            JYQry.FieldByName('规格').AsString:=EdtSpec.Text;
            JYQry.FieldByName('单价').AsString:=EdtPrice.Text;
            JYQry.FieldByName('数量').AsString:=EdtNum.Text;
            JYQry.FieldByName('总价').AsFloat:=Allprice;
            JYQry.FieldByName('单位').AsString:=ComboBox1.Text;
            JYQry.FieldByName('类名').AsString:=ComboBox2.Text;
            JYQry.FieldByName('日期').AsDateTime:=DateTimePicker1.Date;
            JYQry.Post;
            Application.MessageBox('信息成功录入!','提示',MB_OK+
               MB_ICONINFORMATION);
            ADOTable1.Close;
            ADOTable1.Open;
            //JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
            //JYQry.ExecSQL;
            frmMain.ADOConnection1.CommitTrans;
          except
            frmMain.ADOConnection1.RollbackTrans;
            Application.MessageBox('您输入的数据有误,请核查后再提交!','系统提示',MB_OK+
               MB_ICONINFORMATION);
            Exit;
          end;
        finally
          LSQry.Free;
          JYQry.Free;
        end;
        EdtName.Text:='';
        EdtSpec.Text:='';
        EdtPrice.Text:='';
        EdtNum.Text:='';
        ComboBox1.Text:='';
        ComboBox2.Text:='';
        ActiveControl:=EdtName;
      end;end;procedure TfrmYaopinLuru.Button2Click(Sender: TObject);
    var
      LinShiQry,YaoKuQry: TADOQuery;
      a:string;
      b:Integer;
    begin
      if Application.MessageBox('确定要把表中药品录入药库中吗?','系统提示', MB_yesno + MB_ICONINFORMATION)=mryes then
      begin
        LinShiQry := TADOQuery.Create(nil);
        YaoKuQry := TADOQuery.Create(nil);
        LinShiQry.Connection:=frmMain.ADOConnection1; //数据连接
        YaoKuQry.Connection:=frmMain.ADOConnection1;
        try
          //frmMain.ADOConnection1.BeginTrans;
          try
            //打开临时表
            LinShiQry.Close;
            LinShiQry.SQL.Clear;
            LinShiQry.SQL.Add('select * from jinyaolinshibiao');
            LinShiQry.Open;
            //打开药库表
            YaoKuQry.Close;
            YaoKuQry.SQL.Clear;
            YaoKuQry.SQL.Add('select * from yaoku');
            YaoKuQry.Open;
            {//在药库中存在
            YKQry.Close;
            YKQry.SQL.Clear;
            //YKQry.Open;
            ShowMessage('1');
            YKQry.SQL.Add('update yaoku set 数量=数量 + (select 数量 from jinyaolinshibiao where 药名=yaoku.药名),总价 = 总价+ (select 总价 from jinyaolinshibiao where 药名=yaoku.药名)where yaoku.药名 in (select 药名 from jinyaolinshibiao)');
            ShowMessage('2');
            YKQry.SQL.Add('insert into yaoku values(select 类名,药名,规格,单价,数量,单位,总价 from jinyaolinshibiao where 药名 not in (select 药名 from yaoku))');
            //JYQry.SQL.Add('insert into yaoku(yaoming, leiming) values('+''''+Edit1.Text+''','''+Edit2.Text+''')');
            YKQry.ExecSQL;
            //在药库中不存在 }
            while not LinShiQry.Eof do
            begin
              if YaoKuQry.Locate('药名',LinShiQry.FieldByName('药名').AsString,[]) then
              begin
                YaoKuQry.Edit;
                YaoKuQry.FieldByName('数量').AsInteger:=YaoKuQry.FieldByName('数量').AsInteger+LinShiQry.FieldByName('数量').AsInteger;
                YaoKuQry.FieldByName('总价').AsFloat:=YaoKuQry.FieldByName('总价').AsFloat+LinShiQry.FieldByName('总价').AsFloat;
                YaoKuQry.Post;
              end
              else begin
                YaoKuQry.Append;
                YaoKuQry.FieldByName('药名').AsString := LinShiQry.FieldByName('药名').AsString;
                YaoKuQry.FieldByName('规格').AsString := LinShiQry.FieldByName('规格').AsString;
                YaoKuQry.FieldByName('类名').AsString := LinShiQry.FieldByName('类名').AsString;
                YaoKuQry.FieldByName('单位').AsString := LinShiQry.FieldByName('单位').AsString;
                YaoKuQry.FieldByName('数量').AsInteger := LinShiQry.FieldByName('数量').AsInteger;
                YaoKuQry.FieldByName('单价').AsFloat := LinShiQry.FieldByName('单价').AsFloat;
                YaoKuQry.FieldByName('总价').AsFloat := LinShiQry.FieldByName('总价').AsFloat;
                YaoKuQry.Post;
              end;
              LinShiQry.Next;
            end;
            Application.MessageBox('录入成功,请继续其它操作!','系统提示',MB_OK+
                 MB_ICONINFORMATION);
            Exit;
            //frmMain.ADOConnection1.CommitTrans;
          except
            //frmMain.ADOConnection1.RollbackTrans;
            Application.MessageBox('录入失败,请仔细核查后再录入!','系统错误提示',MB_OK+
               MB_ICONINFORMATION);
            Exit;
          end;
        finally
          LinShiQry.Free;
          YaoKuQry.Free;
        end;
      end
      else
      begin
        //ShowMessage('no');
      end;
    end;
      

  12.   

    对于这样的问题
    完全可以使用算法设计来做的
    逐条记录遍历分析,可能效率差点,但控制性最好的个人意见而已,我对SQL语法也什么研究的,一般要实现这类事情,都是使用算法来做的_____________________
    http://lysoft.7u7.net
      

  13.   

    YKQry.Close;
            YKQry.SQL.Clear;
            //YKQry.Open;
            ShowMessage('1');
            YKQry.Sql.Text:='update yaoku a,jinyaolishibiao b set a.数量=a.数量+b.数量,a.总价 = a.总价+b.总价 where a.药名=b.药名';
            YKQry.ExecSql;       
            ShowMessage('2');
            YKQry.Sql.Text:='insert into yaoku select * from jinyaolishibiao where 药名 not in (select 药名 from yaoku))'; 
            YKQry.ExecSQL;
    第二条sql可能耗时长些,但应当可以执行