Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как сделать быстрый поиск части строки? (число прочтений - 7791 )
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #15 - 22. Мая 2008 :: 13:00
Печать  
Напиши 1С запрос примерно как предложил KMS, обрисуй задачу и попроси помощи в "Прямые запросы к БД" перевести на прямой запрос Подмигивание
  
Наверх
 
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #16 - 22. Мая 2008 :: 13:07
Печать  
PVR писал(а) 22. Мая 2008 :: 13:00:
Напиши 1С запрос примерно как предложил KMS, обрисуй задачу и попроси помощи в "Прямые запросы к БД" перевести на прямой запрос Подмигивание

Попробую лучше сам написать прямой запрос. Жаль что ни в ТЗ ни в ИТ нет поиска по подстроке. Хотя может быть с прямыми запросами этого и не нужно
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #17 - 22. Мая 2008 :: 13:18
Печать  
Цитата:
в ИТ нет поиска по подстроке.
Да, иногда жаль.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Как сделать быстрый поиск части строки?
Ответ #18 - 22. Мая 2008 :: 13:25
Печать  
Универсальный поиск в спр по подстроке
Код
Выбрать все
Процедура ПоискПоПодстрокеСПП(ВидСправочника,РеквизитПоиска)  

	Если РеквизитПоиска="Код" Тогда РеквизитПоиска2="Спр.Code" ;
		ТипРеквизита="Строка";
	ИначеЕсли РеквизитПоиска="Наименование" Тогда РеквизитПоиска2="Спр.Descr";
		ТипРеквизита="Строка";
	Иначе  
		МетСпр=Метаданные.Справочник(ВидСправочника);
		ТипРеквизита=МетСпр.Реквизит(РеквизитПоиска).Тип;
		Если (ТипРеквизита="Строка") Тогда
			РеквизитПоиска2="$Спр."+СокрЛП(РеквизитПоиска);
		ИначеЕсли (ТипРеквизита="Справочник") Тогда
			ВидРеквизита=МетСпр.Реквизит(РеквизитПоиска).Вид;
			РеквизитПоиска2="$Спр."+СокрЛП(РеквизитПоиска);
		Иначе Возврат;
		КонецЕсли;

	КонецЕсли;


	Если ТипРеквизита="Строка" Тогда
		ТекстЗапроса="
		|SELECT
		|Спр.ID as [Элемент $Справочник."+ВидСправочника+"]
		|FROM
		|	$Справочник."+ВидСправочника+" as Спр
		|WHERE
		|    Спр.IsFolder = 2 AND
		|    UPPER("+РеквизитПоиска2+") LIKE  '%' + :СтрПоиска + '%'";
	ИначеЕсли   (ТипРеквизита="Справочник") Тогда
		ТекстЗапроса="
		|SELECT
		|Спр.ID as [Элемент $Справочник."+ВидСправочника+"]
		|FROM
		|	$Справочник."+ВидСправочника+" as Спр
		|LEFT JOIN $Справочник."+ВидРеквизита+" as СпрРек  ON СпрРек.ID="+РеквизитПоиска2+"
		|WHERE
		|    Спр.IsFolder = 2 AND
		|    UPPER(СпрРек.Descr) LIKE  '%' + :СтрПоиска + '%'";

	КонецЕсли;

	ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	)));
	ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса); 



