|
|
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Странное дело получается.... Вообщем так 1)в майн программе стоит SET EXCLUSIVE OFF 2)использую приватные датасессии в формах, там в BeforeOpenTables стоит SET EXCLUSIVE OFF итд, команд SET DATABASE TO (namebasedan) open database.... НЕТ!!! В этих формах в DE понапиханы таблицы. открываю, форму, все работает значит окружение формы контейнер баз нашла по путям поиска, таблицы открыла-все отобразилось и нашлось 2)значит запустил я майн прогу, завелась ас топ левел форма *БД нигде точно не открываю!!! с меню, там в пункте меню стоит запуск формы на архивацию,там идет такая проверка на эксклюзивночсть открытия LPARAMETERS tcnamebasedan *SET STEP ON IF !PARAMETERS()=1 MESSAGEBOX("Не передан параметр-название БД") RETURN ENDIF ************************************************************** * Проверяем на предмет незанятости базы данных LOCAL llZanjato,_Return llZanjato = .T. _Return=.f. DO WHILE llZanjato && крутимся в цикле, пока не освободится БД TRY OPEN DATABASE (tcnamebasedan) EXCLUSIVE && если база открылась, то работаем llZanjato = .F. _Return=.T. CATCH IF MESSAGEBOX("Кто-то работает с базой данных. Архивировать базу данных невозможно."+Chr(10)+; "Закройте все окна, завершите работу программы на других компьютерах и повторите попытку."+Chr(10)+Chr(10)+; "Повторить попытку архивирования?",5+16+0,"Ошибка") = 4 then llZanjato = .T. ELSE _Return=.F. ENDIF FINALLY ENDTRY ENDDO * Резко закрываем активные базы и таблицы CLOSE DATABASE ALL RETURN _Return вариант А: запускаю форму-архивирую, все нормально Все как бы нормально, обрабатывается возвращает _Return=.T. Вариант Б: Эмулируем тыкания кнопок юзера на одной локальной машине, без участия сети: -юзер нажал форму с данными, соответственно открыл БД шарово, все нормально, данные в гридах видит и радуется. -стукнуло ему в голову не закрыв форму с данными запустить форму архивации, и моему удивлению нет предела!!! хоть и БД открыта им шарово на локальной машине, легко выполняется строка OPEN DATABASE (tcnamebasedan) EXCLUSIVE и соответственно эта процедурка возвращает RETURN _Return Начинаем архивировать и получаем ошибки на невозможность архивации дбф-ок, которые участвуют в форме данных. пробовал и fopen(...,2) use контейнер.DBC excl итд-такая же билиберда. То вдруг возникает такая ситуация- запустили форму с отображением данных- запустили на архивацию-опять никакого предупреждения что что то там используется,выполняется CLOSE DATABASE ALL RETURN _Return все архивируется, но форма с данными остается с "белыми гридами" :-) Вопрос: как же мне эта безболезненно обойти это все??? предложения по архивированию раром с ключом "архивировать испольуемые файлы", руками в форме открывать, потом закрывать таблицы и контейнеры баз не прредлагать Неужели к 9 фоксу ничего мудрого не придумано??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2005, 00:47:51 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Да, приходиться беседовать тихо сам с собою.......... Неужели нет соображений?? Ваще меня удивляет возможность выполнения команд, следующих друг за другом open database data shared open database data excl без всяких ошибок. Почему? Проблему с открытием решил так автор LOCAL namebasewithrash,_Return,lcOldError namebasewithrash= tcnamebasedan+'.DBC' _Return=.f. lcOldError=ON("ERROR") ON ERROR CLOSE DATABASES ALL lnFH=Fopen(namebasewithrash,2) IF m.lnFH<0 Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr(13)+ ; "Закройте все окна, завершите работу программы на других компьютерах и повторите попытку.",16,"Ошибка!!!") ON ERROR &lcOldError _Return=.f. ELSE _Return=.T. &&открылась БД ENDIF Fclose(m.lnFH) ON ERROR &lcOldError CLOSE DATABASES ALL RETURN _Return=.T. Но проблема "белых гридов" остается То есть если открыта форма с данными, и происходит процедуры архивации, то БД закрывается. Че делать, как быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 19:33:39 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Попробуйте закрыть проект разработки программы - он открывает Database exclusive... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2005, 22:37:44 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Sergey ChПопробуйте закрыть проект разработки программы - он открывает Database exclusive... Я веду речь о экзешнике, извините что не сказал сразу сузим вопрос :-) почему легко в командном окне выполняется 3 строчки без ошибок CLOSE DATABASE ALL open database data shared open database data excl и как это побороть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 00:03:32 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
_иван_3 строчки без ошибок CLOSE DATABASE ALL open database data shared open database data excl Я бы сказал, что это глюк. А побороть достаточно просто: Код: plaintext 1. 2. 3. Т.е. перед открытием контейнера базы данных его надо явно закрыть. В этом случае, если данная база данных открыта другим пользователем, то получим сообщение об ошибке. Кстати, есть функция проверяющие статус открытия таблиц и контейнера базы данных в текущем сеансе: Код: plaintext 1. 2. 3. Т.е. вообще-то, надо бы писать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. _иван_ команд SET DATABASE TO (namebasedan) open database.... НЕТ!!! А вот это очень зря. Надо, как минимум, сделать явное открытие контейнера базы данных в стартовой программе. Если в данный момент идет архивация (т.е. база данных открыта в EXCLUSIVE), то сразу при старте получаешь ошибку и выбрасываешь пользователя из проги - пусть ждет окончания архивации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 11:04:27 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
спасибо Владимир за подробный ответ... Но толи место, на котором я сижу пишеться с буквой "б", толи что... Вот смотрите Сделал такую процедуру для проверки автор LPARAMETERS tcnamebasedan IF !PARAMETERS()=1 MESSAGEBOX("Не передан параметр-название БД") RETURN ENDIF ************************************************************** LOCAL namebasewithrash,_Return namebasewithrash= tcnamebasedan+'.DBC' _Return=.f. * Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F. CLOSE DATABASE ALL ENDIF * Если база данных НЕ открыта, то пытаюсь ее открыть в режиме EXCLUSIVE IF DBUSED(tcnamebasedan)=.F. * Вот здесь ловим возможные ошибки открытия TRY OPEN DATABASE (tcnamebasedan) EXCLUSIVE VALIDATE _Return=.t. CATCH =MESSAGEBOX("Невозможно открыть файл базы данных: "+tcnamebasedan+CHR(13)+; "для эксклюзивного использования."+CHR(13)+CHR(10)+; "Файл заблокирован для администрирования."+CHR(13)+; " "+CHR(13)+; "Повторите попытку позже..." , 16, "Ошибка!!!", 20000) _Return=.f. FINALLY CLOSE DATABASE ALL ENDTRY ENDIF RETURN _Return Смотрю в отладчике, все закрывается как положено строки между TRY OPEN DATABASE (tcnamebasedan) EXCLUSIVE VALIDATE _Return=.t. CATCH выполняются, затем выполняется CLOSE DATABASE ALL Начинаю процедуру архивации, и идет затык на строке df=Fopen(xfile) If Not df>0 =Messagebox("Íåâîçìîæíî îòêðûòü ôàéë:"+Chr(13)+xfile,64,"Âíèìàíèå...") Return .f. Endif df-это как Вы понимаете какой-то файл БД У меня уже голова кипит от этого непонимания!!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 13:58:07 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Ты слишком торопишся. Дело в том, что команда CLOSE DATABASE может и не закрыть базу данных. В HELP по этому поводу сказано что база данных НЕ закроется, если активна форма, использующая эту базу данных, но в другой (Private) DataSession. Т.е., по большому счету, надо бы проверить факт закрытия базы данных Код: plaintext 1. 2. 3. 4. Но, лично я действую по другому. Я сначала закрываю все открытые формы, если это удалось, то пытаюсь переоткрыть контейнер базы данных в режиме EXCLUSIVE, если это удалось, то запускаю процедуру резервного копирования всх файлов DBF, CDX, FPT КРОМЕ контейнера базы данных. Затем переоткрываю контейнер базы данных в режиме SHARED и делаю резервную копию уже только контейнера базы данных (файлы DBC, DCT, DCX). Затем, если необходимо, архивирую эту резервную копию. Здесь "фокус" в том, что пока контейнер базы данных открыт в режиме EXCLUSIVE никто не сможет работать ни с одной таблицей, включенной в контейнер базы данных. Т.е. нет риска получить копию базы данных посередине процесса модификации. А вот сам контейнер базы данных (DBC) в процессе работы вообще не модифицируется, поэтому его копирование можно сделать прямо в процессе работы. Ну, и нет смысла указывать опцию VALIDATE при открытии базы данных. Это тебе ничего не даст. Точнее, конечно, это выдаст сообщение об ошибке, если структура базы данных повреждена, но корректного лечения не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 15:23:00 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Hi _иван_! 1) Если БД УЖЕ открыта, то повторный OPEN DATABASE ... (хоть EXCLUSIVE хоть без него) не даёт ошибки, но и ничего не делает. Это описано в хелпе к команде OPEN DATABASE. 2) Реальный режим открытия БД можно проверит по ISEXCLUSIVE("имя_базы", 2) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 16:11:41 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Спасибо Владимир, исчерпывающее прошу извинений за затраченное время. Вариант с Fopen(namebasewithrash,2) помоему пока рулит нормально(надо сдавать проект), единственное что мне не нравиться, это-ON ERROR Да и TRY...... тоже не нравиться. Ваще бы запретил в программах, а то расслабляет. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 16:15:41 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Да и TRY...... тоже не нравиться. Ваще бы запретил в программах, а то расслабляет лихо!!!! ну даешь!! сказать ничего не могу, слов не хватат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 16:42:42 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
alex11100Да и TRY...... тоже не нравиться. Ваще бы запретил в программах, а то расслабляет лихо!!!! ну даешь!! сказать ничего не могу, слов не хватат. А что мы какие нибудь Java програмеры чтоли??? Чтоб ошибки "глотать" Мы ваще серьезные вещи пишем- СУБД называются Ошибки обрабатывать нада. :-))))) да шютка, шютка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 17:01:59 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
а кто мешает try критичная команда lsuccess=.t. catch to oErr myerr(oErr) endtry if !lsuccess retu endif не понял нравится on erro ???? а чем try не нравится??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 17:12:24 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Уважаемый, _иван_ может вы чего недопоняли??? а кто Вам мешает в конструкции try..endtry обработать ошибку??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 17:14:45 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
alex11100Уважаемый, _иван_ может вы чего недопоняли??? а кто Вам мешает в конструкции try..endtry обработать ошибку??? Многоуважаемый alex11100 хепл по try я прочитал, ;) в отдличии от хелпа по OPEN DATABASE, просто поведение с открытием какое то не тривиальное-сначала шарово открывается, а потом на эксклюзивное открытие и может не открыться, и молча....., :-) Потому говорю в 3 раз, что шучу, шучу. Все нормально, я все понял, даже про объект oException знаю и использую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 17:24:14 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
так шутить не стоит да, и о том что не было сказано если Вы раз открыли БД дальше хоть переоткрывайтесь (на самом деле и ничего не происходит) даже метод dbc_OpenData не отрабатывает есть еще способ если Вы наверняка хотите, чтобы ее никто не дергал можно в методах вложенной процедуры сделать вывешивание флага на время архивирования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 17:35:51 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Hi Владимир! > Я бы сказал, что это глюк Это не глюк, а исторически сложившееся и описанное в хелпе поведение. Отличие от USE тут в том, что БД не открывается в какой-то определённой рабочей области или даже DataSession, а открывается "глобально" - для всего приложения. И потому делать "автоматически" CLOSE DATABASES при попытке "переоткрытия" нельзя. Уже хотя-бы потому что могут быть открыты таблицы/представления принадлежащие этой БД... 2 _иван_ Ну ты блин нетерпеливый - это значится вместо заслуженного отдыха в выходные все срочно должны решать твою проблему :) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2005, 18:41:43 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi Владимир! > Я бы сказал, что это глюк Это не глюк, а исторически сложившееся и описанное в хелпе поведение. К сожалению, в HELP описание этого поведения попало только в версии VFP9. В ранних версиях ничего подобного описано не было. Отсюда и такой вывод. Igor Korolyov Отличие от USE тут в том, что БД не открывается в какой-то определённой рабочей области или даже DataSession, а открывается "глобально" - для всего приложения. И потому делать "автоматически" CLOSE DATABASES при попытке "переоткрытия" нельзя. Уже хотя-бы потому что могут быть открыты таблицы/представления принадлежащие этой БД... Да. Согласен. Но вопрос-то ставился о некоторой служебной операции (архивировании), которая изначально предполагает, что все формы должны быть закрыты. Поэтому переоткрытие базы данных в данном конкретном случае вполне уместно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2005, 14:34:33 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
_иван_ Приветсвую еще раз, вопрос не так прост как казалось бы мне сначала. КАк я говорил сразу, используются приватные сессии, и используется форма для архивации. Юзер наоткрывал приватных форм а потом решил начать архивировать И никак я не могу отдифференцировать открыта ли БД шарово по сети или открыта в приватной сессии чотбы дать команду на "закройте все активные формы" или "БД используется в сети " а команда close database то закрывает ,то не закрывает БД (активные приватные сессии) И если активна форма-то "белые гриды" Вообщем я лично не вижу разрешения проблемы закрытия БД без закрытия форм(скажите что я не прав). дак и с закрытием форм проблемы: автор* Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F. *поищем в коллекции форм главную и эту FOR EACH loForm IN _vfp.Forms llForms=.f. IF loForm.Name#'MAINFORM' OR loForm#thisform &&AS TOP FORM и форма архивации llForms=.f. ELSE llForms=.t. ENDIF ENDFOR IF Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr(13)+ ; "Закрыть все окна и повторить попытку?",4+48+0,THISFORM.Caption)=1 AND llForms=.T. *Закроем формы, которые могут использовать приватные сессии и БД на локальной машине *сначала закроем модальные формы FOR EACH loForm IN _vfp.Forms IF loForm.Name#'mainform' OR loForm#thisform TRY *Бывает, что в колеекции не находит свойство WindowType IF loForm.WindowType=1 loForm.click() loForm.release() ENDIF CATCH FINALLY ENDTRY ENDIF ENDFOR FOR EACH loForm IN _vfp.Forms IF loForm.Name#'mainform' OR loForm#thisform loForm.click() loForm.release() ENDIF ENDFOR ELSE _Return=.f. RETURN _Return ENDIF ENDIF * Если база данных открыта, то пытаюсь ее закрыть IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F. CLOSE DATABASES ALL ENDIF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2005, 19:22:13 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
блин неоттуда скопироавл код, для проверки пользую такой, но он не работает :(( автор LOCAL namebasewithrash,_Return,lcOldError namebasewithrash= tcnamebasedan+'.DBC' _Return=.f. * Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F. *поищем в коллекции форм главную и эту LOCAL lnI llFormsOn=.F. FOR lnI=1 TO _VFP.Forms.Count IF !UPPER(_VFP.Forms(lnI).Name)=="MAINFORM" OR !UPPER(_VFP.Forms(lnI).Name)==UPPER(thisForm.Name); OR UPPER(_VFP.Forms(lnI).BaseClass)=="TOOLBAR" llFormsOn=.T. EXIT ENDIF ENDFOR IF Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr(13)+ ; "Закрыть все окна и повторить попытку?",4+48+0,THISFORM.Caption)=1 AND llFormsOn=.T. *Закроем формы, которые могут использовать приватные сессии и БД на локальной машине *сначала закроем модальные формы FOR EACH loForm IN _vfp.Forms TRY *Бывает, что в колеекции не находит свойство WindowType IF loForm.WindowType=1 loForm.click() loForm.release() ENDIF CATCH FINALLY ENDTRY ENDFOR FOR EACH loForm IN _vfp.Forms loForm.click() loForm.release() ENDFOR ELSE _Return=.f. RETURN _Return ENDIF ENDIF * Если база данных открыта, то пытаюсь ее закрыть IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F. CLOSE DATABASES ALL ENDIF ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2005, 19:53:48 |
|
||
|
Open DATABASE EXCL
|
|||
|---|---|---|---|
|
#18+
Hi _иван_! Естественно что смотреть надо ИМЕННО на наличие форм работающих с данной базой. Можно конечно поизвращаться, через ASESSIONS(laTemp) + цикл по всем сессиям и в каждой смотреть какие курсоры открыты. принадлежат они нашей базе или нет и т.п. А можно проще - попросить юзера (или самому, через код) закрыть все формы кроме этой служебной формы архивирования. P.S. Я вообще считаю что лучше подобные служебные действия вынести в отдельный exe, а не городить "страшные" пункты в основной проге. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2005, 01:10:06 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33367648&tid=1593111]: |
0ms |
get settings: |
10ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
311ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 665ms |

| 0 / 0 |
