Вывод Итога через запрос
Показывать по
10
20
40
сообщений
- 1
- 2
03.08.2012
23:04
#1
"В Табличной части документа нужно в одной ячейке вывести среднее значение суммы всех товаров ( взять таблицу проданных товаров регистре накопления)
Как я понял должно получиться что-то вроде
Функция ВозвратСреднегоЗначения(Склад,Товар)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровОстатки.СкладКомпании КАК СкладКомпании,
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.ОстатокОстаток КАК ОстатокОстаток,
| ОстаткиТоваровОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &СкладКомпании
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("СкладКомпании", СкладКомпании);
Результат = Запрос.Выполнить();
Sum = Итог("СуммаОстаток"); (В регистре накопления это значение суммы товаров)
Kol = Итог("ОстатокОстаток"); (В регистре накопления это значение кол-ва товаров)
itog = sum / kol ;
Возврат itog;"
Как я понял должно получиться что-то вроде
Функция ВозвратСреднегоЗначения(Склад,Товар)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровОстатки.СкладКомпании КАК СкладКомпании,
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровОстатки.ОстатокОстаток КАК ОстатокОстаток,
| ОстаткиТоваровОстатки.СуммаОстаток КАК СуммаОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &СкладКомпании
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("СкладКомпании", СкладКомпании);
Результат = Запрос.Выполнить();
Sum = Итог("СуммаОстаток"); (В регистре накопления это значение суммы товаров)
Kol = Итог("ОстатокОстаток"); (В регистре накопления это значение кол-ва товаров)
itog = sum / kol ;
Возврат itog;"
03.08.2012
23:58
#2
"
Функция ВозвратСреднегоЗначения()"
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СРЕДНЕЕ(ВЫБОР
| КОГДА ЕСТЬNULL(ОстаткиНаСкладеОстатки.ОстатокОстаток, 0) = 0
| ТОГДА 0
| ИНАЧЕ ЕСТЬNULL(ОстаткиНаСкладеОстатки.ЦенаОстаток, 0) / ОстаткиНаСкладеОстатки.ОстатокОстаток
| КОНЕЦ) КАК Средняя
|ИЗ
| РегистрНакопления.ОстаткиНаСкладе.Остатки(
| &Период,
| Номенклатура = &Номенклатура
| И СкладКомпании = &СкладКомпании) КАК ОстаткиНаСкладеОстатки";
Запрос.УстановитьПараметр("Номенклатура", Объект.Товар);
Запрос.УстановитьПараметр("СкладКомпании", Объект.СкладКомпании);
Запрос.УстановитьПараметр("Период", Объект.Период);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Средняя;
КонецЦикла;
КонецФункции
04.08.2012
14:14
#3
"Увы получаю такое сообщение об ошибке:
{Документ.РеализацияТоваров.Форма.ФормаДокумента.Форма(20)}: Ошибка при вызове метода контекста (Выполнить) Результат = Запрос.Выполнить().Выбрать();по причине:{(10, 25)}: Неверные параметры "РегистрНакопления.ОстаткиТоваров.Остатки, 0"<>>И СкладКомпании = &СкладКомпании) КАК ОстаткиТоваровОстатки"
{Документ.РеализацияТоваров.Форма.ФормаДокумента.Форма(20)}: Ошибка при вызове метода контекста (Выполнить) Результат = Запрос.Выполнить().Выбрать();по причине:{(10, 25)}: Неверные параметры "РегистрНакопления.ОстаткиТоваров.Остатки, 0"<>>И СкладКомпании = &СкладКомпании) КАК ОстаткиТоваровОстатки"
04.08.2012
14:45
#4
В приведенной мной функции такого кода нет, а т.к. телепатическими способностями меня природа не наделила, то приводите сюда свой код функции полностью методом copy-past.
04.08.2012
15:37
#5
Есть документ "РеализацияТоваров". При выборе реквизита "Склад" и выбора реквизита "Номенклатура" нужно, чтобы осуществился запрос к регистру "ОстаткиТовара". Во время результата запроса должен быть посчитан общая стоимость товара (в регистре есть соответствующий ресурс) (которые лежат на выбранном складе) и их общее кол-во (в регистре также есть ресурс кол-во). Результатом запроса должен служить результат выражения Общаясумма/общее кол-во.
04.08.2012
17:36
#6
"Пока пробую что-то вроде этого, но без успешно
&НаСервереБезКонтекста
Функция ПолучитьЗакупочнуюЦенуТовара(Склад, Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.СкладКомпании,
| ОстаткиТоваровОстатки.Номенклатура,
| СУММА(ОстаткиТоваровОстатки.ОстатокОстаток) / СУММА(ОстаткиТоваровОстатки.СуммаОстаток) КАК ИТОГ
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &Склад
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("СкладКомпании", Склад);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Итог;
КонецЦикла;
КонецФункции"
&НаСервереБезКонтекста
Функция ПолучитьЗакупочнуюЦенуТовара(Склад, Номенклатура)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиТоваровОстатки.СкладКомпании,
| ОстаткиТоваровОстатки.Номенклатура,
| СУММА(ОстаткиТоваровОстатки.ОстатокОстаток) / СУММА(ОстаткиТоваровОстатки.СуммаОстаток) КАК ИТОГ
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &Склад
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("СкладКомпании", Склад);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Итог;
КонецЦикла;
КонецФункции"
04.08.2012
19:49
#7
"Зачем Вам в результате запроса нужна номенклатура и склад? Вам ведь нужна только средняя цена - вот ее и оставьте ("ИТОГ"). Номенклатура и склад итак известны.
Т.к. количество в регистре может оказаться нулем (допустим отсторнировали количество), то нужна проверка на "деление на ноль"
Далее вышеприведенную конструкцию добавляете в группировку (в суммируемое поле) с функцией "Среднее", т.е. сложить все строки и разделить на количество
Условие ГДЕ, в данном случае, лучше поместить в параметры виртуальной таблицы остатки:
&Период - это дата на которую вы хотите получить остатки.
В итоге:
P.S.: Попробуйте использовать для построения запросов конструктор (в тексте кода правый клик - конструктор запроса с обработкой результата)."
Т.к. количество в регистре может оказаться нулем (допустим отсторнировали количество), то нужна проверка на "деление на ноль"
ВЫБОР
КОГДА ОстаткиТоваровОстатки.ОстатокОстаток = 0 ТОГДА 0
ИНАЧЕ ОстаткиТоваровОстатки.СуммаОстаток / ОстаткиТоваровОстатки.ОстатокОстаток
КОНЕЦ
Далее вышеприведенную конструкцию добавляете в группировку (в суммируемое поле) с функцией "Среднее", т.е. сложить все строки и разделить на количество
СРЕДНЕЕ(ВЫБОР
КОГДА ОстаткиТоваровОстатки.ОстатокОстаток = 0 ТОГДА 0
ИНАЧЕ ОстаткиТоваровОстатки.СуммаОстаток / ОстаткиТоваровОстатки.ОстатокОстаток
КОНЕЦ) КАК ИТОГ
Условие ГДЕ, в данном случае, лучше поместить в параметры виртуальной таблицы остатки:
ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Номенклатура = &Номенклатура И СкладКомпании = &Склад) КАК ОстаткиТоваровОстатки
&Период - это дата на которую вы хотите получить остатки.
В итоге:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| СРЕДНЕЕ(ВЫБОР
| КОГДА ОстаткиТоваровОстатки.ОстатокОстаток = 0 ТОГДА 0
| ИНАЧЕ ОстаткиТоваровОстатки.СуммаОстаток / ОстаткиТоваровОстатки.ОстатокОстаток
| КОНЕЦ) КАК ИТОГ
| ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Номенклатура = &Номенклатура И СкладКомпании = &Склад) КАК ОстаткиТоваровОстатки";
Запрос.УстановитьПараметр("СкладКомпании", Склад);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Итог;
КонецЦикла;
Возврат 0;
КонецФункции
P.S.: Попробуйте использовать для построения запросов конструктор (в тексте кода правый клик - конструктор запроса с обработкой результата)."
05.08.2012
15:29
#9
"Тут не в копипасте проблема. Если брать способ Bloodwiser , то выдаёт данную ошибку. Если пробую вот так:
Запрос = Новый Запрос;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ОстаткиТоваровОстатки.ОстатокОстаток) / СУММА(ОстаткиТоваровОстатки.СуммаОстаток) КАК ИТОГ
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &Склад
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Итог;
КонецЦикла;
То ошибок нет, но в возврате значений нет. (В табл. ОстаткиТоваров значения есть)"
Запрос = Новый Запрос;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ОстаткиТоваровОстатки.ОстатокОстаток) / СУММА(ОстаткиТоваровОстатки.СуммаОстаток) КАК ИТОГ
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.СкладКомпании = &Склад
| И ОстаткиТоваровОстатки.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Возврат Результат.Итог;
КонецЦикла;
То ошибок нет, но в возврате значений нет. (В табл. ОстаткиТоваров значения есть)"
05.08.2012
17:43
#10
У вас проблема с переменной номенклатура.
Но т.к. я в первом топике пропустил
> ...среднее значение суммы всех товаров...
то уберите отбор по номенклатуре.
P.S.: получать остатки без даты - методологически неверно.
P.P.S.: считать среднюю цену по 5 мониторам за 5000 руб. и 3 мышкам за 500 руб. - маразм =).
Но т.к. я в первом топике пропустил
> ...среднее значение суммы всех товаров...
то уберите отбор по номенклатуре.
P.S.: получать остатки без даты - методологически неверно.
P.P.S.: считать среднюю цену по 5 мониторам за 5000 руб. и 3 мышкам за 500 руб. - маразм =).
- 1
- 2
Читают тему
(гостей: 1)