我使用的是DBGrid,dbf和DataSource。当移除某一本书时,只移除1。我一直被困在一个任务中,如果它们是相同的--例如,如果图书名为"Test“,那么它们将合并为2行;如果图书名为"Test”,我会添加另一行的图书anem“Test”,它将合并并将图书的装载从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;
在这里你可以看到它的样子
Gads -年份汽车-作者Nosaukums BooksName Kopijas Ammount
发布于 2016-05-16 15:25:27
你可以这样做:
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;
这种方法避免了数据库中有两个具有相同名称字段值的行,这比拥有重复项,然后通过更新其中一个和删除另一个合并到一起更好。
另外,请注意,我避免使用"with“构造。当您使用"with“时,您在键入时保存的内容通常会超出调试的数量,以修复由于使用而出现的错误。
但是,如果这是一个具有支持Sql的后端RDMS的多用户数据库,最好使用在服务器上执行的Sql语句进行插入或更新,例如使用参数化存储过程(以避免Sql注入风险),然后刷新客户端应用程序中的数据。
https://stackoverflow.com/questions/37257176
复制相似问题