Переключение на Главную Страницу Страницы: 1 [2] 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Блокировка таблиц драйвером FoxPro (число прочтений - 14029 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #15 - 12. Марта 2008 :: 11:32
Печать  
Uzhast писал(а) 12. Марта 2008 :: 11:14:
Скачал по этой ссылке. Версия 9.0.0.5815. Результат не изменился.


Огромное СПАСИБО!

Выявил важную особенность.
Скрипт должен быть выполнен до проведения второго пользователя - оптимально при начале работы системы.
Если он выполняется только во время проведения второго пользователя - Цитата:
CommandText::Execute(): File is in use by another user.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #16 - 12. Марта 2008 :: 11:39
Печать  
kiruha писал(а) 12. Марта 2008 :: 11:32:
Скрипт должен быть выполнен до проведения второго пользователя - оптимально при начале работы системы.

Сдается мне, что это эффект из-за того, что таблица не закрывается фоксом после выполнения запроса. Но ведь он же тогда кеширование некое производит - я уже натыкался на это. Поэтому, если пользоваться такой вещью, то, ИМХО, возможны проблемы. Нет уж, я таким рецептом пользоваться не рискну.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #17 - 12. Марта 2008 :: 11:51
Печать  
Что и требовалось доказать.

В первом сеансе запускаем SET EXCLUSIVE ON выполняем запрос к остаткам товаров. Запускаем второй сеанс и запускаем накладную на проведение с выдачей предупреждения.
В первом сеансе опять выполняем запрос к остаткам товаров - нормально.

Чуть-чуть меняем набор действий.
В первом сеансе запускаем SET EXCLUSIVE ON выполняем запрос к остаткам товаров.
СРАЗУ ПОСЛЕ ЭТОГО выполняем CLOSE TABLES ALL
Запускаем второй сеанс и запускаем накладную на проведение с выдачей предупреждения.
В первом сеансе опять выполняем запрос к остаткам товаров - получаем облом.

Значит, твой SET EXCLUSIVE основывается не на SET EXCLUSIVE, а на незакрытых файлах базы. Неее, мне такая фенечка с возможностью выдачи устаревших закешированных данных совсем не нужна Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #18 - 12. Марта 2008 :: 11:55
Печать  
Тьфу, блин. Выше "SET EXCLUSIVE ON" читать как "SET EXCLUSIVE OFF"
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #19 - 12. Марта 2008 :: 12:00
Печать  
Ну и до кучи: в наборе действий выше убираем SET EXCLUSIVE вообще. Если не делать CLOSE TABLES, то запрос во время проведения документа в другом экземпляре сделать можно. Если добавить CLOSE TABLES, то будет опять облом. Наличие SET EXCLUSIVE вообще ни на что не влияет.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #20 - 12. Марта 2008 :: 12:37
Печать  
Предварительно прав Uzhast - дело в кэше.

Только кэшируются не данные, а структура открытых таблиц.
Если в сессии была открыта хотя бы одна запись таблицы(до блокировки другим пользователем) - после этого
без проблем можно открывать любые записи этой таблицы во время проведения другого пользователя...
Т.е. блокировка распостраняется только на чтение структуры
« Последняя редакция: 12. Марта 2008 :: 15:47 - kiruha »  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #21 - 12. Марта 2008 :: 16:19
Печать  
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?

Ну вот, если подумать получается несколько иная картина Подмигивание
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #22 - 13. Марта 2008 :: 03:35
Печать  
Nick писал(а) 12. Марта 2008 :: 16:19:
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?

Ну вот, если подумать получается несколько иная картина Подмигивание


Да нет - все верно. SET EXCLUSIVE OFF делает возможным многопользовательский режим
работы - Фокспро не блокирует при запросах других пользователей.
Кстати эта опция как правило устанавливается во время соединения по умолчанию.

Но есть еще 2 проблема - выполнения запросов во время проведения документов 1С.
Дело в том, что эта опция естественно не распостраняется на не ФоксПро системы.
К счастью 1С блокирует только чтение структуры файла.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #23 - 13. Марта 2008 :: 03:37
Печать  
Цитата:
Но есть еще 2 проблема - выполнения запросов во время проведения документов 1С.
Дело в том, что эта опция естественно не распостраняется на не ФоксПро системы.
К счастью 1С блокирует только чтение структуры файла.

т.е. патч Uzhast решает именно эту проблему?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #24 - 13. Марта 2008 :: 03:42
Печать  
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.
В процедуре ПриНачалеРаботыСистемы() Вызываем ИнициализацияТаблицФокспро()
- аналог открытия файлов 1С во время входа в программу
Код
Выбрать все
Процедура ИнициализацияТаблицФокспро()
	глОлеДБ = СоздатьОбъект("OLEDBData");
	Рез=глОлеДБ.Соединение("
	|Provider=VFPOLEDB.1;
	//	|Deleted=Yes;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=" + КаталогИБ() + ";
	|Mode=ReadWrite;
	|Extended Properties="""";
	|User ID="""";
	|Password="""";
	|Mask Password=False;
	|Collating Sequence=MACHINE;
	|DSN=""""");
	//  Так как стоит Exclusive = No скрипт  SET EXCLUSIVE OFF не нужен
	локОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	локОлеДБКоманда.Выполнить("EXECSCRIPT('SET ANSI OFF')");
	// Устанавливаем время ожидания захвата таблиц , если во время выполнения запроса кто то проводит документы
	// Очень полезная функция - аналогична времени ожидания в 1С
	локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
// Убираем буфепизацию, чтобы данные возвращаемые запросам всегда были актуальны
	 локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
	ВремяНачалоЗапроса=_GetPerformanceCounter();
	// Откроем таблицы Регистра итогов. Для минимального времени используем основной индекс
	Для ИИ=1 По Метаданные.Регистр() Цикл
		МетаданныеРегистр=Метаданные.Регистр(ИИ);
		ИдентификаторРегистра=МетаданныеРегистр.Идентификатор;
		СтрокаПеременныхПоля=" DTOS(РегОстатков.period) ";
		Для ЛЛ=1 По МетаданныеРегистр.Измерение() Цикл
			ИзмерениеРегистра=МетаданныеРегистр.Измерение(ЛЛ);
			д,ИзмерениеРегистра.Длина,ИзмерениеРегистра.Точность,"РегОстатков");
		КонецЦикла;
		текстЗапроса="
		| SELECT
		|
		|РегОстатков.period
		|
		|FROM $РегистрИтоги."+ИдентификаторРегистра+" as РегОстатков
		|WHERE "+СтрокаПеременныхПоля+"='12345678'
		|";
		локОлеДБКоманда.Выполнить(текстЗапроса);
		текстЗапроса="
		| SELECT
		|
		|РегОстатков.iddoc
		|
		|FROM $Регистр."+ИдентификаторРегистра+" as РегОстатков
		|WHERE
		|";
		локОлеДБКоманда.Выполнить(текстЗапроса);


	КонецЦикла;
	//Таблица констант
	текстЗапроса="
	| SELECT
	|
	|Константа.docid
	|
	|FROM 1SCONST as Константа
	|WHERE Константа.docid+STR(Константа.actno,6)+STR(Константа.partno,3)='123456789'
	|";
	локОлеДБКоманда.Выполнить(текстЗапроса);
	// Таблица подчиненных
	текстЗапроса="
	| SELECT
	|
	|Подчиненные.childid
	|
	|FROM 1SCRDOC as Подчиненные
	|WHERE Подчиненные.childid+Подчиненные.mdid+Подчиненные.parentval='123456789'
	|";
	локОлеДБКоманда.Выполнить(текстЗапроса);

	текстЗапроса="
	| SELECT
	|
	|Жур.iddoc
	|
	|FROM  1SJOURN  as жур
	|WHERE Жур.iddoc='123456789'
	|";
	локОлеДБКоманда.Выполнить(текстЗапроса);
