DBGrid,dbf 合并 2 个相同的行
DBGrid, dbf merging 2 same rows
我正在使用 DBGrid、dbf 和 DataSource 只是想知道如何在删除某本书时仅将 ammount 删除 1。例如,如果它们相同,我一直在执行合并 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 - 书名
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" 时,您在输入中节省的时间通常会超过您为修复因使用它而出现的错误而必须进行的调试量。
但是,如果这是一个具有支持 Sql 的后端 RDMS 的多用户数据库,最好使用在服务器上执行的 Sql 语句进行插入或更新,例如使用参数化存储过程(避免Sql-注入风险),然后在客户端应用程序中刷新数据。
我正在使用 DBGrid、dbf 和 DataSource 只是想知道如何在删除某本书时仅将 ammount 删除 1。例如,如果它们相同,我一直在执行合并 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 - 书名 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" 时,您在输入中节省的时间通常会超过您为修复因使用它而出现的错误而必须进行的调试量。
但是,如果这是一个具有支持 Sql 的后端 RDMS 的多用户数据库,最好使用在服务器上执行的 Sql 语句进行插入或更新,例如使用参数化存储过程(避免Sql-注入风险),然后在客户端应用程序中刷新数据。