Помощь - Поиск - Пользователи - Календарь
Полная версия: Как добавить параметры запроса?
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 8.x" > (8.х) Конфигурирование на платформе "1С:Предприятие 8.x"
Venturion
Документ, в нем создана табличная часть со списком элементов.

Как в запрос добавить все элементы из таблицы так чтобы каждый элемент был новым условием отбора и в результат попали только те данные которые содержат все элементы таблицы.


Пример:

Код
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГруппыФильтров.Группа КАК Группа,
|ИЗ
| РегистрСведений.ГруппыФильтров КАК ГруппыФильтров
|ГДЕ
| Группа = &ФильтрЗапроса
|";

Для Каждого ФильтрГрупп Из Группы Цикл
Запрос.УстановитьПараметр("ФильтрЗапроса", ФильтрГрупп.Группа);
КонецЦикла;


Группы табличная часть ...
В Установить параметр попадает последнее а как все добавить? чтоб еще и в запросе |Где туда поже все попадали.
BabySG
Код
"|ГДЕ
| Группа В (&ФильтрЗапроса)"


ФильтрЗапроса должен быть массивом.


ЗЫ. В справке, кстати, написано
tugrik
Как вариант можно сделать цикл по табличной части и в нем добавлять в запрос условие (так часто в типовой делается, но не для табличной части). Если правильно тебя понял, то где-то так, не тестил и могу ошибаться:

Код
Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ
| ГруппыФильтров.Группа КАК Группа,
|ИЗ
| РегистрСведений.ГруппыФильтров КАК ГруппыФильтров";

Если Док.Элементы.Количество >0 тогда
ТекстЗапроса = ТекстЗапроса+Символы.ПС+"| Где";
Для каждого СтрокаТаб из Док.Группы цикл
ТекстЗапроса = ТекстЗапроса+Символы.ПС+"| Группа = "+СтрокаТаб;
КонецЦикла;
КонецЕсли;

Запрос.Текст = ТекстЗапроса;




Исправлено: текст запроса подкорректировал:)

Хотя правильнее конечно сделать массивом... Одно условие по идее должно быстрее работать, да и некрасиво получается. Такой механизм хорощо использовать для динамического формирования выходных полей или сложных условий че-нить еще. Для простых условий есть массивы.
BabySG
Есть такое ограничение в MSSQL, как не более 38 условий ГДЕ на одну таблицу
Venturion
Ладно с массивом разобрался

Код
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ГруппыФильтров.Объект КАК Объект,
| ГруппыФильтров.Группа КАК Группа,
|ИЗ
| РегистрСведений.ГруппыФильтров КАК ГруппыФильтров
|ГДЕ
| Группа В (&ФильтрЗапроса)
|";

ФильтрМассив = Новый Массив;
Для Каждого ФильтрГрупп Из Группы Цикл
ФильтрМассив.Добавить(ФильтрГрупп.Группа);
КонецЦикла;

Запрос.УстановитьПараметр("ФильтрЗапроса", ФильтрМассив);

Результат = Запрос.Выполнить().Выбрать();


А как добавить условие чтоб отбирало те объекты, элементы массива которых есть у объекта

например

Объект 1, фильтр1
Объект 2, фильтр4
Объект 3, фильтр1
Объект 3, фильтр4

Задали в группы 2 элемента фильтра 1 и 4 и чтоб только Объект 3 попал в результат?
tugrik
неа, наскоко помню табличная часть это таблица значений?.

кстати, а никто не пробовал задать больше 38 условий на таблицу? что на это скажет платформа? помнится говорили мне, что в ней есть оптимайзер, который переформировывает запрос, а потом разбивает его на подзапросы. Т.е. возможно все будет очень долго работать, но будет!
tugrik
как простейший вариант сделать этот запрос вложенным, и забабахать в нем свертку с вычислением количества строк. а во внешнем оставить только те записи, у которых число строк получилось равным величине массива. Грубо, но первое, что пришло в голову. Наверняка можно более изящно сделать.
BabySG
Если вы нарисуете, что хотите получить - будет проще.
А то я что-то потерял суть..
tugrik
по моему у него есть регистр с множеством полей. и есть табличное поле, куда пользователь накидывает поля, которые обязательно должны присутствовать в отбираемых записях одновременно.

Т.е. запись включается в выборку только если в ней есть все поля из указанных в табличном поле. Если хоть одного поля нет, то запись отбрасывается.
Venturion
Есть регистр сведений. Измерения Объект и Группа = Спр.Группы ресурс Фильтр = булево.

Есть в документе табл. часть Группы с реквизитом группа = Спр.Группы, в нее выбирают группы по которым нужно отобрать данные.

Например ввели в ТЧ Фильтр1 и Фильтр3 ... из регистра отобральсь те Объекты у которых есть и 1 и 3
BabySG
Я не очень понял - зачем еще ресурс Фильтр?

А так - простой запрос, где выбираются все объекты и "Группа В(&МассивГрупп)"
tugrik
по-моему как раз "В" выбирает если есть хоть одно вхождение, а надо чтобы выбирались только те, у кого найдены все вхождения.
BabySG
Блин, вот теперь я понял, что нужно.

Нарисовал бы так структуру и понятно было сразу, как выглядит РС.
Измерения:
Объект
Группа
Ресурс:
Фильтр

---

Попробую порыться - где-то я делал такое....


Venturion
Ну как поиск а то мне что то не приходит в голову как в запрос такое написать...
BabySG
Упс.... :) Забыл про обещание :)
Сорри, постараюсь не забыть и к вечеру найти
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.