Копировать запись из одной таблицы в другую не работает

Я использую BDE и плоские таблицы. У меня есть две одинаковые таблицы, tblOne и tblTwo. Я пытаюсь скопировать данные из одной таблицы в другую. Не вся БД, а только одна конкретная запись, использующая это:

function Tdm.CopyRecord(var tblFrom,tblTo : TTable) : Boolean;
var
  i : Integer;
begin
  Result:=False;
  try
    tblTo.Insert;
    for i:=1 to tblFrom.FieldCount-1 do
    begin
      if tblFrom.Fields[i].FieldName = tblTo.Fields[i].FieldName then
        tblTo.Fields[i].Value:=tblFrom.Fields[i].Value;
    end;
    tblTo.Post;
    Result:=True;
  finally
  end;
end;

if CopyRecord(tblOne,tblTwo) then...

Проходя через это, все значения являются «нулевыми» для таблицы «Из».

После сообщения я получаю пустую запись, добавленную в tblTo. Неудивительно, что все значения равны нулю. :)

Где я ошибаюсь при копировании данных? Не доходит до функции копирования.

Я был в этом в течение нескольких часов и не могу заставить его работать. Наверное, я упускаю из виду что-то простое. Я добавил параметр «var», чтобы увидеть, имеет ли это какое-то значение, но это не так.

Да, кстати, я начинаю цикл с «1», а не с «0», так как первое поле в обоих файлах — AutoInc.


person Community    schedule 17.03.2013    source источник
comment
Есть ли причина, по которой вы не используете TDataSet.CopyFields? (например, при использовании старой версии Delphi [до D2006]) docwiki.embarcadero.com/Libraries/XE3/ru/   -  person Gerry Coll    schedule 18.03.2013
comment
if tblTo.FindField(tblFrom.Fields[i].FieldName) <> nil then tblTo.FieldByName(tblFrom.Fields[i].FieldName).Value := tblFrom.Fields[i].Value; - так будет точнее.   -  person Abelisto    schedule 18.03.2013
comment
Вы уверены, что с вашим tblFrom все в порядке? Убедитесь, что он открыт и что в нем действительно есть хотя бы одна запись для копирования.   -  person Rob McDonell    schedule 18.03.2013


Ответы (1)


Вот как бы я это сделал:

function CopyRecord(tblFrom, tblTo: TTable; const StartIndex: Integer=0): Boolean;
var
  i: Integer;
  FieldFrom, FieldTo: TField;
begin
  Result := False;
  for i := StartIndex to tblFrom.FieldCount - 1 do
  begin
    FieldFrom := tblFrom.Fields[i];
    FieldTo := tblTo.FindField(FieldFrom.FieldName);
    if Assigned(FieldTo) then
    begin
      FieldTo.Value := FieldFrom.Value;
      Result := True;
    end;
  end;
end;

Я бы не стал использовать tblTo.Insert/tblTo.Post внутри метода CopyRecord. а скорее используйте его снаружи, например:

tblTwo.Append;
if CopyRecord(tblOne, tblTwo, 1) then
  tblTwo.Post
else
  tblTwo.Cancel;

Это может быть повторно использовано также в режиме Edit.

person kobik    schedule 17.03.2013
comment
Спасибо за предложение, я использую D5, извините, должен был упомянуть об этом. - person ; 18.03.2013
comment
Спасибо за предложение, я использую D5, извините, должен был упомянуть об этом. Тот же результат с кодом Кобика. Пустая строка в целевом файле. Проходя через, ни один из них не прошел в ifassign(FieldTo), затем я установил внутри него точку останова, и она так и не попала туда. Он показывает правильное количество полей (15) для итерации, но все значения From по-прежнему равны нулю. Глупая вещь здесь не позволила мне закончить редактирование. Пять минут слишком мало, когда слишком легко нажать Enter и завершить комментарий — миллионы раз. - person ; 18.03.2013
comment
небольшая ошибка, обнаруженная @snowfrog, упомянутая в NAA: It has to be: FieldTo := tblTo.FindField(FieldFrom.FieldName); - person bummi; 09.12.2014