在访问 table 中搜索字段名称,然后使用值 delphi 7 更新相关字段名称

Search for field name in access table then update relevant fields names with values delphi 7

我有一个名为 ReceiptTable 的 Access 数据库 table,具有以下字段名称:item namebuying priceselling pricegoods total , cash, change。我正在使用 Adoquery 和数据源连接到访问数据库。当我想将记录更新到 receiptTable 时,我使用以下代码从数据库中找到一个 item name,然后使用编辑框字段值中的值更新数据库中具有相似项目名称的所有记录:

procedure TReceiptForm.BitBtn1Click(Sender: TObject);
begin
with ADOQuery1 do
ADOQuery1.Open;
ADOQuery1.Locate('item name',Edit1.Text,[]) ;
ADOQuery1.edit;
ADOQuery1.FieldValues['goods total']:=edit3.Text;
ADOQuery1.FieldValues['cash']:=edit4.Text;
ADOQuery1.FieldValues['change']:=edit5.Text;
ADOQuery1.Post;
end;

我遇到的问题是只更新了带有 item name 的一行,但没有更新具有相似项目名称的其他行。我应该在上面添加什么代码,以便使用编辑框中的值更新所有具有相似项目名称的行?

这个简单的代码回答了您的问题:

procedure TReceiptForm.BitBtn1Click(Sender: TObject);
var
    itemname, goodstotal, cash, change: string;
begin
    // Execute query
    try
        ADOQuery1.Open;
    except
        on E: Exception do begin
            ShowMessage(E.Message);
            Exit;
        end{on};
    end{try};
    // Values
    itemname   := Edit1.Text;
    goodstotal := Edit3.Text;
    cash       := Edit4.Text;
    change     := Edit5.Text;
    // Find first matching record, then go to the end of resultset.
    try
        ADOQuery1.DisableControls;
        if ADOQuery1.Locate('item name', itemname, []) then begin
            while not ADOQuery1.Eof do begin
                if ADOQuery1.FieldByName('item name').AsString = itemname then begin
                    ADOQuery1.Edit;
                    ADOQuery1.FieldValues['goods total'] := goodstotal;
                    ADOQuery1.FieldValues['cash']        := cash;
                    ADOQuery1.FieldValues['change']      := change;
                    ADOQuery1.Post;
                end{if};    
                ADOQuery1.Next;
            end{while};
        end{if};
    finally
        ADOQuery1.EnableControls;
    end{try};
end;

这可行,但您可以考虑使用一个 SQL 语句来更新 table,或者 如果可以通过 'item name' 订购您的查询并使用此:

...
// Find first matching record, then update while next record matches too.
if ADOQuery1.Locate('item name', itemname, []) then begin
    while (not ADOQuery1.Eof) and 
          (ADOQuery1.FieldByName('item name').AsString = itemname) do begin
        ADOQuery1.Edit;
        ADOQuery1.FieldValues['goods total'] := goodstotal;
        ADOQuery1.FieldValues['cash']        := cash;
        ADOQuery1.FieldValues['change']      := change;
        ADOQuery1.Post;
        ADOQuery1.Next;
    end{while};
end{if};
...