Траблы с Post для VFP через ADO

aag
Дата: 27.02.2003 12:40:39
Добрый день!
Обновляю (пытаюсь) одни таблицы FoxPro из других
Иду по PK в исходной табл., нахожу эту запись в назн., ADOTable1.Edit; ... копируем поля ADOTable1.Post
И вот тут с незавидной периодичность получаю что-то типа
"Record cannot be located for updating. Some values may have been changed since it was last read"
Что это такое? Какие-такие values были изменены и после какого чтения???
D5, OLE for ODBC
Причем, если делаю тоже самое посредством форм. SQL запроса "update..", то все проходит.
Jozo
Дата: 27.02.2003 13:42:48
а по подробнее можна ... желательна с кодом ?????????????????????
aag
Дата: 27.02.2003 14:49:35
Ответ, кажется, уже сам нашел. К сожалению, к решению это не приблизило.
Такое сообщение может вызывать срабатывание триггера после изменения.
Другое подозрение - фильтрация.
Код таков:
...

// 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, а это существенно медленнее