Ответ, кажется, уже сам нашел. К сожалению, к решению это не приблизило.
Такое сообщение может вызывать срабатывание триггера после изменения.
Другое подозрение - фильтрация.
Код таков:
...
// FKeyFieldNames держит список поле PK
// ф-ция ValueAsString преобраз. значения поля в формат FoxPro (даты и пр.)
S := '';
for I := 0 to FKeyFieldNames.Count - 1 do
S := S + FKeyFieldNames[I] + ' = ' + ValueAsString(SrcTable.FieldByName(FKeyFieldNames[I])) + ' and ';
SetLength(S, Length(S) - 5);
try
DestTable.Filter := S;
DestTable.Filtered := True;
// Filter и Locate не учитывают регистр в полях PK, поэтому Filter может вернуть несколько записей
N := DestTable.RecordCount;
if N > 0 then
begin
DestTable.First;
if N > 1 then
begin
while not DestTable.Eof do
begin
IsFound := False;
for I := 0 to FKeyFieldNames.Count - 1 do
begin
IsFound := (DestTable.FieldByName(FKeyFieldNames[I]).Value = SrcTable.FieldByName(FKeyFieldNames[I]).Value);
if not IsFound then Break;
end;
if IsFound then
Break
else
DestTable.Next;
end;
end;
DestTable.Edit;
for I := 0 to DestTable.FieldCount - 1 do
begin // PK пропускаем
if FKeyFieldNames.IndexOf(SrcTable.Fields[I].FieldName) >= 0 then Continue;
DestTable.Fields[I].Value := SrcTable.Fields[I].Value;
end;
DestTable.Post; // Вот здесь!!!!
DestTable.Filtered := False; // можно и раньше - толку никакого |
|
...
Однако, что со всем этим делать? Если через ADOQuery - то проходит, но тогда приходится без UpdateBatch, а это существенно медленнее