Для документов аналогично. Но попробуй сам.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #19 - 22. Мая 2008 :: 13:29
Печать  
kiruha писал(а) 22. Мая 2008 :: 13:25:
Универсальный поиск в спр по подстроке
Код
Выбрать все
Процедура ПоискПоПодстрокеСПП(ВидСправочника,РеквизитПоиска)  

	Если РеквизитПоиска="Код" Тогда РеквизитПоиска2="Спр.Code" ;
		ТипРеквизита="Строка";
	ИначеЕсли РеквизитПоиска="Наименование" Тогда РеквизитПоиска2="Спр.Descr";
		ТипРеквизита="Строка";
	Иначе  
		МетСпр=Метаданные.Справочник(ВидСправочника);
		ТипРеквизита=МетСпр.Реквизит(РеквизитПоиска).Тип;
		Если (ТипРеквизита="Строка") Тогда
			РеквизитПоиска2="$Спр."+СокрЛП(РеквизитПоиска);
		ИначеЕсли (ТипРеквизита="Справочник") Тогда
			ВидРеквизита=МетСпр.Реквизит(РеквизитПоиска).Вид;
			РеквизитПоиска2="$Спр."+СокрЛП(РеквизитПоиска);
		Иначе Возврат;
		КонецЕсли;

	КонецЕсли;


	Если ТипРеквизита="Строка" Тогда
		ТекстЗапроса="
		|SELECT
		|Спр.ID as [Элемент $Справочник."+ВидСправочника+"]
		|FROM
		|	$Справочник."+ВидСправочника+" as Спр
		|WHERE
		|    Спр.IsFolder = 2 AND
		|    UPPER("+РеквизитПоиска2+") LIKE  '%' + :СтрПоиска + '%'";
	ИначеЕсли   (ТипРеквизита="Справочник") Тогда
		ТекстЗапроса="
		|SELECT
		|Спр.ID as [Элемент $Справочник."+ВидСправочника+"]
		|FROM
		|	$Справочник."+ВидСправочника+" as Спр
		|LEFT JOIN $Справочник."+ВидРеквизита+" as СпрРек  ON СпрРек.ID="+РеквизитПоиска2+"
		|WHERE
		|    Спр.IsFolder = 2 AND
		|    UPPER(СпрРек.Descr) LIKE  '%' + :СтрПоиска + '%'";

	КонецЕсли;

	ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	)));
	ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса); 




Предлагаю в ФАК скопировать Улыбка чтобы народ велосипеды не изобретал
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #20 - 22. Мая 2008 :: 13:36
Печать  
Ну я же помню что я видел что то на эту тему)). Попробуем. Спасибо
  
Наверх
 
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #21 - 22. Мая 2008 :: 14:03
Печать  
глОлеДБ.Connect("Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" +КаталогИБ() + ";Mode=ReadWrite;Mask Password=False;Collating Sequence=MACHINE;");
{D:\БАЗЫ1С\ИЗМЕНЕННЫЕОБРАБОТКИ\ТЕСТ БЫСТРЫЙ ПОИСК В РЕКВИЗИТАХ.ERT(57)}: FAILED! IDataInitialize::GetDataSource(): Класс не зарегистрирован

А где его взять то VFPOLEDB.1
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #22 - 22. Мая 2008 :: 14:56
Печать  
Цитата:
А где его взять то VFPOLEDB.1

Сделай поиск по VFPOLEDB, много интересного найдешь  Подмигивание
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #23 - 22. Мая 2008 :: 15:04
Печать  
А по поводу ун. поиска, есть у меня обработка для поиска по нескольким подстрокам, удобно добавлять в базы, кнопочку скопировал и всё, но она на 1С.
Добавлю выборку прямым запросом, выложу в Репозиторий  Подмигивание
  
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #24 - 22. Мая 2008 :: 21:32
Печать  
Уже выложил в Репозиторий "Ун. обр. поиска и отбора по нескольким подстрокам"
http://www.1cpp.ru/forum/YaBB.pl?num=1211491690
  
Наверх
 
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: Как сделать быстрый поиск части строки?
Ответ #25 - 23. Мая 2008 :: 12:40
Печать  
PVR писал(а) 22. Мая 2008 :: 21:32:
Уже выложил в Репозиторий "Ун. обр. поиска и отбора по нескольким подстрокам"
http://www.1cpp.ru/forum/YaBB.pl?num=1211491690

Спасибо попробую. Попробовал запрос на SQLite Orefkova. 90 мс получилось на 1 запрос. а таких надо 3000. Может если по дате ограничить быстрее будет. Посмотрим
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать