Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Буферизация / 12 сообщений из 12, страница 1 из 1
22.12.2004, 15:43
    #32839589
JuniorFoxik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Помогите, пожалуйста.

Использовала до сих пор блокировку по rlock(), т.с., вручную. Теперь захотелось попробовать буферизацию.
Если можно, напишите, пожалуста последовательно код:
Например, начинаю
=CURSORSETPROP('Buffering', 5, 'myTable' ) && Enable table buffering
Что дальше? Нужно проанализировать, то, что возвращает функция и принять к.-л. решение?
Дальше, меняем данные в таблице

REPLACE там что-то WITH чем-то...

Затем
=TABLEUPDATE(.T.) && && Commits changes
=CURSORSETPROP('Buffering', 1, 'myTable' ) && Disable table buffering

Опять же, нужно проанализировать, что вернули эти функции и принять решение?
...
Рейтинг: 0 / 0
22.12.2004, 17:40
    #32840048
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
=cursorsetprop('buffering', 5, 'Appartm')

LOCAL llSuccess, llReSave, llIsOtherWrite, cStrN
llIsOtherWrite = .F.
llReSave = .T.
cOsobAccount1 = UPPER(ALLTRIM(THISFORM.cOsobAccount1.value))
nAppartNo1 = THISFORM.nAppartNo1.value
nZhilPl1 = THISFORM.nZhilPl1.value
nAllPl1 = THISFORM.nAllPl1.value
nOtopPl1 = THISFORM.nOtopPl1.value
nRoomsQuantity1 = THISFORM.nRoomsQuantity1.value
nPeopleQuantity1 = THISFORM.nPeopleQuantity1.value
nSubs1 = THISFORM.nSubs1.value
IF THISFORM.PrivateYN1.value = 1
nPrivat1 = 0
*THISFORM.cPrivateYN1.caption = "íåïðèâàòèçîâàíà"
ELSE
nPrivat1 = 1
*THISFORM.cPrivateYN1.caption = "ïðèâàòèçîâàíà"
ENDIF
* nPrivat1 = THISFORM.nPrivat1.Value
nPilgi = Pilgi.PilgiId

DO CASE
CASE THISFORM.new_red = "NEW"
cCommand = "INSERT INTO Appartm (Houseid, cOsobAccount, nAppartNo," + ;
"nZhilPl, nAllPl, nOtopPl, nRoomsQuantity," + ;
"nPeopleQuantity, nSubs, nPrivat, PilgiId)" + ;
"VALUES (THISFORM.ChosenHouseStreet, UPPER(ALLTRIM(THISFORM.cOsobAccount1.value))," + ;
"THISFORM.nAppartNo1.value, THISFORM.nZhilPl1.value, THISFORM.nAllPl1.value," + ;
"THISFORM.nOtopPl1.value, THISFORM.nRoomsQuantity1.value," + ;
"THISFORM.nPeopleQuantity1.value, THISFORM.nSubs1.value, nPrivat1, nPilgi)"

CASE THISFORM.new_red = "EDIT"
cCommand = "UPDATE Appartm SET cOsobAccount = cOsobAccount1," + ;
"nAppartNo = nAppartNo1, nZhilPl = nZhilPl1," + ;
"nAllPl = nAllPl1, nOtopPl = nOtopPl1," + ;
"nRoomsQuantity = nRoomsQuantity1, nPeopleQuantity = nPeopleQuantity1," + ;
"nSubs = nSubs1, nPrivat = nPrivat1, PilgiId = nPilgi" + ;
" WHERE Appartm.AppartmId=THISFORM.ChosenHouseStreet"

ENDCASE
SET EXACT ON
IF SEEK(cOsobAccount1, 'Appartm', 'nAppartN') &&AND THISFORM.new_red = "NEW"
= MESSAGEBOX("Îîñîáîâèé ðàóíîê " + cOsobAccount1 + " âæå ïðèñóòíié ó äîâiäíèêó",48, "Äóáëÿæ!!!")
ELSE

DO WHILE m.llReSave=.T.
llReSave = .F.
llSuccess = .T.
BEGIN TRANSACTION

&cCommand

* Ñáðîñ áóôåðà ïåðâîé òàáëèöû
IF m.llSuccess = .T.
llSuccess = TableUpdate(.T.,m.llIsOtherWrite,'Appartm')
ENDIF

* Ñáðîñ áóôåðà âòîðîé òàáëèöû
* IF m.llSuccess = .T.
* llSuccess = TableUpdate(.T.,m.llIsOtherWrite,'Tab2')
* ENDIF
* Ñáðîñ áóôåðà î÷åðåäíûõ òàáëèö
* ....

IF m.llSuccess = .F.
* Íåìåäëåííî ïðåêðàùàåì òðàíçàêöèþ
ROLLBACK
* Òåïåðü íóæåí àíàëèç ïðè÷èíû íåóäà÷è
LOCAL laError(1)
=AERROR(laError)
wait window str(m.laError)
IF m.laError = 1585
= MESSAGEBOX("Ïîêà äàííûé ïîëüçîâàòåëü ðåäàêòèðîâàë äðóãîé âíåñ èçìåíåíèÿ",48, "")
* Ïîêà äàííûé ïîëüçîâàòåëü ðåäàêòèðîâàë äðóãîé âíåñ èçìåíåíèÿ
* Åñëè ðåøèëè ïèñàòü ïîâåðõ, òî
*llIsOtherWrite = .T.
*llReSave = .T.
ELSE
* Àíàëèç êîäà îøèáêè è, âîçìîæíî, ïîâòîð ïîïûòêè èçìåíåíèé
* Åñëè ðåøèëè ïîâòîðèòü ïîïûòêó ñîõðàíåíèÿ ÍÈ×ÅÃÎ ÍÅ ÌÅÍßß
llReSave = .T.
ENDIF
ELSE
END TRANSACTION
ENDIF
ENDDO


