|
|
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Два пользователя одновременно в одной и той же записи файла myfile (буфер № 5) изменяют некое поле, по которому имеется индексация и жмут СОХРАНИТЬ. У того, кто "опоздал", при попытке записи "поверх", появляется сообщение об ошибке № 114 (Индекс не соответствует таблице. Удалите файл индекса и создайте индекс заново). Оно-то и понятно, коль изменяли поле, по которому имеется индекс, и ошибка соответствующая… Но почему, если убрать из цикла указанную (***) строку, то ошибка исчезает? Между Tableupdate(.t.,.f.) и Tableupdate(.t.,.t.) нельзя дополнительные изменения, связанные и индексом, вносить? Или что-то другое? PS Поле myfile.TimeModif никак не связано с индексацией. Текст кода на кнопке СОХРАНИТЬ: * Сохраняем время последней модификации записи Replace myfile.TimeModif With Datetime() Local laError(1), llOverWrite llOverWrite = .F. Do WHILE ! Tableupdate(.F.,m.llOverWrite,'myfile') Aerror(laError) If laError[1,1]=1585 If 6=Messagebox('Писать поверх изменений?', 4+48+256, ; 'Эту запись изменили, пока вы редактировали') * Ответили ДА. Повтор цикла, но уже с перезаписью поверх llOverWrite=.T. *** Следующая строка порождает ошибку: Replace myfile.TimeModif With Datetime() Loop Else Tablerevert(.F.,'myfile') Exit Endif Else Messagebox('В процессе сохранения произошла ошибка '+; LTRIM(Str(laError[1,1]))+Chr(13)+laError[1,2],'Ошибка при сохранении',0+48) Exit Endif Enddo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 04:53 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, форматирование прог.кода сбилось чего-то... Для удобства повторяю. * Сохраняем время последней модификации записи Replace myfile.TimeModif With Datetime() Local laError(1), llOverWrite llOverWrite = .F. Do WHILE ! Tableupdate(.F.,m.llOverWrite,'myfile') Aerror(laError) If laError[1,1]=1585 If 6=Messagebox('Писать поверх изменений?', 4+48+256, ; 'Эту запись изменили, пока вы редактировали') * Ответили ДА. Повтор цикла, но уже с перезаписью поверх llOverWrite=.T. *** Почему следующая строка порождает ошибку? Replace myfile.TimeModif With Datetime() Loop Else Tablerevert(.F.,'myfile') Exit Endif Else Messagebox('В процессе сохранения произошла ошибка '+; LTRIM(Str(laError[1,1]))+Chr(13)+laError[1,2],'Ошибка при сохранении',0+48) Exit Endif Enddo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 05:01 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Hi men dea! > Между Tableupdate(.t.,.f.) и Tableupdate(.t.,.t.) нельзя дополнительные > изменения, связанные и индексом, вносить? Именно так (причём второй параметр не имеет значения - просто нельзя между 2-мя попытками сброса вносить изменения). Если очень надо - то сначала сохрани текущее содержимое записи через SCATTER NAME например, текущий статус GETFLDSTATE(-1), потом сделай откат через Tablerevert(), и наконец снова проведи "изменения" основываясь на предвариетльно спасённых данных. Порча индекса кстати происходит только в памяти - видимо по TableUpdate фокс успевает изменить представление индекса в памяти, и лишь потом обнаруживает конфликт и собственно запись в dbf уже не изменяет... Данная проблема обсуждалась либо тут либо на других фоксовых форумах - foxclub.ru или в FIDO (эхи ru.foxpro и ru.visual.foxpro) - которое можно почитать через Google Groups - так что пользуй поиск. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2005, 16:17 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
С корректировкой индексного поля сделал согласно вашему совету. Работает, как надо. А теперь несколько иная ситуация. Пока один редактировал, другой удалил запись. Первый обнаруживает это. Если согласен на запись поверх, то запись восстанавливается, словно RECALL сработал. Ну, это в общем, понятно. Теперь Вопрос1: Стоит ли эту реанимацию позволять? Вопрос 2. Если все-таки не стоит, то следует ли опоздавшему с корректировкой делать в этом случае TableRevert? Ошибка, вроде, не проявляется. Но, может, при каких-нибудь условиях все-таки выползет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2005, 02:31 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Наверное, точнее было бы спросить: ВСЕГДА ЛИ НУЖНО делать TABLEREVERT, когда произошел какой-то катаклизм при TABLEREVERT(lForce ,.f.) и отказ от "писательства поверх" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2005, 03:12 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Вообще-то в реальной жизни два (и более) человека над одной строкой одного документа одновременно работают ну очччччень редко... Может можно и нужно как-то ограничить их компьютерные возможности? ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2005, 09:51 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
RedrikВообще-то в реальной жизни два (и более) человека над одной строкой одного документа одновременно работают ну очччччень редко... Может можно и нужно как-то ограничить их компьютерные возможности? ;-)А вот неправда! Как раз часто. Звонит тетенька в группу поддержки - говорит: "ой, что-то у меня с документом таким-то". Администратор приложения смотрит и видит, что там какая-то ерунда и, конечно, поскольку это плевое дело, решает поправить сам. Но тетенька еще редактировала строку документа в это время и записала изменения в таблицу. ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2005, 14:34 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Во! Дискуссию устроили...Понятно, что еще и пессимистическая буферизация есть. Лучше б мне на вопрос ответили, дорогие товарищи... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2005, 18:57 |
|
||
|
Индекс и TableUpdate
|
|||
|---|---|---|---|
|
#18+
Hi men dea! > ВСЕГДА ЛИ НУЖНО делать TABLEREVERT, когда произошел какой-то катаклизм при > TABLEREVERT(lForce ,.f.) и отказ от "писательства поверх" ? Если тебе надо "сбросить" статусы "есть изменения" для записей - то надо. Например с имеющимися в буфере изменениями не сделать перезапрос, они опять будут вылазить при повторных сохранениях и т.п. Если же по логике ты НЕ ЗАКОНЧИЛ сохранение, то явно будет лишним - ты убиваешь всё что навводил пользователь - ну т.е. как в Word при попытке закрытия изменённого документа есть выбор между Да, Нет и Отмена (вопрос о сохранении изменений) - то НЕТ - это откат, а Отмена - это не изменять статус, но и не сохранять документ (т.е. мы продолжаем работать с "грязным" буфером - и можем чуть позже снова попробовать всё сохранить). Про "удалённую" запись - тут должна рулить логика предметной области, и "общего" совета дать наверное нельзя. В принципе Recall идеологически похож на Insert новой записи - если логика задачи позволяет - можно оставить и такой "хитрый" способ устранения конфликта совместного редактирования... Только учти, что при этом уже сработали триггера на Delete!!! А при "восстановлении" сработает триггер на Insert... Для представлений к сожалению нет прямого способа разрешить такой конфликт - запись пропадёт по любому, если самому не озаботится о её "восстановлении" или заменить авто-генерируемую команду UPDATE на INSERT... Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2005, 03:49 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=286&tid=1592821]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
93ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 441ms |

| 0 / 0 |
