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

时间:2018-07-02 18:08:03

标签: ms-access-2010 delphi-7

我有一个名为ReceiptTable的Access数据库表,具有以下字段名称:item namebuying priceselling pricegoods totalcashchange。我正在使用Adoquery和数据源连接到Access数据库。当我想将记录更新到receiveTable时,我使用以下代码从数据库中找到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的一行被更新,而具有相似项目名称的其他行却没有被更新。我应该在上面添加什么代码,以便使用编辑框中的值更新所有具有相似项目名称的行?

1 个答案:

答案 0 :(得分:0)

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

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语句更新表,或者 如果可以的话,请按'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};
...