powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Траблы с Post для VFP через ADO
3 сообщений из 3, страница 1 из 1
Траблы с Post для VFP через ADO
    #32112038
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Обновляю (пытаюсь) одни таблицы 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..", то все проходит.
...
Рейтинг: 0 / 0
Траблы с Post для VFP через ADO
    #32112087
Фотография Jozo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по подробнее можна ... желательна с кодом ?????????????????????
...
Рейтинг: 0 / 0
Траблы с Post для VFP через ADO
    #32112160
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ответ, кажется, уже сам нашел. К сожалению, к решению это не приблизило.
Такое сообщение может вызывать срабатывание триггера после изменения.
Другое подозрение - фильтрация.
Код таков:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
...
// 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, а это существенно медленнее
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Траблы с Post для VFP через ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]