/// Здесь можно открыть еще таблицы бухгалтерии - если кому нужно

	ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 0 SECONDS')");
	//Сообщить("Запрос длился "+(ВремяЗапроса/1000)+"с");

КонецПроцедуры 


где
Код
Выбрать все
Функция Таблицы)
	5884+sp5885+sp5886
	ИмяПоляНач="$"+ПсевдонимТаблицы+"."+ИмяПоля;
	Если Тип="Справочник" Тогда
		ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Документ"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Перечисление"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Строка"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Неопределенный"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Дата"  Тогда
	   ПеременнаяПоля="DTOS("+ИмяПоляНач+")";
	ИначеЕсли  Тип="Число"  Тогда
	   ПеременнаяПоля="STR("+ИмяПоляНач+","+Строка(Длина+1)+","+Строка(Точность)+")";

	КонецЕсли;
	Возврат ПеременнаяПоля;
КонецФункции    



Инициализация занимает 0.05 сек
Все. Можно пользоваться любыми запросами созданными на основании глОлеДБ
« Последняя редакция: 13. Марта 2008 :: 22:29 - kiruha »  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #25 - 13. Марта 2008 :: 03:44
Печать  
Цитата:
Да нет - все верно. SET EXCLUSIVE OFF делает возможным многопользовательский режим

