在插入新记录的时候,一次会插入两条,找不到问题所在
请各位大哥帮帮忙,困扰我好久了~~~我真的很郁闷,怎么都找不到问题所在
帮帮我啊~!!! button代码:
 procedure TAddStockFrm.Button1Click(Sender: TObject);
var Payment,Quantity,StorageID:string;begin
    if edit8.text='' then
       showmessage('请输入入库单号')
    else
     if Combobox1.text='' then
      showmessage('请选择供货单位')
     else
       if Combobox2.text='' then
         showmessage('请选择仓库')
       else
         if Combobox3.text='' then
          showmessage('请选择入库货品')
         else
           if edit6.text='' then
             showmessage('请输入货品数量')
           else
             if edit7.text='' then
                showmessage('请输入货品单价')
             else
    begin
    Payment:=floattostr(strtofloat(edit6.text)*strtofloat(edit7.text));
    with LoginFrm.ADOQuery1 do
      begin
       close;
       sql.clear;
       sql.add('insert into Stock   (StockID,FeederID,FeederName,DepotID,DepotName,ProductId,ProductName,Spec,Unit,Quantity,UnitPrice,Payment,StockDate,StockRe)values (' );
       sql.add(''''+edit8.Text+''''+','+''''+combobox1.text+''''+','+''''+edit1.text+''''+','+''''+combobox2.text+''''+','+''''+edit2.text+''''+','+''''+combobox3.text+''''+',');
       sql.add(''''+edit3.text+''''+','+''''+edit4.text+''''+','+''''+edit5.text+''''+','+''''+edit6.text+''''+','+''''+edit7.text+''''+','+''''+Payment+''''+','+''''+maskedit1.text+''''+','+''''+memo1.text+''''+')');
       sql.add('select * from Storage where convert(varchar,DepotID)='+''''+Combobox2.text+''''+'and convert(varchar,ProductID)='+''''+Combobox3.text+'''');
       open;
       first;
       if recordcount=0 then
          begin
           close;
           sql.Clear;
           sql.add('insert into Storage (StorageID,DepotID,DepotName,ProductId,ProductName,Spec,Unit,Quantity)values (' );
           sql.add(''''+edit8.Text+''''+','+''''+combobox2.text+''''+','+''''+edit2.text+''''+','+''''+combobox3.text+''''+','+''''+edit3.text+''''+',');
           sql.add(''''+edit4.text+''''+','+''''+edit5.text+''''+','+''''+edit6.text+''''+')');
           //execsql;
           open;
          end
       else
          begin
          Quantity:=floattostr(strtofloat(Edit6.Text)+fieldbyname('Quantity').asfloat);
          StorageID:=inttostr(fieldbyname('StorageID').asinteger);
          sql.Add('update Storage set Quantity='+''''+Quantity+''''+' where convert(varchar,StorageID)='+''''+StorageID+'''');
          execsql;
          end;
          ADOtable4.Active := false;
          ADOtable4.Active := true;
       showmessage('入库登记成功!') ;      end;
   end;
end; 我真的很郁闷,怎么都找不到问题所在

解决方案 »

  1.   

    是在第一个insert Stock的时候出现两条记录!!!!
      

  2.   

    要么在
    ----------
    sql.add('select * from Storage where convert(varchar,DepotID)='+''''+Combobox2.text+''''+'and convert(varchar,ProductID)='+''''+Combobox3.text+'''');
    ----------
    加入语句:
    execsql;
    if Active then Close;
    sql.Clear;
    要么在这条语句与前一语句之间加一个分号(;),然后再试试看。
      

  3.   

    晕,程序写成这样,真的佩服你.
    在第一个SQL INSERT语句结束后加上GO,或者直接组织好SQL语句,然后SQl.Text := strSql;
    Adoqur.Open;一句一句的执行
      

  4.   

    to楼主,我修改了一下你的代码,可能你会不太习惯
    但我觉得这样看上去比较清爽从你的语句上看,并没有直接插入两条记录的语句
    建议楼主看看是不是因为触发器的原故procedure TForm1.Button1Click(Sender: TObject);
      //------------------------------
      //条件检查
      //------------------------------
      function CheckCondition: Boolean;
      begin
        Result := False;    //在条件检查不成功时,
        //可以加入一条光标定位语句,
        //这样方便用户修改
        if edit8.text = '' then
        begin
          showmessage('请输入入库单号');
          Exit;
        end;    if Combobox1.text = '' then
        begin
          showmessage('请选择供货单位');
          Exit;
        end;    if Combobox2.text = '' then
        begin
          showmessage('请选择仓库');
          Exit;
        end;    if Combobox3.text = '' then
        begin
          showmessage('请选择入库货品');
          Exit;
        end;    if edit6.text = '' then
        begin
          showmessage('请输入货品数量');
          Exit;
        end;    if edit7.text = '' then
        begin
          showmessage('请输入货品单价');
          Exit;
        end;    Result := True;
      end;  //------------------------------
      //执行插入
      //------------------------------
      procedure ExecInsert;
      const
        Stock_Insert_String = 'insert into Stock ' +
                                '(StockID,FeederID,FeederName,' +
                                'DepotID,DepotName,ProductId,' +
                                'ProductName,Spec,Unit,' +
                                'Quantity,UnitPrice,Payment,' +
                                'StockDate,StockRe) ' +
                              'values (%s, %s, %s, ' +
                                '%s, %s, %s, ' +
                                '%s, %s, %s, ' +
                                '%s, %s, %s, ' +
                                '%s, %s)';    Storage_Select_String = 'Select * from Storage ' +
                                'where convert(varchar(50),DepotID) = %s ' +
                                ' and convert(varchar(50),ProductID)= %s';    Storage_Insert_String = 'insert into Storage ' +
                                 '(StorageID,DepotID,DepotName, ' +
                                 'ProductId,ProductName,Spec,' +
                                 'Unit,Quantity)' +
                                'values (%s, %s, %s, ' +
                                '%s, %s, %s, ' +
                                '%s, %s)';    Storage_Update_String = 'update Storage set Quantity=%s ' +
                                'where convert(varchar(50),StorageID)=%s';
      var
        Payment, Quantity, StorageID: string;
      begin
        Payment := FloatToStr(StrToFloat(edit6.text) * StrToFloat(edit7.text));
        with LoginFrm.ADOQuery1 do
        begin
          close;
          SQL.Text :=
            Format(Stock_Insert_String, [
              QuotedStr(edit8.Text), QuotedStr(combobox1.text),
              QuotedStr(edit1.text),
              QuotedStr(combobox2.Text), QuotedStr(edit2.text),
              QuotedStr(combobox3.text),
              QuotedStr(edit3.Text), QuotedStr(edit4.text),
              QuotedStr(edit5.text),
              QuotedStr(edit6.Text), QuotedStr(edit7.text),
              Payment,
              QuotedStr(maskedit1.Text), QuotedStr(memo1.text)]) +
            Format(Storage_Select_String, [QuotedStr(Combobox2.text),
              QuotedStr(Combobox3.text)]);
          Open;
          First; //<--这一句可以取消
          if RecordCount = 0 then
          begin
            Close;
            SQL.Text := Format(Storage_Insert_String,
              [QuotedStr(edit8.Text), QuotedStr(combobox2.text),
               QuotedStr(edit2.text),
               QuotedStr(combobox3.Text), QuotedStr(edit3.text),
               QuotedStr(edit4.text),
               QuotedStr(edit5.Text), QuotedStr(edit6.text)]);
            ExecSQL;
          end
          else
          begin
            Quantity := FloatToStr(StrToFloat(Edit6.Text) +
              Fieldbyname('Quantity').AsFloat);
            StorageID := FieldByName('StorageID').AsString;
            Close;
            SQL.Text := Format(Storage_Update_String,
              [Quantity, QuotedStr(StorageID)]);
            ExecSql;
          end;      ADOtable4.Active := False;
          ADOtable4.Active := True;      ShowMessage('入库登记成功!');
        end;
      end;
    begin
      if CheckCondition then
        ExecInsert;
    end;
      

  5.   

    duanhai(段海) 哈哈你真是好人啊
      

  6.   

    插入的时候用execsql, 查询的时候才用open
    插入两条一般可能是execsql执行了两次,我以前也有插入两条的情况,后来发现有两个地方
    都execsql了。