|
Округление в проценте | ☑ | ||
---|---|---|---|---|
0
Syhov21rus
15.03.17
✎
09:35
|
Здравствуйте, возник такой вопрос, в запросе определяется доля количества запчастей на подразделение в процентах и записывается в регистр сведений в формате длина 5, точность 2. Появляются записи например на два подразделения, на первое 78.125%, на второе 21.875%. При записи автоматически округляется до 78.13 и 21.88 соответственно, в итоге имеем 100.01%. Сами понимате в отчете будет погрешность. Как можно правильо организовать округление. Есть такое правило, если перед 5 стоит четное, то округляется в большую сторону, если нечетное то в меньшую. Модно вручную, но обработка и так долгая.
|
|||
1
Fragster
гуру
15.03.17
✎
09:37
|
считать проценты не запросом, а выражением ресурса СКД, тогда при правильном выражении итогов будет 78.13% и 21.88%, но в общих итогах будет 100%
|
|||
2
Syhov21rus
15.03.17
✎
09:46
|
Изначально в регистр сведений заносится обработкой, а отчет формируется через ПостроительОтчета, СКД не подходит для этого отчета
|
|||
3
patria0muerte
15.03.17
✎
10:09
|
(2) Почему решил что не подходит?
|
|||
4
Naf2017
15.03.17
✎
10:19
|
а если на три и поровну?
33.33% 33.33% 33.33% еще сложнее |
|||
5
Syhov21rus
15.03.17
✎
10:30
|
(3) Очень много нюансов
|
|||
6
Jokero
15.03.17
✎
10:31
|
(0) показывай пользователю итог округленный до целых.
|
|||
7
Syhov21rus
15.03.17
✎
10:32
|
(4) Вероятность такого случая очень мала, думую даже не будет ее
|
|||
8
Jokero
15.03.17
✎
10:35
|
(6) + имхо, в регистрах лучше хранить конкретные цифры, а проценты высчитывать при формировании отчета.
|
|||
9
Aleksey
15.03.17
✎
10:36
|
Хранить с избыточной точностью
Т.е. если нужно 2 знака после запятой, то хранить с точностью 3 знака после запятой |
|||
10
Fragster
гуру
15.03.17
✎
10:51
|
(2) если принципиально на построителе, то выгружай в ТЗ, считай показатель "процент" руками пропорциональным распределением суммы показателя "100" по уменьшающейся базе распределения (или как там оно по научному называется), как-то так:
БазаРаспределения = ТЗ.Итог(Сумма); СуммаРаспределения = 100; Для каждого Стр Из ТЗ Цикл Стр.Процент = Окр(СуммаРаспределения * Стр.Сумма/БазаРаспределения , 2); СуммаРаспределения = СуммаРаспределения - Стр.Процент; БазаРаспределения = БазаРаспределения - Стр.Сумма; КонецЦикла; |
|||
11
Fragster
гуру
15.03.17
✎
10:51
|
а потом запихивай в качестве источника в построитель обратно
|
|||
12
тарам пам пам
15.03.17
✎
11:00
|
(0) ну и добавь там, где у тебя записи в регистре формируются, отнесение этих 0,01% на какую-либо строку (обычно относят на бОльшую строку для уменьшения погрешности).
|
|||
13
Syhov21rus
15.03.17
✎
11:57
|
(8) (9) хорошие предложения надо обсудить с руководством
(10) быстродействие скорей всего пострадает, не совсем понятно как это будет работать, несколько тысяч позиций, для каждой номенклатуры пересчитывать отдельно? Номенклатура1 Подразделение1 45,55% Номенклатура1 Подразделение2 20% Номенклатура1 Подразделение3 34,45% Номенклатура2 ........ |
|||
14
Fragster
гуру
15.03.17
✎
13:29
|
(13) несколько тысяч итераций цикла из (10) будет выполняться незаметно для глаза. А по другому ты не решишь проблему.
|
|||
15
Fragster
гуру
15.03.17
✎
13:30
|
(13)
>для каждой номенклатуры пересчитывать отдельно? если такой отчет - то да. тут итоги по номенклатуре и обход по группировкам помогут |
|||
16
2dolist
15.03.17
✎
14:11
|
% -> o|o -> (|) -> O
|
|||
17
Naf2017
15.03.17
✎
15:35
|
запросом:
ВЫБРАТЬ ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.Склад, ТоварыНаСкладахОстатки.КоличествоОстаток ПОМЕСТИТЬ ТЗ ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки ГДЕ ТоварыНаСкладахОстатки.КоличествоОстаток > 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТЗ.Номенклатура, СУММА(ТЗ.КоличествоОстаток) КАК КоличествоОстаток ПОМЕСТИТЬ Сводная ИЗ ТЗ КАК ТЗ СГРУППИРОВАТЬ ПО ТЗ.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТЗ.Номенклатура КАК Номенклатура, ТЗ.Склад, ТЗ.КоличествоОстаток / Сводная.КоличествоОстаток * 100 КАК Процент ПОМЕСТИТЬ Проценты ИЗ ТЗ КАК ТЗ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сводная КАК Сводная ПО ТЗ.Номенклатура = Сводная.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Проценты.Номенклатура КАК Номенклатура, Проценты.Склад КАК Склад, ВЫРАЗИТЬ(СУММА(Проценты1.Процент) КАК ЧИСЛО(10, 2)) КАК Процент1 ПОМЕСТИТЬ Накопительно ИЗ Проценты КАК Проценты ЛЕВОЕ СОЕДИНЕНИЕ Проценты КАК Проценты1 ПО Проценты.Номенклатура = Проценты1.Номенклатура И Проценты.Склад >= Проценты1.Склад СГРУППИРОВАТЬ ПО Проценты.Номенклатура, Проценты.Склад ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Накопительно.Номенклатура КАК Номенклатура, Накопительно.Склад КАК Склад, Накопительно.Процент1 - ЕСТЬNULL(МАКСИМУМ(Накопительно1.Процент1), 0) КАК Процент, ТЗ.КоличествоОстаток / Сводная.КоличествоОстаток * 100 КАК ПроцентТочно ИЗ Накопительно КАК Накопительно ЛЕВОЕ СОЕДИНЕНИЕ Накопительно КАК Накопительно1 ПО Накопительно.Номенклатура = Накопительно1.Номенклатура И Накопительно.Склад > Накопительно1.Склад ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ ПО Накопительно.Номенклатура = ТЗ.Номенклатура И Накопительно.Склад = ТЗ.Склад ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сводная КАК Сводная ПО Накопительно.Номенклатура = Сводная.Номенклатура СГРУППИРОВАТЬ ПО Накопительно.Номенклатура, Накопительно.Склад, Накопительно.Процент1, ТЗ.КоличествоОстаток / Сводная.КоличествоОстаток * 100 УПОРЯДОЧИТЬ ПО Номенклатура, Склад |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |