|
УТ11 Помогите с запросом | ☑ | ||
---|---|---|---|---|
0
breezee
26.05.15
✎
09:43
|
Недавно мне сильно помогли с запросом, еще раз спасибо. Нужно установить период на который выбираются документы - я создал параметр дату начала и дату конца, когда была просто дата конца - все работала -когда ставлю еще и дату начала - отчет выдает ошибку "Ошибка обработки представления РегистрСведений.ЦенымНоменклатуры.СрезПоследних Нсоответствие типов параметров 1 ВНУТРЕНННЕ Соединение РегистрСвед" - тут обрывается, при наведнии полный текст не показывается, я так понимаю что проблема в том что я сначала сравниваю в запросе с последним значением чтобы найти предпоследнее и + сравниваю в условии со значением начальной даты - по этому система и выдает ошибку, потому что не знает с чем сравнивать. Помогите разобраться, пожалуйста. Вот код запроса
ВЫБРАТЬ ЦеныНоменклатуры.ВидЦены, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.Характеристика, МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период, ЦеныНоменклатурыСрезПоследних.Цена ПОМЕСТИТЬ ВременнаяТаблицаПредпоследнийПериод ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних ПО ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И ЦеныНоменклатуры.ВидЦены = ЦеныНоменклатурыСрезПоследних.ВидЦены И ЦеныНоменклатуры.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика И ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период СГРУППИРОВАТЬ ПО ЦеныНоменклатуры.ВидЦены, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.Характеристика, ЦеныНоменклатурыСрезПоследних.Цена ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЦеныНоменклатуры.Номенклатура КАК Номенклатура, ВременнаяТаблицаПредпоследнийПериод.Цена КАК ЦенаНовая, ЦеныНоменклатуры.Цена КАК ЦенаСтарая, ВременнаяТаблицаПредпоследнийПериод.Цена - ЦеныНоменклатуры.Цена КАК Разность, ЦеныНоменклатуры.Регистратор ИЗ ВременнаяТаблицаПредпоследнийПериод КАК ВременнаяТаблицаПредпоследнийПериод ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО ВременнаяТаблицаПредпоследнийПериод.ВидЦены = ЦеныНоменклатуры.ВидЦены И ВременнаяТаблицаПредпоследнийПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура И ВременнаяТаблицаПредпоследнийПериод.Характеристика = ЦеныНоменклатуры.Характеристика И ВременнаяТаблицаПредпоследнийПериод.Период = ЦеныНоменклатуры.Период ГДЕ ЦеныНоменклатуры.ВидЦены = &ВидЦены УПОРЯДОЧИТЬ ПО Номенклатура |
|||
1
breezee
26.05.15
✎
10:12
|
ОК, я подправил - ошибка была идиотская - я просто использовал операторы ">" "<" с датами и все заработало. Чтобы не зря создать ветку - подскажите по запросу(который выше) если я вначале нахожу в физической таблице цен номенклатуры предпоследнюю запись(получается максимально последняя, из которой исключается самая последняя срезыванием последних), так почему я выбираю не её, а цену из вирт. таблицы? Если выбираю её - выбирается какая-то фигня.
|
|||
2
К_Дач
26.05.15
✎
10:41
|
1 пакет: выбрать максимальный период из физической таблицы регистра цен, условие ИМЕЮЩИЕ максимум(период) < СрезПоследних.Период, группировка по номенклатура, вид цен
2 пакет: выбираешь из 1 пакета поля и к ним слева приклеиваешь цену из физической таблицы регистра цен по равенству номенклатура, вид цены, период |
|||
3
breezee
26.05.15
✎
10:44
|
(2) ААААА, примноооого благодарен! Понял, спасибо!
|
|||
4
ls300
26.05.15
✎
10:45
|
(2) Может у автора так задача поставлена, что если нет предыдущей цены, то в запросе пусто) И во втором пакете не понятно правда зачем еще условие по виду цены если соединение полное. Автор что конкретно не так сейчас ценой, которую ты во втором пакете выбираешь из физической таблицы?
|
|||
5
ls300
26.05.15
✎
10:47
|
и на фейхуа здесь имеющие, если соединение внутреннее?
|
|||
6
breezee
26.05.15
✎
10:49
|
(4) Как пустоту побороть? С помощью Is NULL? Куда его вставлять? Заранее спасибо за ответ!
|
|||
7
ls300
26.05.15
✎
10:49
|
в (4) описка про "полное"..
|
|||
8
ls300
26.05.15
✎
10:49
|
(6) пустоту где?
|
|||
9
ls300
26.05.15
✎
10:50
|
(6) лучше бороть такую пустоту хотя-бы книжкой Радченко..
|
|||
10
breezee
26.05.15
✎
10:50
|
(4) >>(2) Может у автора так задача поставлена, что если нет предыдущей цены, то в запросе пусто)
Получается что у меня не выбирается номенклатура и цена для незаплненной предыдущей? |
|||
11
ls300
26.05.15
✎
10:53
|
конечно, чтобы получить 0 при том что цена первая, нужно использовать левое соединение а в итоговой таблице при выборе цены вместо "ЦеныНоменклатуры.Цена КАК ЦенаСтарая,"
Нужно "ЕстьNUll(ЦеныНоменклатуры.Цена,0) КАК ЦенаСтарая" И в поле ВременнаяТаблицаПредпоследнийПериод.Цена - ЦеныНоменклатуры.Цена КАК Разность, тоже самое. |
|||
12
breezee
26.05.15
✎
11:07
|
(11) Премного благодарен. Понял, что для всех полей, которые могут не существовать - надо ставить такое услвие - за это отдельное спасибо). И все же ошибку я не исправл - вообще можно оставить все как есть, но пользователю будет удобней выбирать с помощью стандартного периода начало и конец, а не с помощью выбора 2-х отдельных дат. Может я что-то не так делаю. 1) условия составил - в 1-ом пакете запроса для вирт. таблицы - период таблицы<=конечной дате и =>начальной. У меня в пармаетрах был период - для него поставил тип стандартный период и для даты начала и даты окончания в выражении заполнил "&Период.ДатаНачала" и "&Период.ДатаОкончания" - пишет то же самое Ошибка обработки представления РегистрСведений.ЦенымНоменклатуры.СрезПоследних Нсоответствие типов параметров 1 ВНУТРЕНННЕ Соединение РегистрСвед
|
|||
13
ls300
26.05.15
✎
11:11
|
(12) в этом случае нужно в параметр сразу передавать даты из периода, т.е. еще в момент установки параметра запроса.
|
|||
14
К_Дач
26.05.15
✎
11:11
|
(5) да, я чет не посмотрел, что внутреннее, думал левое
Вот так будет работать: ____ ВЫБРАТЬ ЦеныНоменклатуры.ТипЦен, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.ХарактеристикаНоменклатуры, МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период ПОМЕСТИТЬ ВременнаяТаблицаПредпоследнийПериод ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И ЦеныНоменклатуры.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры И ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период СГРУППИРОВАТЬ ПО ЦеныНоменклатуры.ТипЦен, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.ХарактеристикаНоменклатуры ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВременнаяТаблицаПредпоследнийПериод.ТипЦен, ВременнаяТаблицаПредпоследнийПериод.Номенклатура, ВременнаяТаблицаПредпоследнийПериод.ХарактеристикаНоменклатуры, ВременнаяТаблицаПредпоследнийПериод.Период, ЦеныНоменклатуры.Цена ИЗ ВременнаяТаблицаПредпоследнийПериод КАК ВременнаяТаблицаПредпоследнийПериод ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ПО ВременнаяТаблицаПредпоследнийПериод.ТипЦен = ЦеныНоменклатуры.ТипЦен И ВременнаяТаблицаПредпоследнийПериод.Номенклатура = ЦеныНоменклатуры.Номенклатура И ВременнаяТаблицаПредпоследнийПериод.ХарактеристикаНоменклатуры = ЦеныНоменклатуры.ХарактеристикаНоменклатуры И ВременнаяТаблицаПредпоследнийПериод.Период = ЦеныНоменклатуры.Период ____ |
|||
15
ls300
26.05.15
✎
11:12
|
вводится 2 параметра и уже их мы заполняем из стандартного периода, который выбрал пользователь.
|
|||
16
ls300
26.05.15
✎
11:14
|
(14) В таком виде тоже не будет работать.
1) в первом пакете тоже левое соединение. 2) Во втором пакете не использовано "ЕстьNull()" |
|||
17
К_Дач
26.05.15
✎
11:16
|
(16) в первом пакете внутреннее вообще-то.
ну уж естьнулл то он сам догадется подставить, я думаю |
|||
18
К_Дач
26.05.15
✎
11:17
|
да к тому же насчет естьнулл - в первом пакете выборка из той же самой таблицы, если там попался такой период - значит и во втором пакете будет, так что можно и без естьнулл. Все работает
|
|||
19
breezee
26.05.15
✎
11:19
|
Везде проставил ЕстьNULL, в первом пакете сделал левое по физической таблице. (13) То есть мне все же придется сделать объект в скд, а не запрос и напрямую передавать параметры в запрос?
|
|||
20
ls300
26.05.15
✎
11:20
|
(17) Мы же рассматриваем вариант когда цена задана только одна. В этом случае должен быть 0 в реквизите "Цена старая", но результат запроса не должен быть пустой. Поэтому в первом пакете должно быть левое соединение.
|
|||
21
К_Дач
26.05.15
✎
11:22
|
(20) а, ну тогда ясное дело. Я думал, надо возвращать предпоследнюю цену, только если она есть. Тогда конечно левое
|
|||
22
ls300
26.05.15
✎
11:22
|
(19) Да, в СКД это еще проще делается. Создается новый параметр "Стандартный период". В запросе два обычных параметра типа "ДАТА". Потом в СКД для 2-х параметрам в ячейке "Выражение" пишем "&СтандартныйПериод.ДатаНачала" и т.д.
|
|||
23
breezee
26.05.15
✎
11:23
|
(22) Дак я так и написал >>(12) И все же ошибку я не исправл - вообще можно оставить все как есть, но пользователю будет удобней выбирать с помощью стандартного периода начало и конец, а не с помощью выбора 2-х отдельных дат. Может я что-то не так делаю. 1) условия составил - в 1-ом пакете запроса для вирт. таблицы - период таблицы<=конечной дате и =>начальной. У меня в пармаетрах был период - для него поставил тип стандартный период и для даты начала и даты окончания в выражении заполнил "&Период.ДатаНачала" и "&Период.ДатаОкончания" - пишет то же самое Ошибка обработки представления РегистрСведений.ЦенымНоменклатуры.СрезПоследних Нсоответствие типов параметров 1 ВНУТРЕНННЕ Соединение РегистрСвед
И все равно ругается |
|||
24
breezee
26.05.15
✎
11:29
|
Абсолютно внезапно создал новый стандартный период - назвал "Спериод" - сделал все тоже самое - ошибка перестала выходить, наверное это потому что "Период" использовался ранее
|
|||
25
Basilio
26.05.15
✎
11:30
|
(23) у тебя в параметрах Среза последних дата должна быть, а не период
|
|||
26
ls300
26.05.15
✎
11:30
|
(23) Все я понял твою ошибку)) Надо задать явно параметры виртуальной таблицы СрезПоследних
|
|||
27
ls300
26.05.15
✎
11:31
|
И для чего пользователю нужна дата начала периода?
|
|||
28
breezee
26.05.15
✎
11:34
|
(27) Там вообще все переоценки выбираются, а с отбором с начала периода - только с какого-то момента.
|
|||
29
ls300
26.05.15
✎
11:36
|
(28) ну значит надо все это описать в условиях и параметрах среза, в первом пакете запроса.
|
|||
30
breezee
26.05.15
✎
11:37
|
Если я просто копирую условие - пишет что не найдено и >= &ДатаНачала тоже не могу поставить, не могу обратиться, да в принципе и так нормально работает. Думаю оставить все как есть
|
|||
31
breezee
26.05.15
✎
11:38
|
(29) в смысле если указываю в параметрах виртуальой таблицы, а не в условиях
|
|||
32
ls300
26.05.15
✎
11:40
|
ВЫБРАТЬ
ЦеныНоменклатуры.ТипЦен, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.ХарактеристикаНоменклатуры, МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период ПОМЕСТИТЬ ВременнаяТаблицаПредпоследнийПериод ИЗ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаОкончания, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних ПО ЦеныНоменклатуры.ТипЦен = ЦеныНоменклатурыСрезПоследних.ТипЦен И ЦеныНоменклатуры.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура И ЦеныНоменклатуры.ХарактеристикаНоменклатуры = ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры И ЦеныНоменклатуры.Период < ЦеныНоменклатурыСрезПоследних.Период СГРУППИРОВАТЬ ПО ЦеныНоменклатуры.ТипЦен, ЦеныНоменклатуры.Номенклатура, ЦеныНоменклатуры.ХарактеристикаНоменклатуры Где ЦеныНоменклатурыСрезПоследних.Период >= &ДатаНачала ; |
|||
33
ls300
26.05.15
✎
11:41
|
вуаля?)
|
|||
34
breezee
26.05.15
✎
11:44
|
(33) Спасибо!
|
|||
35
ls300
26.05.15
✎
11:45
|
(34) Только не забудь внутреннее соединение на левое замениить)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |