|
Пустой СписокЗначении в параметре запроса. | ☑ | ||
---|---|---|---|---|
0
lirt82
04.05.17
✎
17:32
|
Пишу отчет, создал реквизит СписокТоваров тип списокЗначении, нужно сформировать запрос
если не выбрали ничего т.е. пустой список то отчет формируется по всей номенклатуре, не могу это закодить:) Процедура СформироватьНаСервере() СпНоменклатуры = Новый СписокЗначений; СпНоменклатуры.Добавить(СписокТоваров); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровТовары.Номенклатура, | РеализацияТоваровТовары.Цена, | РеализацияТоваровТовары.Количество |ИЗ | Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары |ГДЕ | РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)"; Запрос.УстановитьПараметр("СпНоменклатуры", СпНоменклатуры); |
|||
1
КоньЛапчатый
04.05.17
✎
17:33
|
(0) Так напиши:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровТовары.Номенклатура, | РеализацияТоваровТовары.Цена, | РеализацияТоваровТовары.Количество |ИЗ | Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары |ГДЕ | РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)"; Запрос.УстановитьПараметр("СпНоменклатуры", СписокТоваров); |
|||
2
Тролебузин
04.05.17
✎
17:35
|
ГДЕ
ВЫБОР КОГДА ЕстьОтборПоНоменклатуре ТОГДА РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры) ИНАЧЕ ИСТИНА КОНЕЦ Запрос.УстановитьПараметр("ЕстьОтборПоНоменклатуре", СпНоменклатуры.Количество() > 0); |
|||
3
Волшебник
модератор
04.05.17
✎
17:36
|
ГДЕ &ЕстьОтбор И Номенклатура В ИЕРАРХИИ(&СпНоменклатуры)
а вообще запрос к документам — плохая примета |
|||
4
КоньЛапчатый
04.05.17
✎
17:37
|
не сразу понял суть.
так тогда надо: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТоваровТовары.Номенклатура, | РеализацияТоваровТовары.Цена, | РеализацияТоваровТовары.Количество |ИЗ | Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары" + ?(СписокТоваров.Количество() = 0, "", " |ГДЕ | РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)"); если СписокТоваров.Количество() > 0 тогда Запрос.УстановитьПараметр("СпНоменклатуры", СписокТоваров); конецесли; |
|||
5
lirt82
04.05.17
✎
17:47
|
при выполнении этого запроса, если ничего не выбрали то результат пустой, а нужно если ничего не выбрали то по всей номенклатуре
|
|||
6
lirt82
04.05.17
✎
17:48
|
(4) все отбой спасибо всем
|
|||
7
Chameleon1980
04.05.17
✎
18:12
|
(4) тут уже конструктором не воспользуешься
красивее варианты выше |
|||
8
Windyhead
04.05.17
✎
18:13
|
в (3) ошибочка небольшая вместо "И" надо ИЛИ
ну и заменить параметр "ЕстьОтбор" по смыслу на "НетОтбора" |
|||
9
Chameleon1980
04.05.17
✎
18:15
|
(8) все норм там
|
|||
10
Windyhead
04.05.17
✎
18:17
|
(9) Уверен?
|
|||
11
Chameleon1980
04.05.17
✎
18:21
|
(10) почти на 100%.
почему так - 100% никогда стараюсь не двавать |
|||
12
Chameleon1980
04.05.17
✎
18:22
|
+ (11) хотя сам в жизни использую как в (2)
|
|||
13
Windyhead
04.05.17
✎
18:25
|
(12) При ЕстьОтбор = Ложь все выражение будет Ложь и соотвественно пустой результат запроса.
|
|||
14
Chameleon1980
04.05.17
✎
18:28
|
(13) согласен
вариант из выбор когда тогда иначе истина конец тогда |
|||
15
Chameleon1980
04.05.17
✎
18:31
|
+(14)
т.е. вариант (для меня, по-крайней мере) более понятный такой: ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.КоличествоОстаток ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки( &ДатаСреза, ВЫБОР КОГДА &ЕстьОтбор ТОГДА Номенклатура В Иерархии(&СписокНоменклатуры) ИНАЧЕ ИСТИНА КОНЕЦ) КАК ТоварыНаСкладахОстатки |
|||
16
Buster007
04.05.17
✎
18:51
|
(15) а зачем Иначе?
|
|||
17
Chameleon1980
04.05.17
✎
19:07
|
Если ЕстьОтбор будет ложь
без иначе не отработает как с неуказанным списком |
|||
18
lirt82
05.05.17
✎
07:37
|
апну тему, в консоле запрос отрабатывает нормально, а файл отчета ругается
на форме 2 реквизита ТоварыСп тип СписокЗначений, Тип значения списка СправочникСсылка.Номенклатура и ПодразделениеСп тип СписокЗначений, Тип значения списка СправочникСсылка.ПодразделенияОрганизаций если на форме у оба реквизита не заполню то ругается Форма.ФормаОтчета.Форма(53)}: Ошибка при вызове метода контекста (Выполнить) РезультатЗапроса = Запрос.Выполнить().Выбрать(); по причине: {(16, 25)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. КОГДА &СписокТоваров <<?>>= ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) текст запроса Процедура КнопкаСформироватьНажатие(Кнопка) ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1; Макет = ПолучитьМакет("Макет"); ОбластьШапка = Макет.ПолучитьОбласть("Шапка"); ОбластьСтрока = Макет.ПолучитьОбласть("Строка"); ТабДок.Очистить(); ТабДок.Вывести(ОбластьШапка); СписокТоваров = Новый СписокЗначений; СписокТоваров.Добавить(ТоварыСп); СписокПод = Новый СписокЗначений; СписокПод.Добавить(ПодразделениеСп); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписаниеТоваровТовары.Номенклатура, | СписаниеТоваровТовары.Ссылка.Дата, | СписаниеТоваровТовары.Ссылка.Подразделение, | СписаниеТоваровТовары.ОсновноеСредство, | ЦеныНоменклатурыСрезПоследних.Цена, | СписаниеТоваровТовары.Количество |ИЗ | Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОкончания, ) КАК ЦеныНоменклатурыСрезПоследних | ПО СписаниеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура |ГДЕ | СписаниеТоваровТовары.Ссылка.Проведен = ИСТИНА | И СписаниеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания | И ВЫБОР | КОГДА &СписокТоваров = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | ТОГДА ИСТИНА | ИНАЧЕ СписаниеТоваровТовары.Номенклатура В ИЕРАРХИИ (&СписокТоваров) | КОНЕЦ | И СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО | И ВЫБОР | КОГДА &СписокПод = ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) | ТОГДА ИСТИНА | ИНАЧЕ СписаниеТоваровТовары.Ссылка.Подразделение В ИЕРАРХИИ (&СписокПод) | КОНЕЦ"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания)); Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров); Запрос.УстановитьПараметр("СписокПод", СписокПод); РезультатЗапроса = Запрос.Выполнить().Выбрать(); н = 0; Пока РезультатЗапроса.Следующий() Цикл н = н + 1; ОбластьСтрока.Параметры.н = н; ОбластьСтрока.Параметры.Товар = РезультатЗапроса.Номенклатура; подскажите как исправить? |
|||
19
lirt82
05.05.17
✎
07:43
|
кстати даже если укажу подразделение и номенклатуру такая же ошибка, а в консоле нет, пустые или заполнениые параметры все формирует:)
|
|||
20
Тихий омут
05.05.17
✎
07:52
|
(18) у тебя сам параметр запроса СписокТоваров какого типа? Список значений. Вот оно и ругается, что не может сравнить список и ссылку. Кстати, с подразделениями у тебя такая же песня.
|
|||
21
lirt82
05.05.17
✎
07:56
|
(20) понял...так как исправить?
|
|||
22
h-sp
05.05.17
✎
07:59
|
(21) убрать этот бред
| КОГДА &СписокТоваров = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) лучше и диск сразу пререформатируй, чтобы такую ахинею больше не повторить случайно. |
|||
23
lirt82
05.05.17
✎
08:01
|
(22) суть такова что пользователь может выбрать номенклатуру а может и не выбрать, если не выбрал то по всей номенклатуре
|
|||
24
sFAQer
05.05.17
✎
08:04
|
(23) Стаж: 7 лет 9 месяцев 28 дней.
Как у тебя это получается спустя почти 8 лет? |
|||
25
Тихий омут
05.05.17
✎
08:06
|
(21) добавляй в запрос параметры ЕстьОтборПоНоменклатуре и ЕстьОтборПоПодразделениям, используй методу из (3). Сами параметры инициализируй как Запрос.УстПарам("ЕстьОтборПоПодразделениям",СписокПодр.Количество()=0)
(22) чё так жёстко-то? я так прежде чем снеговиком занялся, не одну тонну прямых скульных запросов написал для 7.7, и то с трудом въехал в кроссплатформенный бардак запросов восьмёрки. так что имхо норм всё, учится человек |
|||
26
Тихий омут
05.05.17
✎
08:07
|
(21) +(25) в моем примере есть ошибка, но ты сам её найди, напрягай внутричерепную мышцу, а то атрофируется
|
|||
27
darius357
05.05.17
✎
08:26
|
ну как всегда побакланили, и нифига толку
|
|||
28
makfromkz
05.05.17
✎
08:31
|
я по-колхозному действую
ГДЕ РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры) ИЛИ &флПустой флПустой заполняю истиной когда список пустой иначе ложь |
|||
29
lirt82
05.05.17
✎
09:00
|
(28) спасибо за совет
сделал так Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СписаниеТоваровТовары.Номенклатура, | СписаниеТоваровТовары.Ссылка.Дата, | СписаниеТоваровТовары.Ссылка.Подразделение, | СписаниеТоваровТовары.ОсновноеСредство, | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена, | СписаниеТоваровТовары.Количество |ИЗ | Документ.СписаниеТоваров.Товары КАК СписаниеТоваровТовары | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОкончания, ) КАК ЦеныНоменклатурыСрезПоследних | ПО СписаниеТоваровТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура |ГДЕ | (СписаниеТоваровТовары.Ссылка.Проведен = ИСТИНА | И (СписаниеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания) | И СписаниеТоваровТовары.Номенклатура В (&СписокТоваров) | ИЛИ &флПустой2 | И СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО | И СписаниеТоваровТовары.Ссылка.Подразделение В (&СписокПод) | ИЛИ &флПустой)"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ДатаОкончания)); Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров); Запрос.УстановитьПараметр("флПустой2", ?(СписокТоваров.Количество() = 0,Истина,Ложь)); Запрос.УстановитьПараметр("СписокПод", СписокПод); Запрос.УстановитьПараметр("флПустой", ?(СписокПод.Количество() = 0,Истина,Ложь)); но опять если ничего не выбираем то пустой результат |
|||
30
AlvlSpb
05.05.17
✎
09:09
|
(29) Это запрос в отчете? СКД?
|
|||
31
catena
05.05.17
✎
09:14
|
(29)Если я правильно поняла логику условия, то после &флПустой2 нужно поставить закрывающую скобку, и перед "СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО" поставить открывающую скобку. Логические операции имеют свои приоритеты и без расставленных скобок "И" более приоритетно, чем "ИЛИ".
|
|||
32
lirt82
05.05.17
✎
09:16
|
(30) не СКД
|
|||
33
AlvlSpb
05.05.17
✎
09:21
|
(32) Как вариант
Запрос как в (0). После запроса: Если СпНоменклатуры.Количество()=0 Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст,"ГДЕ РеализацияТоваровТовары.Номенклатура В(&СпНоменклатуры)", ""); Иначе Запрос.УстановитьПараметр("СпНоменклатуры", СпНоменклатуры) КонецЕсли; |
|||
34
lirt82
05.05.17
✎
09:25
|
(33) нужен вариант для (28)
|
|||
35
Мимохожий Однако
05.05.17
✎
09:25
|
Сделай два текста запроса для списка и для всех товаров и по условию выбирай. Это для случая, если не разберешься с условиями.
|
|||
36
catena
05.05.17
✎
09:26
|
(35)У него два списка. Предлагаете четыре запроса?
|
|||
37
Мимохожий Однако
05.05.17
✎
09:27
|
(36) да хоть 100. Сначала пусть добьётся результата. А потом играется с условиями. Полезно для обучения.
|
|||
38
НЕА123
05.05.17
✎
09:28
|
OFF
почему игнорируют ПостроительЗапроса, ПостроительОтчета? |
|||
39
AlvlSpb
05.05.17
✎
09:34
|
(34) Какая разница? Задача - убрать условие, если списки пустые. Убирайте условия правкой запроса по условию. Просто условие будет сложней, удалять надо две строки и в комбинации строк, а так принцип один и тот же. флПустой тогда вообще не нужен
|
|||
40
AlvlSpb
05.05.17
✎
09:47
|
Хорошо:
Условие в запросе: ГДЕ (СписаниеТоваровТовары.Ссылка.Проведен = ИСТИНА И (СписаниеТоваровТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания) И СписаниеТоваровТовары.ОсновноеСредство <> НЕОПРЕДЕЛЕНО После запроса: Если СписокТоваров.Количество > 0 Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, " = ИСТИНА", " = ИСТИНА И СписаниеТоваровТовары.Номенклатура В (&СписокТоваров)"); Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров); КонецЕсли; Если СписокПод.Количество > 0 Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "<> НЕОПРЕДЕЛЕНО", "<> НЕОПРЕДЕЛЕНО И СписаниеТоваровТовары.Ссылка.Подразделение В (&СписокПод)"); Запрос.УстановитьПараметр("СписокПод", СписокПод); КонецЕсли; |
|||
41
AlvlSpb
05.05.17
✎
09:48
|
Пропустил скобки после Количество() в обоих случаях, подставь
|
|||
42
lirt82
05.05.17
✎
11:16
|
(40) опять также ерунда, если ничего не выбираем то отладчик все равно говорит СписокТоваров.Количество()>0
|
|||
43
catena
05.05.17
✎
11:39
|
(42)Так это у вас со списком что-то не то.
|
|||
44
AlvlSpb
05.05.17
✎
16:44
|
(42) Разобрались? Я кажется врубился. У вас скорей всего, списки уже сформированы и пользователь просто выбирает значение из списка? Но список-то уже есть! И, даже, если пользователь ничего не выбрал список не пустой! В этом случае условие конечно не такое.
Если ЗначениеЗаполнено(Объект.Список) Тогда .... // Объект.Список - поле формы со списком значений |
|||
45
echo77
05.05.17
✎
17:18
|
Уже было: Книга знаний: Хитрое написание текстов запросов с необязательными условиями
А вообще я за построитель запроса |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |