DBGrid,dbf合并2个相同的行

时间:2016-05-16 15:07:38

标签: delphi datasource lazarus dbf tdbgrid

我正在使用DBGrid,dbf和DataSource只是想出了如何在删除某本书时才这样做,只有ammount会删除1.我被困在一项任务上,如果它们是相同的,那么就会使两行合并。如果书名是"测试"并且我又添加了一行书籍#34;测试"它会合并并将书的数量从1改为2或2到3等。

procedure TForm1.Button1Click(Sender: TObject);

begin
  with dbgrid1.DataSource.DataSet do begin
    Insert;
    Edit;
    DBGrid1.DataSource.DataSet.FieldByName('Nr.').AsInteger;
    Fields.fieldbyname('Year').value := Edit1.Text;
    Fields.fieldbyname('Author').value := Edit2.Text;
    Fields.fieldbyname('Name').value := Edit3.Text;
    Fields.fieldbyname('Ammount').value := Edit4.Text;
    Post;
    Next;

  end;
end;  

在这里,您可以看到它的外观enter image description here

Gads - 年 汽车 - 作者 Nosaukums - BooksName Kopijas- Ammount

1 个答案:

答案 0 :(得分:3)

你可以这样做:

procedure TForm1.AddBook;
var
  ADataSet : TDataSet;
begin
  //  Note: you need to complete this by filling in the DBGrid1.DataSource.DataSet.FieldByName('Nr.').AsInteger;
  //  Also, I'm assuming that the field which stores the number of copies is called "Amount" - change if necessary
  ADataSet := dbgrid1.DataSource.DataSet;
  if ADataSet.Locate('Name', Edit3.Text, []) then begin
    ADataSet.Edit;
    ADataSet.FieldByName('Amount').AsInteger := ADataSet.FieldByName('Amount').AsInteger + 1;
  end
  else begin
    ADataSet.Insert;
    ADataSet.fieldbyname('Year').value := Edit1.Text;
    ADataSet.fieldbyname('Author').value := Edit2.Text;
    ADataSet.fieldbyname('Name').value := Edit3.Text;
    ADataSet.fieldbyname('Amount').value := Edit4.Text;
  end;
  ADataSet.Post;
end;

这样可以避免在数据库中有两行具有相同的Name字段值,这比拥有重复项更可取,然后通过更新一个并删除另一个来将它们合并在一起。

另外,请注意我已经避免使用""构造。当您使用"和#34;时,您在键入时节省的内容通常会超出您为修复由于其使用而导致的错误所需的调试量。

但是,如果这是一个支持Sql的后端RDMS的多用户数据库,那么最好使用在服务器上执行的Sql语句进行插入或更新,例如:使用参数化存储过程(以避免Sql-Injection风险),然后刷新客户端应用程序中的数据。