Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Траблы с Post для VFP через ADO / 3 сообщений из 3, страница 1 из 1
27.02.2003, 12:40
    #32112038
aag
aag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с Post для VFP через ADO
Добрый день!
Обновляю (пытаюсь) одни таблицы 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
27.02.2003, 13:42
    #32112087
Jozo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с Post для VFP через ADO
а по подробнее можна ... желательна с кодом ?????????????????????
...
Рейтинг: 0 / 0
27.02.2003, 14:49
    #32112160
aag
aag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Траблы с Post для VFP через ADO
Ответ, кажется, уже сам нашел. К сожалению, к решению это не приблизило.
Такое сообщение может вызывать срабатывание триггера после изменения.
Другое подозрение - фильтрация.
Код таков:
Код: 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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Траблы с Post для VFP через ADO / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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