Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Фильтр по подстроке по нескольким колонкам индексированной таблицы (число прочтений - 4068 )
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Фильтр по подстроке по нескольким колонкам индексированной таблицы
12. Сентября 2011 :: 14:33
Печать  
Пытаюсь перевести конфигурацию на использование Индексировнных таблиц. Попутно возникло желание расширить функционал Улыбка Суть задумки следующая: имеется таблица с перечнем товаров (грубо - КодТовара, Товар, ШтрихКод, Цена, Количество). Я её использую в качестве поставщика данных для Табличного поля (в форме подбора). Хочу добавить в форму поле для ввода строки, чтобы при вводе в неё текста основная таблица фильтровалась по заданной подстроке, причем по нескольким полям одновременно (Товар, штрихкод, цена). т.е. можно ввести любую часть названия товара, либо часть штрихкода, либо цену и в списке остались бы только строки, в которых есть эта подстрока в любой из колонок. В перечне методов Индексированной таблицы "приглянулся" метод УстановитьФильтр, но в параметрах при добавлении индекса фигурируют поля целиком, без возможности фильтрации по подстроке.
Второй пришедший в голову вариант - добавление дополнительного поля - флага удовлетворения строки условию, при вводе текста перебирать всю таблицу, проверять условие и устанавливать этот флаг и уже по нему делать фильтр. Но это выглядит как-то некрасиво и громоздко. Может у кого-то есть мысли или опыт, как это сделать лучше?
p.s. Предложения отказаться от индексированной таблицы могу рассмотреть, т.к. важен больше результат, чем способ реализации. Данные изначально загружаются из внешнего dbf файла с максимальным сохранением структуры (за исключением переименованных имен полей, но это по большому счету не критично).
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #1 - 13. Сентября 2011 :: 01:20
Печать  
А кто мешает при вводе подбирать сразу по трем индексам? Вопрос лишь в том, как ты будешь выбирать, который ближе подходит, если вариант найдется сразу в нескольких?
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #2 - 13. Сентября 2011 :: 03:16
Печать  
Задача - максимально сузить количество вариантов. Когда их останется с десяток, можно и курсором нужный выделить и нажать ввод. А вот насчет "сразу по трём индексам" поподробнее, пожалуйста. Как это реализовать?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #3 - 13. Сентября 2011 :: 03:43
Печать  
Сложение выборок по разным индексам.
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #4 - 13. Сентября 2011 :: 07:06
Печать  
Ключевое слово в задумке -"ПОДСТРОКА". Т.е. фильтр должен быть по вхождению. Насколько я понимаю (и это описано в документации), в качестве фильтра можно указать только точное значение. [Если индекс построен по одной колонке, то в качестве ключей можно использовать значение колонки. Если же индекс по нескольким колонкам, то ключ должен быть СписокЗначений, содержащий значения ключевых колонок, заданных в методе ДобавитьИндекс().]

Хочу ошибаться, докажите ошибочность моего мнения Подмигивание
Для проверки использовался такой код (пока по одной колонке)
Код
Выбрать все
ТЗ=глТЗНомПодбор.Копия();

Если ВариантФильтраПоПодстроке=1 Тогда
	ТЗ.ДобавитьИндекс("индТовар","Товар");//Для фильтра по товарам
	//ТЗ.ДобавитьИндекс("индШтрихКод","ШтрихКод");//Для фильтра по штрих-коду
	//ТЗ.ДобавитьИндекс("индЦена","Цена");//Для фильтра по цене
	ТЗ.УстановитьФильтр(ВыбПодстрока,ВыбПодстрока,"индТовар");
	ТЗ.Выгрузить(ТЗТовары,"индТовар");

ИначеЕсли ВариантФильтраПоПодстроке=2 Тогда
	ТЗ.НоваяКолонка("флВхождение");
	ТЗ.ДобавитьИндекс("индфлВхождение","флВхождение");//Для фильтра по вхождению
	Подстрока=СокрЛП(Нрег(ВыбПодстрока));
	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку()=1 Цикл
		Если Найти(нрег(ТЗ.Товар),Подстрока)=0 Тогда
			Продолжить;
		КонецЕсли;
		ТЗ.флВхождение=1;
	КонецЦикла;
	ТЗ.УстановитьФильтр(1,1,"индфлВхождение");
	ТЗ.Выгрузить(ТЗТовары,"индфлВхождение");
КонецЕсли;
ТЗТовары.НоваяКолонка("Количество");
ТЗТовары.НоваяКолонка("Сумма");
ТЗТовары.ДобавитьИндекс("индКодЕдиницы","КодЕдиницы");//Для поиска по коду единицы
ТЗТовары.ДобавитьИндекс("индКоличество","Количество");//Для выгрузки количества из документа
);
ТП.ОбновитьСтроки();
 



Вариант 1 не работает, вариант 2 - работает.
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #5 - 13. Сентября 2011 :: 07:45
Печать  
Доработанный 2 вариант для 3 колонок и поис вхождения каждого слова. Уже чувствуется подтормаживание. Так что для боевого применения - не айс (планировалось вообще повесить этот фильтр на перехватчик клавиатуры).
Код
Выбрать все
ТЗ=глТЗНомПодбор.Копия();

