powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Индекс и TableUpdate
9 сообщений из 9, страница 1 из 1
Индекс и TableUpdate
    #33412635
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Два пользователя одновременно в одной и той же записи файла 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
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33412636
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, форматирование прог.кода сбилось чего-то...
Для удобства повторяю.


* Сохраняем время последней модификации записи
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
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33415384
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33415721
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С корректировкой индексного поля сделал согласно вашему совету. Работает, как надо.
А теперь несколько иная ситуация. Пока один редактировал, другой удалил запись. Первый обнаруживает это. Если согласен на запись поверх, то запись восстанавливается, словно RECALL сработал. Ну, это в общем, понятно.
Теперь
Вопрос1: Стоит ли эту реанимацию позволять?
Вопрос 2. Если все-таки не стоит, то следует ли опоздавшему с корректировкой делать в этом случае TableRevert? Ошибка, вроде, не проявляется. Но, может, при каких-нибудь условиях все-таки выползет?
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33415727
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, точнее было бы спросить:
ВСЕГДА ЛИ НУЖНО делать TABLEREVERT, когда произошел какой-то катаклизм при TABLEREVERT(lForce ,.f.) и отказ от "писательства поверх" ?
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33415743
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то в реальной жизни два (и более) человека над одной строкой одного документа одновременно работают ну очччччень редко... Может можно и нужно как-то ограничить их компьютерные возможности? ;-)
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33415820
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedrikВообще-то в реальной жизни два (и более) человека над одной строкой одного документа одновременно работают ну очччччень редко... Может можно и нужно как-то ограничить их компьютерные возможности? ;-)А вот неправда! Как раз часто. Звонит тетенька в группу поддержки - говорит: "ой, что-то у меня с документом таким-то". Администратор приложения смотрит и видит, что там какая-то ерунда и, конечно, поскольку это плевое дело, решает поправить сам. Но тетенька еще редактировала строку документа в это время и записала изменения в таблицу. ;-)
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33415992
men dea
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во! Дискуссию устроили...Понятно, что еще и пессимистическая буферизация есть.
Лучше б мне на вопрос ответили, дорогие товарищи... :)
...
Рейтинг: 0 / 0
Индекс и TableUpdate
    #33428691
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi men dea!

> ВСЕГДА ЛИ НУЖНО делать TABLEREVERT, когда произошел какой-то катаклизм при
> TABLEREVERT(lForce ,.f.) и отказ от "писательства поверх" ?

Если тебе надо "сбросить" статусы "есть изменения" для записей - то надо.
Например с имеющимися в буфере изменениями не сделать перезапрос, они опять
будут вылазить при повторных сохранениях и т.п.
Если же по логике ты НЕ ЗАКОНЧИЛ сохранение, то явно будет лишним - ты
убиваешь всё что навводил пользователь - ну т.е. как в Word при попытке
закрытия изменённого документа есть выбор между Да, Нет и Отмена (вопрос о
сохранении изменений) - то НЕТ - это откат, а Отмена - это не изменять
статус, но и не сохранять документ (т.е. мы продолжаем работать с "грязным"
буфером - и можем чуть позже снова попробовать всё сохранить).
Про "удалённую" запись - тут должна рулить логика предметной области, и
"общего" совета дать наверное нельзя. В принципе Recall идеологически похож
на Insert новой записи - если логика задачи позволяет - можно оставить и
такой "хитрый" способ устранения конфликта совместного редактирования...
Только учти, что при этом уже сработали триггера на Delete!!! А при
"восстановлении" сработает триггер на Insert... Для представлений к
сожалению нет прямого способа разрешить такой конфликт - запись пропадёт по
любому, если самому не озаботится о её "восстановлении" или заменить
авто-генерируемую команду UPDATE на INSERT...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Индекс и TableUpdate
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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