Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Помогите, пожалуйста. Использовала до сих пор блокировку по rlock(), т.с., вручную. Теперь захотелось попробовать буферизацию. Если можно, напишите, пожалуста последовательно код: Например, начинаю =CURSORSETPROP('Buffering', 5, 'myTable' ) && Enable table buffering Что дальше? Нужно проанализировать, то, что возвращает функция и принять к.-л. решение? Дальше, меняем данные в таблице REPLACE там что-то WITH чем-то... Затем =TABLEUPDATE(.T.) && && Commits changes =CURSORSETPROP('Buffering', 1, 'myTable' ) && Disable table buffering Опять же, нужно проанализировать, что вернули эти функции и принять решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2004, 15:43 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
=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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2004, 17:40 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Sorry - авторство кода все же принадлежит Максимову а не мне!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2004, 17:41 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Теоретическую часть почитай здесь http://forum.foxclub.ru/read.php?f=5&i=101830&t=101739#reply_101830 Вроде неплохо получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2004, 19:17 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Спасибо! Еще бы там в коде комментарии были бы на каком-нибудь известном языке, было бы совсем прекрасно... Может можно код прицепить? Еще раз, спасибо всем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 08:20 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Да, еще. To FM32YO aka KID и Владимиру Максимову. В самом начале кода сразу стоит =cursorsetprop('buffering', 5, 'Appartm') и никак не анализируется. А в каких случаях она может вернуть .F.? В помощи сказано, что когда функция не может установить указанное свойство. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 08:33 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Начать надо с вопроса, где именно будет использоваться код? Дело в том, что программное назначение через CursorSetProp() не всегда и нужно. Например, то же самое, может быть сделано в DataEnvironment формы через свойство объекта-курсора BufferModeOverride = 5 Любое View по определение может существовать только в режиме оптимистической буферизации (3 или 5) и ни отключить для него буферизацию, ни установить пессимистическую в принципе невозможно. Далее, конечно, CursorSetProp('buffering') может не установить режим буферизации. Например, забыли настройку SET MULTILOCK или попытка с табличной буферизации переключится на строковую, когда буфер не сброшен. Но все дело в том, где именно и в какой момент эта команда будет подаваться. Обычно это делается сразу за открытием таблиц или в INIT (LOAD) - формы. Причем формы обычно работают в PrivateDataSession. Т.е. вообще-то никаких конфликтных ситуаций в этот момент быть не должно. Если они тем не менее есть, то это критическая ошибка, требующая вмешательства разработчика. Что-то он в логике не продумал. Вот пусть сам FoxPro это и отлавливает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 13:13 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
To ВладимирМ У меня это должно работать так: имеется форма с TreeView, которое строится на выборке из достаточно большого количества таблиц (SELECT ... INTO CURSOR myCursor). К правой кнопке мыши привязано Shortcut -меню Изменить-Удалить-Добавить и т.д. В зависимости от выбора либо вызывается другая форма (Изменить-Добавить), либо, при выборе "Удалить", удаляется тут же. При удалении "родителя" иногда удалются все "дети", иногда -нет (по выбору пользователя или по логике). Изменения сохраняются в таблицах и производится ThisFormRefresh(). Собственно, это все работает, но цепочка изменений в таблицах растет и хочется как-то все упростить.... Вот и подумала про буферизацию... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 13:57 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
У тебя неправильное понимание того, для чего собственно предназначена буферизация. Почитай по ссылке. Там как раз и делается упор на то, а зачем все это нужно. Буферизация может облегчить процесс внесения изменений, но сократить число модификаций она не в состоянии. Не для этого предназначена. Возможно, тебе стоит подумать о написании триггеров. Т.е. неких процедур, которые будут по определенным правилам автоматически модифицировать содержимое связанных таблиц при внесении изменений в главную. По поводу триггеров почитай здесь http://www.foxclub.ru/kb/index.php?sid=35321&aktion=artikel&rubrik=004&id=104&lang=ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 14:20 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Да правильное у меня понимание! Ясно ведь, что если нужно изменить данные, скажем, в пяти таблицах, то никакая буферизация не сократит это количество. Я не о том, я вот о чем: изменение одной записи в одной таблице влечет за собой изменение, напиример, трех записей в другой, а каждое из этих изменений,в свою очередь- еще нескольких записей в третьей таблице. Т.о., при использовании rlock() приходится все это отслеживать, а буферизация позволяет, насколько я поняла, за всем этим не следить, а отслеживать лишь удачное завершение tableupdate() для каждой таблицы, а в случае хотя бы одной неудачи все откатить ROLLBACK'ом. Это я правильно понимаю? За информацию спасибо, все прочитаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 14:47 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
Да. За блокировками следить не надо. Это все возьмет на себя буферизация. Но описанная задача - это явно задача на написание триггеров. Правда, грамотно написать триггер - это целая история. А особенно в твоем случае, когда будут вложенные триггеры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 15:32 |
|
||
|
Буферизация
|
|||
|---|---|---|---|
|
#18+
То Владимир Максимов. Вот-вот. Это я о триггерах. По Вашей ссылке все прочитала, да, собственно, и раньше про триггеры было известно. Так что будем решать последовательно, сначала - буферизация, потом- триггеры. Еще раз, большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2004, 15:43 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32840289&tid=1595182]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 260ms |
| total: | 419ms |

| 0 / 0 |
