gpt4 book ai didi

delphi - DBGrid、dbf 合并 2 个相同的行

转载 作者:行者123 更新时间:2023-12-02 06:51:01 25 4
gpt4 key购买 nike

我正在使用 DBGrid、dbf 和 DataSource,只是想出了如何在删除某本书时仅将 ammount 删除 1。如果两行相同,例如如果书籍名称是“Test”,我将添加另一行书籍和“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;

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

Gads - 年汽车 - 作者Nosaukums - 书籍名称Kopijas-Ammount

最佳答案

你可以这样做:

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”时,您在键入时节省的时间通常会超出您为修复由于使用“with”而出现的错误而必须进行的调试量。

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

关于delphi - DBGrid、dbf 合并 2 个相同的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37257176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com