![]() |
![]() |
![]() |
|
Как в одном запросе обратиться сразу к трем документам? | ☑ | ||
---|---|---|---|---|
0
Надежда25
04.06.12
✎
13:50
|
Добрый день!
Есть документ "Инвентаризация незавершенного производства". Формируется каждый месяц для каждого подразделения. В отчет надо выводить данные последнего документа по каждому подразделению. Не знаю, как можно в одном запросе обратиться сразу к трем документам, каждый из которых по дате близок к сегодняшней? Когда было одно подразделение, дату вносила вручную, а запрос был таким: ВЫБРАТЬ ИнвентаризацияНЗПМатериалы.Ссылка, ИнвентаризацияНЗПМатериалы.Номенклатура КАК Сырье, ИнвентаризацияНЗПМатериалы.Количество КАК КоличествоНачОстаток ПОМЕСТИТЬ ТабЧасть ИЗ Документ.ИнвентаризацияНЗП.Материалы КАК ИнвентаризацияНЗПМатериалы ГДЕ ИнвентаризацияНЗПМатериалы.Ссылка.Дата >= &Дата; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабЧасть.Сырье, ТабЧасть.КоличествоНачОстаток, ИнвентаризацияНЗП.Дата КАК Дата, ИнвентаризацияНЗП.Ссылка КАК Документ // ТабЧасть.Ссылка ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ЛЕВОЕ СОЕДИНЕНИЕ ТабЧасть КАК ТабЧасть ПО (ТабЧасть.Ссылка = ИнвентаризацияНЗП.Материалы.Ссылка) ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ТабЧасть |
|||
1
butterbean
04.06.12
✎
13:54
|
условие с датой какое-то непонятное... как и весь запрос
условие на подразделение нельзя что-ли установить?? по аналогии с датой |
|||
2
Джинн
04.06.12
✎
13:56
|
> каждый из которых по дате близок к сегодняшней
Насколько близок? За май 1812 года - это еще близко, или уже далеко? PS Вы какими-то не программерскими терминами оперируете. |
|||
3
Надежда25
04.06.12
✎
13:59
|
Вообще-то да, можно сделать параметр "Подразделение". А как указать явно?
Дата - последняя введенная. |
|||
4
butterbean
04.06.12
✎
14:04
|
(3) что значит "как указать явно?"??
с датой понятней не стало |
|||
5
Надежда25
04.06.12
✎
14:12
|
Есть документы "Инвентаризация незавершенного производства", подразделение 1, от 31.01.2012,
от 29.02.2012, 01.04.2012; подразделение 2 от 31.01.2012, от 29.02.2012, 30.03.2012; подразделение 3 от 31.01.2012, от 29.02.2012, 31.03.2012. Надо выбрать данные из трех документов: подразделение 1 от 01.04.2012, подразделение 2 от 30.03.2012, подразделение 3 от 31.03.2012. "Указать явно" - сразу в запросе: ГДЕ ИнвентаризацияНЗП.Подразделение.Наименование = "1". |
|||
6
sapphire
04.06.12
✎
14:12
|
(0) Задача разбивается на 2:
1. Для каждого подразделения получить документ ближайший к дате. 2. Вывести данные табличной части документов из пункта 1. По п. 1 если документ "Инвентаризация незавершенного производства" содержит реквизит "Подраздление", тогда текст запроса будет выглядеть следующим образом select Документы.Подразделение ,Документы.Ссылка ,Документы.Дата ,ТЧМатериалы.Номенклатура Сырье ,ТЧМатериалы.Количество КАК КоличествоНачОстаток from ( select ЗапросБлижайшихДатДокументов.Подразделение ,ЗапросБлижайшихДатДокументов.Дата ,MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) Ссылка from ( select // этот подзапрос вернет ближайшую дату по подразделению Подразделение ,MAX(Дата) Дата FROM Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП_Реквизиты WHERE Дата<=&Дата GROUP BY Подразделение ) ЗапросБлижайшихДатДокументов INNER JOIN Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП_Реквизиты ON ИнвентаризацияНЗП_Реквизиты.Подразделение=ЗапросБлижайшихДатДокументов.Подразделение AND ИнвентаризацияНЗП_Реквизиты.Дата=ЗапросБлижайшихДатДокументов.Дата GROUP BY ЗапросБлижайшихДатДокументов.Подразделение ,ЗапросБлижайшихДатДокументов.Дата ) Документы INNER JOIN Документ.ИнвентаризацияНЗП.Материалы ТЧМатериалы ON ТЧМатериалы.Ссылка=Документы.Ссылка |
|||
7
AaNnDdRrEeYy
04.06.12
✎
14:13
|
вот так попробуй, естественно напиши синтаксически правильно
[code] выбрать первые 1 ИнвентаризацияНЗПМатериалы.Ссылка, Максимум(ИнвентаризацияНЗПМатериалы.Дата) поместить последнийдокумент из Документ.ИнвентаризацияНЗП.Материалы КАК ИнвентаризацияНЗПМатериалы где ИнвентаризацияНЗПМатериалы.Подразделение = &Подразделени ////////////////// ВЫБРАТЬ ИнвентаризацияНЗПМатериалы.Ссылка, ИнвентаризацияНЗПМатериалы.Номенклатура КАК Сырье, ИнвентаризацияНЗПМатериалы.Количество КАК КоличествоНачОстаток ПОМЕСТИТЬ ТабЧасть ИЗ Документ.ИнвентаризацияНЗП.Материалы КАК ИнвентаризацияНЗПМатериалы ГДЕ ИнвентаризацияНЗПМатериалы.Ссылка.Дата >= &Дата и ИнвентаризацияНЗПМатериалы.Ссылка в (последнийдокумент.Ссылка) //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТабЧасть.Сырье, ТабЧасть.КоличествоНачОстаток, ИнвентаризацияНЗП.Дата КАК Дата, ИнвентаризацияНЗП.Ссылка КАК Документ // ТабЧасть.Ссылка ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ЛЕВОЕ СОЕДИНЕНИЕ ТабЧасть КАК ТабЧасть ПО (ТабЧасть.Ссылка = ИнвентаризацияНЗП.Материалы.Ссылка) ; //////////////////////////////////////////////////////////////////////////////// УНИЧТОЖИТЬ ТабЧасть [/code] |
|||
8
AaNnDdRrEeYy
04.06.12
✎
14:14
|
(7) в первом запросе пакета еще сгруппировать надо по ссылке и максимум(дата)
|
|||
9
sapphire
04.06.12
✎
14:15
|
(7) НАФИГА?!
|
|||
10
AaNnDdRrEeYy
04.06.12
✎
14:17
|
(6)MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) Ссылка что вернет эта строка запроса?
максимум по ссылке нифига не максимум по дате |
|||
11
sapphire
04.06.12
✎
14:23
|
(10) Или ты невнимательно смотрел мой запрос, или....
|
|||
12
sapphire
04.06.12
✎
14:26
|
(10) Там дата УЖЕ выбрана максимальной, если ты не заметил.
Речь о том, что на одну и ту же дату может быть несколько документов, с учетом того КАК 1С генерит УИДы MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) вернет самый последний документ. Таким образом, этот подзапрос возвращает одну ссылку, одну дату для подразделения. |
|||
13
Надежда25
04.06.12
✎
15:38
|
(6) Спасибо большое за ответ. Буду разбираться в вашем запросе. Пока что скопировала его буквально и:
{(2, 2)}: Поле не найдено "ИнвентаризацияНЗП.Подразделение" <<?>>ИнвентаризацияНЗП.Подразделение, |
|||
14
sapphire
04.06.12
✎
15:40
|
(13) см в (6)
<B>если документ "Инвентаризация незавершенного производства" содержит реквизит "Подраздление", тогда</B> |
|||
15
sapphire
04.06.12
✎
15:40
|
(13) Какой реквизит в документе отличает одно подразделение от другого?
|
|||
16
sapphire
04.06.12
✎
15:46
|
// Конфигурация Бухгалтерия
select Документы.Подразделение ПодразделениеОрганизации ,Документы.Ссылка ,Документы.Дата ,ТЧМатериалы.Номенклатура Сырье ,ТЧМатериалы.Количество КАК КоличествоНачОстаток from ( select ЗапросБлижайшихДатДокументов.Подразделение ,ЗапросБлижайшихДатДокументов.Дата ,MAX(ИнвентаризацияНЗП_Реквизиты.Ссылка) Ссылка from ( select // этот подзапрос вернет ближайшую дату по подразделению ПодразделениеОрганизации Подразделение ,MAX(Дата) Дата FROM Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП_Реквизиты WHERE Дата<=&Дата GROUP BY ПодразделениеОрганизации ) ЗапросБлижайшихДатДокументов INNER JOIN Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП_Реквизиты ON ИнвентаризацияНЗП_Реквизиты.Подразделение=ЗапросБлижайшихДатДокументов.Подразделение AND ИнвентаризацияНЗП_Реквизиты.Дата=ЗапросБлижайшихДатДокументов.Дата GROUP BY ЗапросБлижайшихДатДокументов.Подразделение ,ЗапросБлижайшихДатДокументов.Дата ) Документы INNER JOIN Документ.ИнвентаризацияНЗП.Материалы ТЧМатериалы ON ТЧМатериалы.Ссылка=Документы.Ссылка |
|||
17
Надежда25
04.06.12
✎
15:46
|
Исправила: ИнвентаризацияНЗП.Подразделение.Наименование КАК Подразделение,
Все равно та же ошибка |
|||
18
sapphire
04.06.12
✎
15:50
|
(17) см (16)
|
|||
19
sapphire
04.06.12
✎
15:52
|
(17) У Вас реквизит как-то по-другому называется, т.е. его имя!="Подразделение",
вариантов 2: в Бухгалтерии вроде как для этого документа есть реквизит "ПодразделениеОрганизации" (взято с просторов инета ибо нет типовых конфигураций под рукой), либо "ПодразделениеЗатрат" |
|||
20
Надежда25
04.06.12
✎
15:55
|
У меня УПП - так и называется: Подразделение. Только что проверила.
|
|||
21
sapphire
04.06.12
✎
15:57
|
(20) Это оно на форме так называется, а вот как оно называется в реквизитах документа?
|
|||
22
Надежда25
04.06.12
✎
15:59
|
Увы, также.
|
|||
23
sapphire
04.06.12
✎
16:03
|
(22) По-пробуйте заменить в запросе "Подразделение" на то как указано в конфигураторе, возможно, что где то опечатка
|
|||
24
sapphire
04.06.12
✎
16:04
|
(22) Консоль запросов имеется?
|
|||
25
Надежда25
04.06.12
✎
16:11
|
Пробовала и в консоле, копировала из конфигуратора, все то же.
Неудобно Вас больше мучать, буду сама искать, за основное - спасибо. |
|||
26
Buster007
04.06.12
✎
16:24
|
(16) ужас.
|
|||
27
sapphire
04.06.12
✎
16:24
|
(25) Нестрашно. Раз есть консоль постараюсь объяснить логику и способ отладки запроса в (6) по-шагам.
1. В консоли конструктором из документа "ИнвентаризацияНЗП" выбираем поле подразделение и дата должны получить что-то вида ВЫБРАТЬ ИнвентаризацияНЗП.Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП Дописываем MAX к дате и группируем: ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе} Добавляем условие ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ГДЕ ИнвентаризацияНЗП.Дата<=&Дата GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в кофигураторе} Этот запрос вернет нам Дату документа , ближайшего к &Дата для каждого подразделения, у которого хоть когда-либо была ИНЗП. Далее, получим последний документ |
|||
28
Dmitry77
04.06.12
✎
16:31
|
все не осилил, а задать спикок документов на форме, а потом его тянуть в запрос почему нельзя?
|
|||
29
Надежда25
04.06.12
✎
16:35
|
Спасибо. А моя ошибка была в том, что я во второй строке запроса вместо: Документы.Подразделение
писала: ИнвентаризацияНЗП.Подразделение. Сейчас все работает. |
|||
30
sapphire
04.06.12
✎
16:36
|
+(27) К "огороду"
ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ГДЕ ИнвентаризацияНЗП.Дата<=&Дата GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} вверху пишем ВЫБРАТЬ * ИЗ и ставим открывающую скобку - внизу закрывающую и пишем ЗапросБлижайшихДатДокументов : ВЫБРАТЬ * ИЗ ( ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ГДЕ ИнвентаризацияНЗП.Дата<=&Дата GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ) ЗапросБлижайшихДатДокументов Соединим результат запроса с таблицей документов. ВЫБРАТЬ * ИЗ ( ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ГДЕ ИнвентаризацияНЗП.Дата<=&Дата GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ) ЗапросБлижайшихДатДокументов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП ПО ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}=ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} И ИнвентаризацияНЗП.Дата=ЗапросБлижайшихДатДокументов.Дата // Здесь необходимо учесть, что на дату теоретически для каждого подразделения может быть несколько документов, а нам нужен последний. Применим агрегирующую функцию MAX к полю Ссылка таблицы ИнвентаризацияНЗП: вместо * напишем ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} ,ЗапросБлижайшихДатДокументов.Дата ,MAX(ИнвентаризацияНЗП.Ссылка) КАК Ссылка и внизу допишем группировки GROUP BY ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} ,ЗапросБлижайшихДатДокументов.Дата Получится: ВЫБРАТЬ ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} ,ЗапросБлижайшихДатДокументов.Дата ,MAX(ИнвентаризацияНЗП.Ссылка) КАК Ссылка ИЗ ( ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ГДЕ ИнвентаризацияНЗП.Дата<=&Дата GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ) ЗапросБлижайшихДатДокументов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП ПО ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}=ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} И ИнвентаризацияНЗП.Дата=ЗапросБлижайшихДатДокументов.Дата GROUP BY ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} ,ЗапросБлижайшихДатДокументов.Дата // Этот запрос вернет уже ссылку на документ, ближайший к &Дата для подразделения. Остается только соединить полученные ссылки с таблицей табличной части и ввуаля : ВЫБРАТЬ Документы.Подразделение ПодразделениеОрганизации ,Документы.Ссылка ,Документы.Дата ,ТЧМатериалы.Номенклатура Сырье ,ТЧМатериалы.Количество КАК КоличествоНачОстаток ИЗ ( ВЫБРАТЬ ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} ,ЗапросБлижайшихДатДокументов.Дата ,MAX(ИнвентаризацияНЗП.Ссылка) КАК Ссылка ИЗ ( ВЫБРАТЬ MAX(ИнвентаризацияНЗП.Дата) Дата, ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ИЗ Документ.ИнвентаризацияНЗП КАК ИнвентаризацияНЗП ГДЕ ИнвентаризацияНЗП.Дата<=&Дата GROUP BY ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе} ) ЗапросБлижайшихДатДокументов ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП ИнвентаризацияНЗП ПО ИнвентаризацияНЗП.{Имя поля подразделения, как оно задано в конфигураторе}=ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} И ИнвентаризацияНЗП.Дата=ЗапросБлижайшихДатДокументов.Дата GROUP BY ЗапросБлижайшихДатДокументов.{Имя поля подразделения, как оно задано в конфигураторе} ,ЗапросБлижайшихДатДокументов.Дата ) Документы ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИнвентаризацияНЗП.Материалы ТЧМатериалы ПО ТЧМатериалы.Ссылка=Документы.Ссылка |
|||
31
sapphire
04.06.12
✎
16:38
|
(29) Написанное в (6) носило предположительный характер, а весь огород в (27) и (30) нужен только для того, что бы уметь быстро отладить неработающий запрос.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |