Имя: Пароль:
1C
 
Умножение в запросе [Решение]
0 twilight5023
 
16.09.09
18:09
Наткнулся тут на похожую тему - Умножение в запросе , вообщем в некоторых случаях нужно реализовать умножение в запросе. Пример реальной задачи. Торговля и Склад. Товар забит с базовой единицей штука, а основной, ну к примеру коробка. Требуется в отчете "Ведомость по остаткам ТМЦ" получить результаты в килограммах. Решением в такой ситуации может послужить конечно списание всего товара, заведение в справочник номенклатуры нового товара, с базовой единицей кг. А можно и изменить запрос. Только вот каким образом умножать количество на вес базовой единицы, чтобы еще и в группах получать корректные значения. На самом деле все очень просто, вводим в запрос дополнительную переменную вес:

|Вес = Регистр.ОстаткиТМЦ.Номенклатура.БазоваяЕдиница.Вес,
|      Регистр.РезервыТМЦ.Номенклатура.БазоваяЕдиница.Вес;
|Количество = Регистр.ОстаткиТМЦ.Количество;
|Функция КоличествоНачОст          = НачОст(Количество);

Функция КоличествоНачОст у нас уже есть, остается придумать как посчитать КоличествоНачОст * Вес (при обходе группировок делать это тяжко, принимая во внимание что у нас выводятся итоги по группам, намного проще было бы, если бы процедура умножения производилась в самом запросе.

Если сделать что-то вроде:

|Функция ВесНачОст = Сумма(Запрос.КоличествоНачОст * Вес);

То результат получится. Но к сожалению функция Сумма округляет результат до целых, отбрасывая дробную часть. Что непреемлемо. Несколько простых примеров:

|Функция ПростоСумма = Сумма(9.9);

при одном "суммировании" внутри запроса выдаст 10 вместо 9.9, однако

Функция ПростоСумма = Сумма(9.9 + ПеременнаяЗапроса - ПеременнаяЗапроса);

Выдаст 9.9 с точностью, которую имеет ПеременнаяЗапроса. Т.е. если у переменной запроса точность знаков после запятой 4, то Сумма выдаст 9.9000.

Итого для подсчета начального остатка веса получаем следующую функцию:

|Функция ВесНачОст = Сумма(Запрос.КоличествоНачОст * Вес + Количество - Количество);

Не так красиво на первый взгляд - но зато работает, и выдает корректные результаты по группам.
1 Ковычки
 
16.09.09
18:11
Условие( и че хошь считай
2 twilight5023
 
16.09.09
18:14
(1) Ну расскажи мне как посчитать с условием начальный остаток по регистру ОстаткиТМЦ в тоннаже? Нет, даже проще задача ... получить в запросе начальный остаток по ресурсу Количество умноженный на 2. Именно чтобы умножение происходило в запросе. Куда и как ты собираешься это условие впихнуть?
3 twilight5023
 
16.09.09
18:15
+2 С функцией НачОст в запросе ты никакого умножения не сделаешь. А на функцию Сумма не наложишь условия чтобы она считала начальный остаток. И?
4 Ковычки
 
16.09.09
18:18
(2) а кто сказал, что результат будет в запросе
5 twilight5023
 
16.09.09
18:20
(4) В условии зачачи сказано, что требуется получить "результат умножения в запросе". При обходе группировок зачастую сложновато что-то подсчитывать, в случае если требуется получить итоги по группам.
6 МихаилМ
 
16.09.09
19:00
то(0)
решение красивое.
НО
для SQL версии не эффективное тк подобное умножение 1с77 будет выполнять построчно на клиенте а затем агрегировать . те объем пересылаемой выборки будет
на порядки больше.
7 Fragster
 
гуру
16.09.09
19:04
Сумма(Выразить(9.9 как Число 10,3)) или какой там синтаксис...
8 Fragster
 
гуру
16.09.09
19:05
а, это 7... тогда пас.
Закон Брукера: Даже маленькая практика стоит большой теории.