Вообще говоря этой опции сто лет в обед, я думал что все о ней знают. Не знаю как в более ранних версиях но в VFP 5 она уже была. Правда тогда ещё провайдера небыло Улыбка

Вот на всякий случай перечень настроек среды, правда это относится к самому FoxPro, возможно к провайдеру применимы не все
  

SET.zip ( 25 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #26 - 13. Марта 2008 :: 04:05
Печать  
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.

Если тебе нравится ставить эксперименты на собственной заднице - ради бога. Никто не запрещает (может, ты удовольствие от ощущений получаешь). Но не надо преподносить ЭТО как решение проблемы блокировок. Потому что из-за тебя кто-то может здорово попасть.

Я считаю, что для каждого логического юнита выборки данных нужно делать передподключение к БД, иначе есть риск получения устаревших данных. Юнитом считаю, например, выборку данных при проведении документа или процедуру формирования отчета.

Я уже писал, как наталкивался на проблему кеширования. Проводим один документ, делаем запрос. В этом же сеансе 1С проводим еще документ. Делаем второй, точно такой же, запрос. Получаем старые данные. Если перед выполнением второго запроса вставить переподключение - все работает. Повторяемость 100%. Однако, когда пытался выделить минимальный код, демонстрирующий проблему, то не получилось. Тем не менее, считаю, что проблема кеширования есть - просто достаточно редко проявляется.

В общем, кто как хочет. Я предупредил - чур, в случае проблем с задницей - претензии мне не предъявлять Улыбка Впрочем, вы знаете КОМУ их нужно будет предъявлять в случае использования предложенного здесь решения Улыбка
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #27 - 13. Марта 2008 :: 04:17
Печать  
Uzhast писал(а) 13. Марта 2008 :: 04:05:
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.

Если тебе нравится ставить эксперименты на собственной заднице - ради бога. Никто не запрещает (может, ты удовольствие от ощущений получаешь). Но не надо преподносить ЭТО как решение проблемы блокировок. Потому что из-за тебя кто-то может здорово попасть.

Я считаю, что для каждого логического юнита выборки данных нужно делать передподключение к БД, иначе есть риск получения устаревших данных. Юнитом считаю, например, выборку данных при проведении документа или процедуру формирования отчета.

Я уже писал, как наталкивался на проблему кеширования. Проводим один документ, делаем запрос. В этом же сеансе 1С проводим еще документ. Делаем второй, точно такой же, запрос. Получаем старые данные. Если перед выполнением второго запроса вставить переподключение - все работает. Повторяемость 100%. Однако, когда пытался выделить минимальный код, демонстрирующий проблему, то не получилось. Тем не менее, считаю, что проблема кеширования есть - просто достаточно редко проявляется.

В общем, кто как хочет. Я предупредил - чур, в случае проблем с задницей - претензии мне не предъявлять Улыбка Впрочем, вы знаете КОМУ их нужно будет предъявлять в случае использования предложенного здесь решения Улыбка


Я сомневаюсь что и твой вариант полностью решает проблему получения достоверных данных. Хотя он безусловно уменьшает такую вероятность
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #28 - 13. Марта 2008 :: 04:20
Печать  
Nick писал(а) 13. Марта 2008 :: 04:17:
Я сомневаюсь что и твой вариант полностью решает проблему получения достоверных данных. Хотя он безусловно уменьшает такую вероятность

Совершенно согласен. Мой вариант - тоже фигня Улыбка ИМХО, немного менее страшная, но тем не менее Улыбка В общем, на СКЛ переходить надо, ничего не попишешь.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #29 - 13. Марта 2008 :: 04:35
Печать  
Uzhast писал(а) 13. Марта 2008 :: 04:05:
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.

Если тебе нравится ставить эксперименты на собственной заднице - ради бога. Никто не запрещает (может, ты удовольствие от ощущений получаешь). Но не надо преподносить ЭТО как решение проблемы блокировок. Потому что из-за тебя кто-то может здорово попасть.


Где ты увидел хоть одну нестандартную команду в процедуре инициализации? Ужас
Там проводится серия совершенно стандартных запросов.

P.S> Считать использование родного драйвера вместо пропатченного экспирементом
над собственной задницей - это сильно Улыбка
Все команды входят в официальную документацию.
P.S> Естественно я включу функционал в свою базу.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 
ОтправитьПечать