gifts2017

Временные таблицы, отбор по нескольким составным ключам в запросе.

Опубликовал A_kryl К (A_kryl) в раздел Программирование - Практика программирования

Иногда возникает потребность отбора в запросе по составному ключу – типа партия, серия, номенклатура – при одном значении ключа проблем нет, а вот когда значений ключа несколько возникает проблема

Иногда возникает потребность отбора по составному ключу - типа партия, серия, номенклатура - при одном значении ключа проблем нет, просто в запросе ставим условие партия =... и серия =... и номенклатура=..., а вот когда значений ключа несколько возникает проблема. Например имеется таблица значений с набором таких ключей. Один из вариантов динамически сгенерировать запрос через «или» - но и запрос может вырасти до огромных размеров и параметров немеряно... некрасиво. Для решения задачи можно воспользоваться Временными таблицами, вдобавок там источниками данных может быть таблица значений. Ниже пример: нужно найти в каких документах фигурировали партии из таблицы значений позднее определенной даты(на практике смотрим фигурировали ли партии в документах позднее текущего...)

Упс - таблица значений с полями: Номенклатура, ДокументОприходования, Серия

МенеджерВТ   =Новый МенеджерВременныхТаблиц;
               
Запрос =Новый Запрос;

               
Запрос.МенеджерВременныхТаблиц              =МенеджерВТ;
               
Запрос.Текст    =" Выбрать ДокументОприходования, Серия, Номенклатура
                |Поместить ВТ
                |Из &ТаблЗнач Как ТаблЗнач
                |;
                |ВЫБРАТЬ
                |ПартииОтветХранНаСкладахОбороты.Регистратор,
                |ПРЕДСТАВЛЕНИЕ(ПартииОтветХранНаСкладахОбороты.Регистратор)
                |ИЗ
                |ВТ КАК ВТ
                |ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииОтветХранНаСкладах.Обороты(&ДатаНач, , Регистратор, ) КАК ПартииОтветХранНаСкладахОбороты
                |ПО ВТ.Номенклатура = ПартииОтветХранНаСкладахОбороты.Номенклатура
                |И ВТ.ДокументОприходования = ПартииОтветХранНаСкладахОбороты.ДокументОприходования
                |И ВТ.Серия = ПартииОтветХранНаСкладахОбороты.Серия"
;

                              
Запрос.УстановитьПараметр("ТаблЗнач",Упс);
                              
Запрос.УстановитьПараметр("ДатаНач", Дата);
                              
тз            =Запрос.Выполнить().Выгрузить();
МенеджерВТ   =Неопределено;

1.Создаем менеджер временных таблиц
2.Создаем новый запрос (здесь пакет запросов)
3.Первым запросом помещаем во временную таблицу таблицу значений
4.Вторым запросом делаем выборку из регистра установив условия связи.
5.На выходе получаем результат запроса.

Подробно о временных таблицах можно почитать в дополнении к описанию в каталоге Readme или AddDoc программы

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Эстер Коган (e.kogan) 29.04.10 17:04
Вообще-то составной ключ возможен и в виде "(ДокументОприходования,Серия,Номенклатура) В (Выбрать ДокументОприходования, Серия, Номенклатура ИЗ ВТ))". Причём сразу в параметрах виртуальной таблицы.

Что это, Бэрримор? Статья? Нет. Овсянка, сэр.

Скучно. Очевидно. Плохо оформлено.
2. Алексей Роза (DoctorRoza) 30.04.10 12:10
ИМХО .. использование вложенного запроса не так наглядно, как применение временных таблиц и пакетного запроса. Конечно, что лучше .. покажет опытный эксперимент на быстродействие того или иного вида запроса!
P.s. Приведенный пример хорош и нагляден для начинающих программистов, поэтому, за то, что можно поучиться и .. чайникам .. плюсану! ;)
3. Ivon (Ivon) 05.05.10 09:56
(2). Запрос с вложенными запросами выполняется быстрее, чем запрос с временными таблицами. Это факт. На 2-х временных таблицах не заметно, а когда результат содержит 1000 строк по 20 колонок и используется 15 временных таблиц - заметно очень сильно.
4. Ivon (Ivon) 05.05.10 09:57
Автору:
Правильно будет
МенеджерВТ.Закрыть();

И еще, в данном примере менеджер временных таблиц абсолютно не нужен. Для проверки можешь закомментировать строки, с ним связанные и увидишь, что все отработает. МВТ нужен для передачи временных таблиц между разными запросами. Хорошо использовать МВТ для организации расшифровок в отчетах, чтобы не выбирать данные повторно.
A_kryl; artmicro; Spitfire; +3 Ответить
5. A_kryl К (A_kryl) 18.05.10 13:57
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=539689#539689
если комуто интересно - мнение 1С по использованию вложенных запросов и временных таблиц
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа