Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Прямые запросы к DBF (число прочтений - 5731 )
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Прямые запросы к DBF
21. Декабря 2007 :: 07:15
Печать  
Много читал... Много думал... И все же решил спросить.
1. Целесообразно ли использование прямых запросов к базам 1С в формате DBF?
2. Использует ли кто их интенсивно в "боевых" базах?
3. Есть ли положительный результат в их использовании?
4. Если да, то на каких участках?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прямые запросы к DBF
Ответ #1 - 21. Декабря 2007 :: 07:35
Печать  
Kondarat писал(а) 21. Декабря 2007 :: 07:15:
Много читал... Много думал... И все же решил спросить.
1. Целесообразно ли использование прямых запросов к базам 1С в формате DBF?
2. Использует ли кто их интенсивно в "боевых" базах?
3. Есть ли положительный результат в их использовании?
4. Если да, то на каких участках?

1. да
2. да
3. да
4. А что такое "участок"? У меня используются в отчетах и обработках, которые раньше были очень тормозными.
Ты б поконкретнее спрасил где и как ты хочешь их использовать.
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Прямые запросы к DBF
Ответ #2 - 21. Декабря 2007 :: 07:59
Печать  
Что касается участков, так это те места в БД которые могут быть оптимизированы по скорости с помощью прямых запросов.
Например, в одной из конфигураций есть множественный фильтр в форме списка справочника(на форме расположены строковые реквизиты в которых задаются критерии поиска, их несколько), кот. работает так: перебирает все элементы справочника(Спр.выбратьЭлементы()),  ищет вхождение строки в соотв. реквизит (Найти()), собирает из элементов СписокЗначений и затем ИспользоватьСписокЭлементов().
Так вот. Будет ли быстрее те же операции выполнить с помощью запроса?, т. е
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса)
ТЗ.Выгрузить(спФильтр,,,"Элемент")      
ИспользоватьСписокЭлементов(спФильтр)




  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Прямые запросы к DBF
Ответ #3 - 21. Декабря 2007 :: 08:20
Печать  
Kondarat писал(а) 21. Декабря 2007 :: 07:59:
Что касается участков, так это те места в БД которые могут быть оптимизированы по скорости с помощью прямых запросов.
Например, в одной из конфигураций есть множественный фильтр в форме списка справочника(на форме расположены строковые реквизиты в которых задаются критерии поиска, их несколько), кот. работает так: перебирает все элементы справочника(Спр.выбратьЭлементы()),  ищет вхождение строки в соотв. реквизит (Найти()), собирает из элементов СписокЗначений и затем ИспользоватьСписокЭлементов().
Так вот. Будет ли быстрее те же операции выполнить с помощью запроса?, т. е
ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса)
ТЗ.Выгрузить(спФильтр,,,"Элемент")      
ИспользоватьСписокЭлементов(спФильтр)

можно улучшить твой код
Код
Выбрать все
СписокФильтр = СоздатьОбъект("СписокЗНачений");
Запрос.ВыполнитьИнструкцию(ТекстЗапроса,СписокФильтр ,);
ИспользоватьСписокЭлементов(спФильтр); 


Выигрыш будет потому-что like в sql операторе
будет быстрее чем сравнение строк с помощью интерприратора 1с.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Прямые запросы к DBF
Ответ #4 - 21. Декабря 2007 :: 08:34
Печать  
А еще лучше использовать * и ?
предварительно распарсив строку поиска.
Правда до ? у мене еще руки не дошли а вот со * пожалуйста:
Код
Выбрать все
Функция ПарситьТекст()
	лТекст=Нрег(СокрЛП(фНаименование));
	Вхождений=СтрЧислоВхождений(лТекст,"*");
	Текст="";
	Если Вхождений=0 Тогда
		Текст=" and lower(s.descr) like '%"+лТекст+"%'";
	ИначеЕсли Вхождений=1 Тогда
		поз=Найти(лТекст,"*");
		Если поз=1 Тогда
			// отлавливаем все что кончается на указаный текст
			ТекстУсловия=Сред(СокрЛП(лТекст),поз+1);
			ДлинаУсловия=СтрДлина(ТекстУсловия);
			Текст=" and lower(RIGHT(LTRIM(RTRIM(s.descr)),"+ДлинаУсловия+"))='"+ТекстУсловия+"'";
		ИначеЕсли поз=СтрДлина(лТекст) Тогда
			// отлавливаем все что начинается с указаного текста
			ТекстУсловия=Лев(СокрЛП(лТекст),поз-1);
			ДлинаУсловия=СтрДлина(ТекстУсловия);
			Текст=" and lower(left(LTRIM(RTRIM(s.descr)),"+ДлинаУсловия+"))='"+ТекстУсловия+"'";
		Иначе
			// здесь ловим только то что начинется до * и заканчивается после нее с конца
			ТекстУсловияНачало=Лев(СокрЛП(лТекст),поз-1);
			ТекстУсловияКонец=Сред(СокрЛП(лТекст),поз+1);
			ДлинаУсловияНачало=СтрДлина(ТекстУсловияНачало);
			ДлинаУсловияКонец=СтрДлина(ТекстУсловияКонец);
			Текст=" and "'";
			Текст=Текст+" and '";
		КонецЕсли;
	Иначе
		// * можно использовать только 1 раз
		//
		Текст=" and lower(s.descr) like '%"+СтрЗаменить(лТекст,"*","")+"%'";
	КонецЕсли;
	Возврат Текст;