Если ВариантФильтраПоПодстроке=1 Тогда
	ТЗ.ДобавитьИндекс("индТовар","Товар");//Для фильтра по товарам
	//ТЗ.ДобавитьИндекс("индШтрихКод","ШтрихКод");//Для фильтра по штрих-коду
	//ТЗ.ДобавитьИндекс("индЦена","Цена");//Для фильтра по цене
	ТЗ.УстановитьФильтр(Подстрока,ВыбПодстрока,"индТовар");
	ТЗ.Выгрузить(ТЗТовары,"индТовар");

ИначеЕсли ВариантФильтраПоПодстроке=2 Тогда
	ТЗ.НоваяКолонка("флВхождение");
	ТЗ.ДобавитьИндекс("индфлВхождение","флВхождение");//Для фильтра по вхождению
	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку()=1 Цикл
		Для й=1 по КоличествоПодстрок Цикл
			Подстрока=СЗПодстроки.ПолучитьЗначение(й);
			флВхождение=1;
			Если (Найти(нрег(ТЗ.Товар),Подстрока)>0) или
			(Найти(нрег(ТЗ.ШтрихКод),Подстрока)>0) или
			(Найти(нрег(ТЗ.Цена),Подстрока)>0) Тогда
				//В одном из полей эта подстрока есть
			Иначе
				//Нет вхождения этой подстроки
				флВхождение=0;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		ТЗ.флВхождение=флВхождение;
	КонецЦикла;
	ТЗ.УстановитьФильтр(1,1,"индфлВхождение");
	ТЗ.Выгрузить(ТЗТовары,"индфлВхождение");
 



Надеюсь, кто-то подскажет, как заставить работать 1 вариант  Класс
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #6 - 13. Сентября 2011 :: 08:29
Печать  
С ИТ врядли такое получится. По-моему, самый простой вариант - это временная таблица и sql-запрос LIKE. А далее все зависит от БД. Если у тебя файловая 1С, то можно в качестве БД использовать 1sqlite.
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #7 - 13. Сентября 2011 :: 08:37
Печать  
Собственно и вопрос: к какому объекту можно применить запрос с "like..."? Хотелось бы к Индесированной таблице, но если никак, буду рыть дальше.
Теперь встал вопрос как подключить перехват клавиатуры. Во всех примерах нужно подключать FormEx.dll А так как в 3 версии (icpp) модуль формэкса встроен, как его инициализировать?
Подскажите рабочую конструкцию перехвата клавиатуры.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #8 - 13. Сентября 2011 :: 10:21
Печать  
svrozhkov писал(а) 13. Сентября 2011 :: 08:37:
А так как в 3 версии (icpp) модуль формэкса встроен, как его инициализировать?


Никак. Ибо формекс в icpp вырезан сто лет в обед и это отдельная ВК.
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #9 - 13. Сентября 2011 :: 10:49
Печать  
Видимо проявляется "вредное влияние аналогий". В документации написано, что начиная с версии 2.** (не помню точно) формэкс был встроен (если не сам, то функционал). А так как версия 3 больше, чем 2, эта мысль в голове осталась.
Спасибо за разъяснения.
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #10 - 13. Сентября 2011 :: 11:53
Печать  
Новый вопрос Подмигивание
Приделал перехват клавиатуры. Как сделать, чтобы при нажатии на клавиши курсора "вверх" и "вниз" перемещался курсор в табличном поле. Первый вариант - в поставщике данных изменить номер строки (ТЗТовары.НомерСтроки=НСтр-1;) не проходит. Второй вариант - изменять в самом табличном поле (ТП.ТекущаяСтрока=ТП.ТекущаяСтрока-1;) работает, но прыгает без учета сортировки, видимо в порядке добавления в ИТЗ при создании.
Кто-то может помочь?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #11 - 13. Сентября 2011 :: 11:56
Печать  
Э.. а чего, без твоего "перехвата" ужо курсор в ТП не бегает у тебя ?
Улыбка
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #12 - 13. Сентября 2011 :: 12:44
Печать  
Смех
Действительно...
Как говориться "... Одну ягодку беру, на вторую смотрю, третью примечаю, а четвертая - мерещится"
Изначально фильтр вводился в текстовое поле на форме и нужно было с него фокус перемещать на ТП. Вот и задумал перехватывать клавиатуру, фокус с нее не убирать, а в ТП курсор двигить программно. Но потом от текстового поля отказался, а "осадок остался" Улыбка
Так что действительно, можно двигать штатными средствами, без перехвата. Разве что спортивный интерес остался - как-то не хочется бросать недоделанное. Так есть какие-то мысли по поводу программного управления курсором?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #13 - 13. Сентября 2011 :: 12:55
Печать  
  
Наверх
 
IP записан
 
svrozhkov
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 13
Зарегистрирован: 01. Октября 2009
Re: Фильтр по подстроке по нескольким колонкам индексированной таблицы
Ответ #14 - 13. Сентября 2011 :: 13:21
Печать  
Спасибо за ссылку, но с этим проблемы. см ответ #10. Нужно как-то приделать индекс, чтобы порядок в ТП соответствовал порядку в поставщике данных.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать