|
Сбивается Recno после Tableupdate
|
|||
---|---|---|---|
#18+
Здравствуйте, уважаемые эксперты! Подскажите пожалуйста в чём проблема. Стандартная ситуация. В Форме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. Кто-нибудь сталкивался с чем-то подобным? Почему такое происходит и как бороться? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 00:20 |
|
Сбивается Recno после Tableupdate
|
|||
---|---|---|---|
#18+
NeoEgorПочему такое происходит Из Help tableupdateПри определении 0 или 1 для nRows , указатель записи остается на записи, где изменения не могли быть зафиксированы. NeoEgorкак бороться?Я бы так сделал: Код: sql 1. 2. 3. 4. 5.
Вообще-то, если какие-либо изменения не зафиксированы, это не есть хорошо, так что может не стоит сразу возвращаться, а повторно выдать команду с nRows=0, проверив возвращенное значение ? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 04:53 |
|
Сбивается Recno после Tableupdate
|
|||
---|---|---|---|
#18+
Jonny540, Спасибо за ответ. У меня нет никаких предположений относительно того, какие изменения на первой записи производятся. Тем более что ошибка не повторяется при аналогичных действиях. Если запустить программу в режиме разработки - то указатель остаётся на той записи, на которой он был при запуске. Например, был на record 200, кликнул на 250 - получаю Messagebox 250 и 200, при повторе действий уже не сбивается. Вот ещё какая ремарка: перед тем как зайти в редактирование, я устанавливаю указатель механизмом поиска, командой locate. И если в поиске набрать неточное совпадение - указатель переместится на eof('client'). Однако, при клике грида на ближайшей найденной по locate записи, указатель устанавливается именно на эту запись, а потом сбивается. Что же может глючить? Грид? Контролы редактирования? Контролы поиска через locate? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 07:43 |
|
Сбивается Recno после Tableupdate
|
|||
---|---|---|---|
#18+
Очень желательно открывать вообще все формы в Private DataSession. В этом случае совершенно не важно как перемещается указатель записей в какой-либо форме. Он никак, никоим образом, не повлияет на положение указателя записи в другой форме, поскольку таблицы открыты в разных DataSession. Правда в этом случае придется поменять идеологию работы. Необходимо будет в подчиненную форму передавать идентификатор редактируемой записи, чтобы при открытии подчиненной формы встать на нужную запись. Т.е. вызов подчиненной формы будет выглядеть примерно так Код: sql 1.
А в методе init-подчиненной формы надо будет написать примерно следующее Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 11:03 |
|
Сбивается Recno после Tableupdate
|
|||
---|---|---|---|
#18+
У Вас настроен табличный (5) режим буферизации. Параметр 1 в функции TableUpdate() означает, что надо сбросить буфер во всех записях, где он был изменен. После этой команды указатель записи будет установлен на последнюю запись, в которой произошел сброс буфера. Следовательно, если после команды TableUpdate() произошло перемещение указателя записи, то это значит, что была изменена больше, чем одна запись. Простой пример Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Как видите, произошло перемещение указателя записи на последнюю измененную запись. Ищите, где у Вас происходит модификация таблицы ДО сброса буфера. В качесте проверки, посмотрите, что вернет функция Код: sql 1.
Если ее вызвать, скажем, в init подчиненной формы. Если была изменена какая-либо запись, то Вы получите физический номер этой записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 11:22 |
|
|
start [/forum/topic.php?fid=41&msg=38131917&tid=1583185]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 155ms |
0 / 0 |