КонецФункции	// ПарситьТекст

 



Причем разница в выполнении между Like и left,right ощутимая.
Последние в несколько раз быстрее работают.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Прямые запросы к DBF
Ответ #5 - 21. Декабря 2007 :: 08:39
Печать  
Kondarat писал(а) 21. Декабря 2007 :: 07:15:
Много читал... Много думал... И все же решил спросить.

1. Целесообразно ли использование прямых запросов к базам 1С в формате DBF?

- Не только целесообразно, но необходимо

2. Использует ли кто их интенсивно в "боевых" базах?

- 12 месяцев

3. Есть ли положительный результат в их использовании?

- Выигрыш в скорости от 20 раз, исчезновение транзакционных блокировок, нечувствительность
к возрастанию объема базы и количеству пользователей (масштабируемость)

4. Если да, то на каких участках?

- Отчеты обязательно, Проведение и расчет регистров только при достаточной квалификации.
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Прямые запросы к DBF
Ответ #6 - 21. Декабря 2007 :: 08:56
Печать  
1. "Исчезновение транзакционных блокировок" - каким образом?
2. "Нечувствительность к возрастанию объема базы (а как быть с ограничением на размер файла DBF? или это фикция?) и количеству пользователей (масштабируемость) "


  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Прямые запросы к DBF
Ответ #7 - 21. Декабря 2007 :: 09:05
Печать  
Kondarat писал(а) 21. Декабря 2007 :: 08:56:
1. "Исчезновение транзакционных блокировок" - каким образом?
2. "Нечувствительность к возрастанию объема базы (а как быть с ограничением на размер файла DBF? или это фикция?) и количеству пользователей (масштабируемость) "

1.исчезновение блокировок за счет значительного уменьшения времени проведения документов
2. ну  размер dbf 2 гб на один файл никто не отменит. если ты приближаешься к этому
пределу то два способа ( в рамках 7.7. )либо режь базу либо переходи на sql.
  
Наверх
 
IP записан
 
Pilokarpios
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 25
Зарегистрирован: 21. Мая 2008
Re: Прямые запросы к DBF
Ответ #8 - 25. Мая 2008 :: 08:11
Печать  
Люди, перерыл уже блин пол интернета, как выбрать из справочника это понятно, но что касается Бух итогов, то я в тупике, подскажите плиз пример или ссылку SQL запроса в DBF базу чтобы получить остаток по счету в разрезе указанных субконто, пожалуйста!
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Прямые запросы к DBF
Ответ #9 - 25. Мая 2008 :: 08:32
Печать  
Pilokarpios писал(а) 25. Мая 2008 :: 08:11:
Люди, перерыл уже блин пол интернета, как выбрать из справочника это понятно, но что касается Бух итогов, то я в тупике, подскажите плиз пример или ссылку SQL запроса в DBF базу чтобы получить остаток по счету в разрезе указанных субконто, пожалуйста!


Запросы SQL  и для ДБФ если отвлечься от индексов не настолько сильно отличаются.
Попробуй переписать на ДБФ с учетом
Цитата:
в. Вместо поля DATE_TIME_IDDOC используется date в FoxPro
г. в ДБФ  - РегКассаНач.period = :ПредМесяц~~, в SQL - РегКассаНач.period = :ПредМесяц 
д. В Fox служебные слова нерегистрозависимы
е. Вместо CASE используется функция ICASE
ж. В Fox нет (NOLOCK) и GROUPING

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать