powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сбивается Recno после Tableupdate
6 сообщений из 6, страница 1 из 1
Сбивается Recno после Tableupdate
    #38131578
NeoEgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые эксперты!
Подскажите пожалуйста в чём проблема.

Стандартная ситуация. В Форме1 есть грид read-only с таблицей Client,
при нажатии на кнопку редактирования попадаем в Форму2, чтобы изменять поля.
Buffering таблицы 5.

В Форме2 есть кнопка OK, в которой есть команда tableupdate(1,.t.,'Client')

Эта команда иногда сбивает Recno таблицы Client,
соответственно при последующем показе Формы1 указатель грида уже на другой записи,
что вызывает неудобство пользователей.

Сбивается далеко не всегда, а при каких-то непонятных обстоятельствах, не поймать каких.
Но замечено, что стабильно сбивается при первом запуске программы.
Для проверки в кнопку OK написал такой код:

MESSAGEBOX(RECNO('client'))
tableupdate(1,.t.,'Client')
MESSAGEBOX(RECNO('client'))

и при выполнении вижу последовательно messagebox с номером, например, 200, и после сразу с номером 1.
Повтор такого же действия уже проблему не обнаруживает, и видно как надо - 200 и 200.

Кто-нибудь сталкивался с чем-то подобным? Почему такое происходит и как бороться?

Спасибо.
...
Рейтинг: 0 / 0
Сбивается Recno после Tableupdate
    #38131655
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NeoEgorПочему такое происходит
Из Help tableupdateПри определении 0 или 1 для nRows , указатель записи остается на записи, где изменения не могли быть зафиксированы.

NeoEgorкак бороться?Я бы так сделал:
Код: sql
1.
2.
3.
4.
5.
lnRec=recno('Client')
tableupdate(1,.t.,'Client')
...
select client
go lnRec


Вообще-то, если какие-либо изменения не зафиксированы, это не есть хорошо,
так что может не стоит сразу возвращаться, а повторно выдать команду с nRows=0,
проверив возвращенное значение ?
...
Рейтинг: 0 / 0
Сбивается Recno после Tableupdate
    #38131679
NeoEgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540,

Спасибо за ответ.
У меня нет никаких предположений относительно того,
какие изменения на первой записи производятся.
Тем более что ошибка не повторяется при аналогичных действиях.
Если запустить программу в режиме разработки -
то указатель остаётся на той записи, на которой он был при запуске.
Например, был на record 200, кликнул на 250 - получаю
Messagebox 250 и 200, при повторе действий уже не сбивается.

Вот ещё какая ремарка: перед тем как зайти в редактирование, я устанавливаю
указатель механизмом поиска, командой locate.
И если в поиске набрать неточное совпадение -
указатель переместится на eof('client').
Однако, при клике грида на ближайшей найденной по locate записи,
указатель устанавливается именно на эту запись, а потом сбивается.

Что же может глючить?
Грид? Контролы редактирования? Контролы поиска через locate?
...
Рейтинг: 0 / 0
Сбивается Recno после Tableupdate
    #38131881
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень желательно открывать вообще все формы в Private DataSession. В этом случае совершенно не важно как перемещается указатель записей в какой-либо форме. Он никак, никоим образом, не повлияет на положение указателя записи в другой форме, поскольку таблицы открыты в разных DataSession.

Правда в этом случае придется поменять идеологию работы. Необходимо будет в подчиненную форму передавать идентификатор редактируемой записи, чтобы при открытии подчиненной формы встать на нужную запись.

Т.е. вызов подчиненной формы будет выглядеть примерно так

Код: sql
1.
do form ChildForm.scx with MyTab.ID



А в методе init-подчиненной формы надо будет написать примерно следующее

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
LParameters tnID
if type("m.tnID") <> 'N' or m.tnID <= 0
    m.tnID = 0
endif
if m.tnID = 0
    * Создание новой записи
    select MyTab
    append blank
else
    * Редактирование записи
    =seek(m.tnID,'MyTab','ID')
endif
...
Рейтинг: 0 / 0
Сбивается Recno после Tableupdate
    #38131917
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вас настроен табличный (5) режим буферизации. Параметр 1 в функции TableUpdate() означает, что надо сбросить буфер во всех записях, где он был изменен. После этой команды указатель записи будет установлен на последнюю запись, в которой произошел сброс буфера.

Следовательно, если после команды TableUpdate() произошло перемещение указателя записи, то это значит, что была изменена больше, чем одна запись.

Простой пример

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create cursor test (f1 i)
insert into test (f1) values (1)
insert into test (f1) values (2)
set multilock on
=cursorSetProp('buffering',5)

* Модифицируем все записи
replace all f1 with f1 + 1
* Переходим к первой записи
go top
?Recno()      && Вернет значение 1
=TableUpdate(1,.T.)
?Recno()      && Вернет значение 2



Как видите, произошло перемещение указателя записи на последнюю измененную запись. Ищите, где у Вас происходит модификация таблицы ДО сброса буфера.

В качесте проверки, посмотрите, что вернет функция

Код: sql
1.
?GetNextModified(0,'MyTab')


Если ее вызвать, скажем, в init подчиненной формы. Если была изменена какая-либо запись, то Вы получите физический номер этой записи.
...
Рейтинг: 0 / 0
Сбивается Recno после Tableupdate
    #38132002
NeoEgor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владимир, спасибо за совет!
Буду искать...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Сбивается Recno после Tableupdate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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