thisform.release()

ENDIF
...
Рейтинг: 0 / 0
22.12.2004, 17:41
    #32840051
FM32YO aka KID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Sorry - авторство кода все же принадлежит Максимову а не мне!!!
...
Рейтинг: 0 / 0
22.12.2004, 19:17
    #32840289
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Теоретическую часть почитай здесь
http://forum.foxclub.ru/read.php?f=5&i=101830&t=101739#reply_101830

Вроде неплохо получилось.
...
Рейтинг: 0 / 0
23.12.2004, 08:20
    #32840661
JuniorFoxik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Спасибо!

Еще бы там в коде комментарии были бы на каком-нибудь известном языке, было бы совсем прекрасно... Может можно код прицепить?

Еще раз, спасибо всем.
...
Рейтинг: 0 / 0
23.12.2004, 08:33
    #32840673
JuniorFoxik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Да, еще.

To FM32YO aka KID и Владимиру Максимову.

В самом начале кода сразу стоит =cursorsetprop('buffering', 5, 'Appartm') и никак не анализируется. А в каких случаях она может вернуть .F.? В помощи сказано, что когда функция не может установить указанное свойство.
...
Рейтинг: 0 / 0
23.12.2004, 13:13
    #32841453
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Начать надо с вопроса, где именно будет использоваться код?

Дело в том, что программное назначение через CursorSetProp() не всегда и нужно. Например, то же самое, может быть сделано в DataEnvironment формы через свойство объекта-курсора BufferModeOverride = 5

Любое View по определение может существовать только в режиме оптимистической буферизации (3 или 5) и ни отключить для него буферизацию, ни установить пессимистическую в принципе невозможно.

Далее, конечно, CursorSetProp('buffering') может не установить режим буферизации. Например, забыли настройку SET MULTILOCK или попытка с табличной буферизации переключится на строковую, когда буфер не сброшен. Но все дело в том, где именно и в какой момент эта команда будет подаваться.

Обычно это делается сразу за открытием таблиц или в INIT (LOAD) - формы. Причем формы обычно работают в PrivateDataSession. Т.е. вообще-то никаких конфликтных ситуаций в этот момент быть не должно. Если они тем не менее есть, то это критическая ошибка, требующая вмешательства разработчика. Что-то он в логике не продумал. Вот пусть сам FoxPro это и отлавливает.
...
Рейтинг: 0 / 0
23.12.2004, 13:57
    #32841614
JuniorFoxik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
To ВладимирМ

У меня это должно работать так: имеется форма с TreeView, которое строится на выборке из достаточно большого количества таблиц (SELECT ... INTO CURSOR myCursor). К правой кнопке мыши привязано Shortcut -меню Изменить-Удалить-Добавить и т.д. В зависимости от выбора либо вызывается другая форма (Изменить-Добавить), либо, при выборе "Удалить", удаляется тут же. При удалении "родителя" иногда удалются все "дети", иногда -нет (по выбору пользователя или по логике). Изменения сохраняются в таблицах и производится ThisFormRefresh(). Собственно, это все работает, но цепочка изменений в таблицах растет и хочется как-то все упростить.... Вот и подумала про буферизацию...
...
Рейтинг: 0 / 0
23.12.2004, 14:20
    #32841706
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
У тебя неправильное понимание того, для чего собственно предназначена буферизация. Почитай по ссылке. Там как раз и делается упор на то, а зачем все это нужно.

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

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

По поводу триггеров почитай здесь

http://www.foxclub.ru/kb/index.php?sid=35321&aktion=artikel&rubrik=004&id=104&lang=ru
...
Рейтинг: 0 / 0
23.12.2004, 14:47
    #32841834
JuniorFoxik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Да правильное у меня понимание! Ясно ведь, что если нужно изменить данные, скажем, в пяти таблицах, то никакая буферизация не сократит это количество. Я не о том, я вот о чем: изменение одной записи в одной таблице влечет за собой изменение, напиример, трех записей в другой, а каждое из этих изменений,в свою очередь- еще нескольких записей в третьей таблице. Т.о., при использовании rlock() приходится все это отслеживать, а буферизация позволяет, насколько я поняла, за всем этим не следить, а отслеживать лишь удачное завершение tableupdate() для каждой таблицы, а в случае хотя бы одной неудачи все откатить ROLLBACK'ом. Это я правильно понимаю?
За информацию спасибо, все прочитаю.
...
Рейтинг: 0 / 0
23.12.2004, 15:32
    #32842024
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
Да. За блокировками следить не надо. Это все возьмет на себя буферизация.

Но описанная задача - это явно задача на написание триггеров. Правда, грамотно написать триггер - это целая история. А особенно в твоем случае, когда будут вложенные триггеры.
...
Рейтинг: 0 / 0
23.12.2004, 15:43
    #32842079
JuniorFoxik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Буферизация
То Владимир Максимов.

Вот-вот. Это я о триггерах. По Вашей ссылке все прочитала, да, собственно, и раньше про триггеры было известно. Так что будем решать последовательно, сначала - буферизация, потом- триггеры.

Еще раз, большое спасибо.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Буферизация / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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