Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

v8: Запрос с фильтрацией из ТЗ

v8: Запрос с фильтрацией из ТЗ
Я
   Zorba131
 
23.01.13 - 15:54
К примеру есть заполненный непериодический и независимый РегистрСведений со столбцами:

Договор | Тип | Дата

и есть,к примеру, заполненная ТЗ со столбцами:

Тип | Дата
1   | 10.01.2013
3   | 01.01.0001
7   | 01.01.0001

Как описать запрос, что бы на выходе был список договоров, у которых поля Тип и Дата соответствовали значению в ТЗ, причем, если в строке ТЗ поле Дата пустая, то значит фильтровать договора только по полю Тип.

Вот пример результата:

Договор | Тип | Дата
дгвр1   | 1   | 10.01.2013
дгвр2   | 3   | 23.04.2010
дгвр3   | 1   | 10.01.2013
дгвр4   | 7   | 02.06.2011


Должно получиться, что-то типа этого, но мой пример явно неправильный.

ВЫБРАТЬ
   Таб1.Договор,
    Таб1.Тип,
   Таб1.Дата
ИЗ
    РегистрСведений.РС КАК Таб1
ГДЕ
    Таб1.Тип В(&сз1)
    И Таб1.Дата В(&сз2)
 
 
   Maxus43
 
1 - 23.01.13 - 15:56
что такое &сз1 и &сз2?
   Wobland
 
2 - 23.01.13 - 15:57
соединить регистр с ТЗ что-ли?
   salvator
 
3 - 23.01.13 - 15:58
(0) ТЗ во временную таблицу, потом соединяй РС с ней по нужным полям.
   Zorba131
 
4 - 23.01.13 - 15:59
(1)
Запрос.УстановитьПараметр("сз1", ТЗ.ВыгрузитьКолонку("Тип"));
Запрос.УстановитьПараметр("сз2", ТЗ.ВыгрузитьКолонку("Дата"));
   Maxus43
 
5 - 23.01.13 - 15:59
сз1 = ЗаполненаяТЗ.ВыгрузитьКолонку("Тип");
сз2 = ЗаполненаяТЗ.ВыгрузитьКолонку("Дата");
ГДЕ
    Таб1.Тип В(&сз1) 

 И (Таб1.Дата В(&сз2) ИЛИ Таб1.Дата = &пустаяДата)


или (2)(3)
   Zorba131
 
6 - 23.01.13 - 16:06
(5)
И (Таб1.Дата В(&сз2) ИЛИ Таб1.Дата = &пустаяДата)
А разве тут не теряется соответствие определенных Тип+Дата и будут отображаться договора с Типом, не соответствующим требуемой от него Даты?
   Maxus43
 
7 - 23.01.13 - 16:08
(6) это означает >>если в строке ТЗ поле Дата пустая, то значит фильтровать договора только по полю Тип
   Maxus43
 
8 - 23.01.13 - 16:09
блин, хотя нет. делай вариант (2)(3), там проще будет
   Zorba131
 
9 - 23.01.13 - 16:17
вот простейший пример кода, дающий этот результат, а нужно тоже самое, но в запросе:
представим, что РС это РегистрСведений, выгруженный в таблицу значений
Для Каждого стрРС Из РС Цикл
        Для Каждого стрТЗ Из ТЗ Цикл
            Если стрРС.Тип = стрТЗ.Тип Тогда
                Если стрРС.Дата = стрТЗ.Дата Или стрТЗ.Дата = Дата("00010101") Тогда
                    стрРез = Результат.Добавить();
                    стрРез.Договор = стрРС.Договор;
                    стрРез.Тип = стрРС.Тип;
                    стрРез.Дата = стрРС.Дата;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
   hhhh
 
10 - 23.01.13 - 16:22
ВЫБРАТЬ
    Таб1.Договор,
    Таб1.Тип,
    Таб1.Дата
ИЗ
    РегистрСведений.РС КАК Таб1
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб
    ПО Таб.Тип = Таб1.Тип И Таб.Дата = Таб1.Дата
 
 Рекламное место пустует
   Zorba131
 
11 - 23.01.13 - 16:27
(10)
А если в ТЗ(таблица фильтров) дата имеет пустое значение?
   H A D G E H O G s
 
12 - 23.01.13 - 16:29
И
ВЫБОР КОГДА Таб1.Дата=ДатаВремя(1,1,1) ТОГДА
ИСТИНА
ИНАЧЕ
Таб.Дата = Таб1.Дата
КОНЕЦ
   H A D G E H O G s
 
13 - 23.01.13 - 16:29
Ну или както так.
   Zorba131
 
14 - 24.01.13 - 12:02
(12)
Спасибо, то что нужно!


ВЫБРАТЬ
    Таб1.Договор,
    Таб1.Тип,
    Таб1.Дата
ИЗ
    РегистрСведений.РС КАК Таб1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
        ПО (ТЗ.Тип = Таб1.Тип)
            И (ВЫБОР
                КОГДА ТЗ.Дата = ДАТАВРЕМЯ(1, 1, 1)
                    ТОГДА ИСТИНА
                ИНАЧЕ НАЧАЛОПЕРИОДА(ТЗ.Дата, ДЕНЬ) = НАЧАЛОПЕРИОДА(Таб1.Дата, ДЕНЬ)
            КОНЕЦ)

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует