|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
DmitryKn Посмотрите в свойствах таблицы или CURSORGETPROP() какой у вас тип буферизации. Поставьте сразу 5-ую. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 12:34 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
sg12, 5-я изначально ( ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 12:37 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
DmitryKn Даже не знаю, что и сказать. Возможно, проблема в том, что пользователи напрямую работают с таблицей - это всегда нехорошо. Остается VIEW. Или, в форме попробуйте установить Form.DataSession = 2 и/или Form.BufferMode = 2, что получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 13:09 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
DmitryKn Да, есть еще команда FLUSH() - сброс буферов на диск. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 13:17 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
sg12, Ничто не помогло. Причем решение где-то на поверхности лежит. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 14:44 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
DmitryKn Антивирь, разве. Добавьте в Form.Error() строку MESSAGEBOX(nError) и попробуйте прогнать через циклы, если получится: FOR i = 1 TO RECCOUNT() TABLEUPDATE/TABLEREVERT NEXT ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 15:49 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
Это все замечательно. Предположим, Вы добились своего и запись обновляется. А как Вы с этой формой работать-то собираетесь? Т.е. Вы ввели некое значение, но не успели его сохранить, как у Вас оно было тут же удалено и вернулось старое значение! Вы же обновляете текущими данными с диска. Даже если они не были изменены другим пользователем. Кстати, раз у Вас постоянно идет ругань на то, что буфер изменен. Значит, так оно и есть! Ваша форма что-то постоянно меняет в таблице. Но поскольку буферизация табличная, то автоматического сброса буфера не происходит. А раз буфер был создан, то он, естественно, не может быть обновлен актуальными данными. Я так понимаю, что у Вас форма представляет собой 2 Grid. Где основной Grid - это напрямую таблица DBF в 5 режиме буферизации, а подчиненный Grid - это Local View, который выполняет перезапрос в событии AftreRowColChange основного Grid Если это так, то Вам следует сделать следующее: В событии BeforRowColChange, если предполагается переход на другую строку или выход из формы выполнять проверку факта изменения текущей записи через GetFldState(-1). Если есть изменения, то выполнять сброс буфера в текущей строке с учетом возможного конфликта совместного доступа TableUpdate(.f.,.f.). При переходе на другое поле в рамках текущей записи - ничего не делать Собственно, на этом и все. Актуализация данных будет происходить автоматически, у тех записей, для которых не было никаких изменений. Нет буфера. Вот Вам и надо следить за тем, чтобы этот буфер по каким-либо причинам не создавался. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 17:19 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
DmitryKn ВладимирМ прав, как всегда - буфера надо сбрасывать на каждой строке. Я просто упустил GetFldState. Погуглите его, и, скорее всего, вы найдете готовое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 19:46 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
DmitryKn А лучше - скачать Tastrade (поставлялось в более ранних версиях VFP), и внимательно его изучить. http://drozdov.foxclub.ru/util_r.html ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2017, 20:20 |
|
Как правильно обновить данные на форме
|
|||
---|---|---|---|
#18+
ВладимирМ... Я так понимаю, что у Вас форма представляет собой 2 Grid. Где основной Grid - это напрямую таблица DBF в 5 режиме буферизации, а подчиненный Grid - это Local View, который выполняет перезапрос в событии AftreRowColChange основного Grid Если это так, то Вам следует сделать следующее: В событии BeforRowColChange, если предполагается переход на другую строку или выход из формы выполнять проверку факта изменения текущей записи через GetFldState(-1). Если есть изменения, то выполнять сброс буфера в текущей строке с учетом возможного конфликта совместного доступа TableUpdate(.f.,.f.). При переходе на другое поле в рамках текущей записи - ничего не делать Собственно, на этом и все. Актуализация данных будет происходить автоматически, у тех записей, для которых не было никаких изменений. Нет буфера. Вот Вам и надо следить за тем, чтобы этот буфер по каким-либо причинам не создавался. ВладимирМ, огромное спасибо, сильно помогло. С помощью GetFldState(-1) установил в каких полях создаются изменения, разобрался почему. Дело в том, что форма организована, возможно, не идеально, в стремлении выложить как можно больше информации пользователю напихал контролов на форму, значение которых вычисляется в ходе refresh подчиненного грида, т.е. и в ходе refresh формы, например, при переходе на другую строку в основном гриде. А поскольку привязал контролы к таблице, вот тут буфер и возникал со всеми последствиями. Отвязал контролы - все работает отлично. Теперь нужно просто оптимизировать форму, да и на таблицу критичнее посмотреть. Еще раз огромное спасибо, проблема решена, по крайней мере понятен путь. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2017, 10:27 |
|
|
start [/forum/search_topic.php?author=bormman&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
12ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
135ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
others: | 1168ms |
total: | 1434ms |
0 / 0 |