Документ, в нем создана табличная часть со списком элементов.
Как в запрос добавить все элементы из таблицы так чтобы каждый элемент был новым условием отбора и в результат попали только те данные которые содержат все элементы таблицы.
Пример:
Код
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГруппыФильтров.Группа КАК Группа,
|ИЗ
| РегистрСведений.ГруппыФильтров КАК ГруппыФильтров
|ГДЕ
| Группа = &ФильтрЗапроса
|";
Для Каждого ФильтрГрупп Из Группы Цикл
Запрос.УстановитьПараметр("ФильтрЗапроса", ФильтрГрупп.Группа);
КонецЦикла;
Группы табличная часть ...
В Установить параметр попадает последнее а как все добавить? чтоб еще и в запросе |Где туда поже все попадали.
Код
"|ГДЕ
| Группа В (&ФильтрЗапроса)"
ФильтрЗапроса должен быть массивом.
ЗЫ. В справке, кстати, написано
Как вариант можно сделать цикл по табличной части и в нем добавлять в запрос условие (так часто в типовой делается, но не для табличной части). Если правильно тебя понял, то где-то так, не тестил и могу ошибаться:
Код
Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ
| ГруппыФильтров.Группа КАК Группа,
|ИЗ
| РегистрСведений.ГруппыФильтров КАК ГруппыФильтров";
Если Док.Элементы.Количество >0 тогда
ТекстЗапроса = ТекстЗапроса+Символы.ПС+"| Где";
Для каждого СтрокаТаб из Док.Группы цикл
ТекстЗапроса = ТекстЗапроса+Символы.ПС+"| Группа = "+СтрокаТаб;
КонецЦикла;
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Исправлено: текст запроса подкорректировал:)
Хотя правильнее конечно сделать массивом... Одно условие по идее должно быстрее работать, да и некрасиво получается. Такой механизм хорощо использовать для динамического формирования выходных полей или сложных условий че-нить еще. Для простых условий есть массивы.
Есть такое ограничение в MSSQL, как не более 38 условий ГДЕ на одну таблицу
Venturion
1.7.2008, 10:43
Ладно с массивом разобрался
Код
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГруппыФильтров.Объект КАК Объект,
| ГруппыФильтров.Группа КАК Группа,
|ИЗ
| РегистрСведений.ГруппыФильтров КАК ГруппыФильтров
|ГДЕ
| Группа В (&ФильтрЗапроса)
|";
ФильтрМассив = Новый Массив;
Для Каждого ФильтрГрупп Из Группы Цикл
ФильтрМассив.Добавить(ФильтрГрупп.Группа);
КонецЦикла;
Запрос.УстановитьПараметр("ФильтрЗапроса", ФильтрМассив);
Результат = Запрос.Выполнить().Выбрать();
А как добавить условие чтоб отбирало те объекты, элементы массива которых есть у объекта
например
Объект 1, фильтр1
Объект 2, фильтр4
Объект 3, фильтр1
Объект 3, фильтр4
Задали в группы 2 элемента фильтра 1 и 4 и чтоб только Объект 3 попал в результат?
неа, наскоко помню табличная часть это таблица значений?.
кстати, а никто не пробовал задать больше 38 условий на таблицу? что на это скажет платформа? помнится говорили мне, что в ней есть оптимайзер, который переформировывает запрос, а потом разбивает его на подзапросы. Т.е. возможно все будет очень долго работать, но будет!
как простейший вариант сделать этот запрос вложенным, и забабахать в нем свертку с вычислением количества строк. а во внешнем оставить только те записи, у которых число строк получилось равным величине массива. Грубо, но первое, что пришло в голову. Наверняка можно более изящно сделать.
Если вы нарисуете, что хотите получить - будет проще.
А то я что-то потерял суть..
по моему у него есть регистр с множеством полей. и есть табличное поле, куда пользователь накидывает поля, которые обязательно должны присутствовать в отбираемых записях одновременно.
Т.е. запись включается в выборку только если в ней есть все поля из указанных в табличном поле. Если хоть одного поля нет, то запись отбрасывается.
Есть регистр сведений. Измерения Объект и Группа = Спр.Группы ресурс Фильтр = булево.
Есть в документе табл. часть Группы с реквизитом группа = Спр.Группы, в нее выбирают группы по которым нужно отобрать данные.
Например ввели в ТЧ Фильтр1 и Фильтр3 ... из регистра отобральсь те Объекты у которых есть и 1 и 3
Я не очень понял - зачем еще ресурс Фильтр?
А так - простой запрос, где выбираются все объекты и "Группа В(&МассивГрупп)"
по-моему как раз "В" выбирает если есть хоть одно вхождение, а надо чтобы выбирались только те, у кого найдены все вхождения.
Блин, вот теперь я понял, что нужно.
Нарисовал бы так структуру и понятно было сразу, как выглядит РС.
Измерения:
Объект
Группа
Ресурс:
Фильтр
---
Попробую порыться - где-то я делал такое....
Ну как поиск а то мне что то не приходит в голову как в запрос такое написать...
Упс.... :) Забыл про обещание :)
Сорри, постараюсь не забыть и к вечеру найти
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.