如何从访问数据库表中查找和定位数据,并使用已更改的相关字段更新另一个表

时间:2018-05-14 14:46:33

标签: ms-access-2007 delphi-7

我有一个带有table1的访问数据库,其中包含3个字段名称,即项目名称,库存和库存。该数据库使用Delphi 7中的Adoquery和Datasource来更新table1中的数据。我使用以下代码:

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ADOQuery1.Open;
  ADOQuery1.Locate('Item name',Edit1.Text,[]) ;
  ADOQuery1.Edit;
  ADOQuery1.FieldValues['Item name']:=edit1.Text;
  ADOQuery1.FieldValues['stock in']:=edit2.Text;
  ADOQuery1.FieldValues['stock out']:=Edit3.Text;
  ADOQuery1.post;
end

此代码仅在edit1框中有一个要更新的项目时有效。我需要一个可以一次搜索多个项目名称的代码,并更新已更改字段值的相关项目名称。我试过的是使用上面的代码将数据存储在具有相似字段名称的单独临时表2上,但我不知道可以从这个单独的表中搜索和定位项名称的代码2然后更新table1中的相关字段已根据项目名称更改

1 个答案:

答案 0 :(得分:1)

如果我理解你的更正,你想为[Item Name]键入多个值,为[stock in][stock out]输入相同数量的值

然后您想要找到与[Item Name]的每个值匹配的记录并将其更新到您的数据库

一种选择是使用3 Memo controls代替3 Edit controls,然后您可以一次输入多个值。

现在你需要做的就是把你已经拥有的代码放在循环中,从第一个Memo中读取所有值。

这是一个例子

var
  i: integer;
begin
  ADOQuery1.Open;

  for i := 0 to MemoItemNames.Lines.Count - 1 do
  begin
    // ALWAYS test if the record can be located, else you are editing a random record !!!!
    if ADOQuery1.Locate('Item name', MemoItemNames.Lines[i], [])) then
    begin
      ADOQuery1.Edit;
      ADOQuery1.FieldValues['stock in']  := MemoStockIn.Lines[i];
      ADOQuery1.FieldValues['stock out'] := MemoStockOut.Lines[i];
      ADOQuery1.post;
    end; 
  end;

这需要额外编码,以检查外翻是否有效,例如每个备注中的行数必须相同,或stock in值的格式,等等......

您的问题可能有更好的解决方案,所以如果您告诉我们您要解决的问题,我们可以提出更优雅的解决方案