|
Распределение сумм в запросе пропорционально результатам выборки | ☑ | ||
---|---|---|---|---|
0
Nikitos
22.06.12
✎
14:37
|
День добрый!
Сдается мне что видел такое, но не нашел. Собственно говоря, необходимо распределить некую сумму пропорционально некому набору сумм запросом. Как-то вот такю |
|||
1
mikecool
22.06.12
✎
14:38
|
в СКД можно вроде
|
|||
2
Nikitos
22.06.12
✎
14:38
|
а вот как?
|
|||
3
andrewks
22.06.12
✎
14:40
|
можно и без СКД. что мешает найти сумму, выбрать и умножить?
|
|||
4
shuhard
22.06.12
✎
14:42
|
(0)
(1) неудачники откройте в типовой Валовую прибыль |
|||
5
Nikitos
22.06.12
✎
14:42
|
Относительно многое. Одно из основных - как и куда деть остаток?
|
|||
6
andrewks
22.06.12
✎
14:43
|
(5) какой остаток?
|
|||
7
Nikitos
22.06.12
✎
14:45
|
(6) например нужно поровну разделить 10 рублей на 3 части...
|
|||
8
shuhard
22.06.12
✎
14:47
|
(7) исключи из распределения первую запись и повесь на неё остаток
ладно бы сейчас был 2005 год и нужны бы были подзаппросы, но не сделать этого через ВТ ? |
|||
9
Maxus43
22.06.12
✎
14:47
|
ЦенаОбщая*КоличествоОбщее/КоличествоЧастное
так в запросах постоянно делают в типовых даже |
|||
10
Jaap Vduul
22.06.12
✎
14:47
|
(7)А если бы не запросом, то куда девал?
|
|||
11
Nikitos
22.06.12
✎
14:51
|
(9) :)
ЦенаОбщая - 10 руб. КоличествоОбщее - 9 КоличествоЧастное - 3 итого цена конкретной 1 штуки - 30 руб. |
|||
12
Nikitos
22.06.12
✎
14:51
|
(10) куда-нибудь кидал
|
|||
13
Maxus43
22.06.12
✎
14:57
|
(11) ну ты понял смысл) в пятницу мозг плывёт уж
|
|||
14
Nikitos
22.06.12
✎
14:59
|
(13) все равно надо как-то последнюю копейку пристраивать
|
|||
15
Nikitos
22.06.12
✎
15:00
|
(8) ну поделись маленько опытом... Дай, так сказать, мастер класс
|
|||
16
Jaap Vduul
22.06.12
✎
15:02
|
(12)Если в запросе строки можно однозначно идентифицировать, то кидай так же.
|
|||
17
Nikitos
22.06.12
✎
15:04
|
(16) не всегда возможно. В том и проблема.
|
|||
18
spu79
22.06.12
✎
15:06
|
а функции Минимум и Максимум в запросах отменили?
|
|||
19
shuhard
22.06.12
✎
15:06
|
(17)[не всегда возможно. В том и проблема.]
сказки пример в студию |
|||
20
andrewks
22.06.12
✎
15:07
|
(17) почему это не всегда? что мешает добавить нужные поля?
|
|||
21
Jaap Vduul
22.06.12
✎
15:08
|
||||
22
Nikitos
22.06.12
✎
15:12
|
ВЫБРАТЬ
ЗаказПоставщику.НомерВходящегоДокумента КАК НомерМашины, ЗаказПоставщику.р_КомплектацияМашины КАК КомплектацияМашины, ЗаказПоставщику.Ссылка КАК Ссылка, ЗаказПоставщикуТовары.Номенклатура, ЗаказПоставщикуТовары.ХарактеристикаНоменклатуры, ЗаказПоставщикуТовары.Количество, ЗаказПоставщикуТовары.Цена, ЗаказПоставщикуТовары.Количество * ЗаказПоставщикуТовары.Цена КАК Сумма, ЗаказПоставщикуТовары.Заказ.Ссылка, ЗаказПоставщикуТовары.Заказ.Дата КАК ЗаказДата, ЗаказПоставщикуТовары.Заказ.ВалютаДокумента, ЗаказПоставщику.р_КомплектацияМашины.СтоимостьДоставки ИЗ Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК ЗаказПоставщику ПО ЗаказПоставщикуТовары.Ссылка = ЗаказПоставщику.Ссылка ГДЕ ЗаказПоставщику.Проведен = ИСТИНА И ЗаказПоставщику.НомерВходящегоДокумента В(&НомерВходящегоДокумента) Стоимость доставки нужно распределить пропорционально сумме |
|||
23
andrewks
22.06.12
✎
15:13
|
каков бюджет?
|
|||
24
Ненавижу 1С
гуру
22.06.12
✎
15:13
|
(20) ну если нет уникальности, то не всегда
|
|||
25
Jaap Vduul
22.06.12
✎
15:14
|
Наверняка у р_КомплектацияМашины есть НомерСтроки
|
|||
26
Nikitos
22.06.12
✎
15:14
|
(25) нет. Это всего лишь поле с некой цифрой совершенно в другом документе и не более того
|
|||
27
andrewks
22.06.12
✎
15:15
|
(24) с тебя пример
|
|||
28
ssh2006
22.06.12
✎
15:16
|
(26) в ТЧ товары есть НомерСтроки. Корректируй первую или последнюю строку
|
|||
29
Nikitos
22.06.12
✎
15:19
|
(28) опять же нет. В этой ТЧ присутствует обычно несколько р_КомплектацияМашины
|
|||
30
shuhard
22.06.12
✎
15:20
|
(29) да пофигу номер строки,
набор полей выборки образует первичный ключ |
|||
31
Ненавижу 1С
гуру
22.06.12
✎
15:20
|
(27)
пронумеруй в запросе таблицу: Поле1 "Вася" "Вася" "Вася" |
|||
32
Nikitos
22.06.12
✎
15:21
|
(30) и?
|
|||
33
ssh2006
22.06.12
✎
15:21
|
(29) в ТЧ всегда есть НомерСтроки. р_КомплектацияМашины - это у тебя реквизит документа
|
|||
34
Ненавижу 1С
гуру
22.06.12
✎
15:22
|
(32) если есть уникальность можно пронумеровать
|
|||
35
Nikitos
22.06.12
✎
15:23
|
(33) не понимаю я что-то по вашему...
|
|||
36
m-serg74
22.06.12
✎
15:24
|
что то не пойму чего с распределения съехали на нумерацию?)))
|
|||
37
ssh2006
22.06.12
✎
15:24
|
(35) в ТЧ всегда есть НомерСтроки.
|
|||
38
Nikitos
22.06.12
✎
15:25
|
(37) при чем здесь вообще НомерСтроки??
|
|||
39
Ненавижу 1С
гуру
22.06.12
✎
15:26
|
(36) нумерация позволяет делать красивое распределение
|
|||
40
ssh2006
22.06.12
✎
15:28
|
ВЫБРАТЬ
"Вася" КАК Поле1 ПОМЕСТИТЬ Таб ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Вася" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Вася" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 1 КАК Номер ПОМЕСТИТЬ ТабНомера ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ Таб.Поле1, ТабНомера.Номер ИЗ Таб КАК Таб, ТабНомера КАК ТабНомера |
|||
41
Nikitos
22.06.12
✎
15:29
|
(39) ну не понимаю я как. Ступор какой-то
|
|||
42
m-serg74
22.06.12
✎
15:29
|
(40) ты Гений)))
|
|||
43
m-serg74
22.06.12
✎
15:29
|
(39) мне тоже интересно может пригодится...
|
|||
44
andrewks
22.06.12
✎
15:30
|
(31) если у идентичных строк будет одинаковый номер - это не скажется на распределении
|
|||
45
andrewks
22.06.12
✎
15:32
|
(40) бугага
|
|||
46
Ненавижу 1С
гуру
22.06.12
✎
15:33
|
(44) отмазался ))
|
|||
47
Ненавижу 1С
гуру
22.06.12
✎
15:33
|
(40) бред какой-то
|
|||
48
ssh2006
22.06.12
✎
15:34
|
(47) Вася пронумерован))
|
|||
49
andrewks
22.06.12
✎
15:34
|
(46) ага )
(47) почему? решение частного случая. результат-то налицо :) |
|||
50
Nikitos
22.06.12
✎
15:46
|
круче всех выступил (8), но никто так ничего и не смог сказать внятного
|
|||
51
shuhard
22.06.12
✎
15:48
|
(50) топик закрыт,
накопишь денег - заходи |
|||
55
andrewks
22.06.12
✎
16:00
|
(50) неужели ты так и ничего не понял?
|
|||
56
Nikitos
22.06.12
✎
16:03
|
(55) да. Это так
|
|||
57
ptiz
22.06.12
✎
16:04
|
ВЫБРАТЬ
"А" КАК Поле1, 1 КАК К ПОМЕСТИТЬ ТЗКоэффициентов ОБЪЕДИНИТЬ ВЫБРАТЬ "Б", 1 ОБЪЕДИНИТЬ ВЫБРАТЬ "В", 1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(ТЗКоэффициентов.К) КАК СуммаК ПОМЕСТИТЬ ТЗПолнаяСуммаК ИЗ ТЗКоэффициентов КАК ТЗКоэффициентов ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТЗКоэффициентов.Поле1, ВЫРАЗИТЬ(ТЗКоэффициентов.К / ТЗПолнаяСумма.СуммаК * &РаспределяемаяСумма КАК ЧИСЛО(10, 1)) КАК Распределено ПОМЕСТИТЬ РаспределеноПредварительно ИЗ ТЗКоэффициентов КАК ТЗКоэффициентов ЛЕВОЕ СОЕДИНЕНИЕ ТЗПолнаяСуммаК КАК ТЗПолнаяСумма ПО (ИСТИНА) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Подзапрос.Поле1, СУММА(Подзапрос.Распределено) КАК Распределено ИЗ (ВЫБРАТЬ РаспределеноПредварительно.Поле1 КАК Поле1, РаспределеноПредварительно.Распределено КАК Распределено ИЗ РаспределеноПредварительно КАК РаспределеноПредварительно ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ МАКСИМУМ(РаспределеноПредварительно.Поле1), МАКСИМУМ(Остатки.Остаток) ИЗ РаспределеноПредварительно КАК РаспределеноПредварительно ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ &РаспределяемаяСумма - СУММА(РаспределеноПредварительно.Распределено) КАК Остаток ИЗ РаспределеноПредварительно КАК РаспределеноПредварительно) КАК Остатки ПО (ИСТИНА)) КАК Подзапрос СГРУППИРОВАТЬ ПО Подзапрос.Поле1 |
|||
58
Ненавижу 1С
гуру
22.06.12
✎
16:08
|
ВЫБРАТЬ
"А" КАК Объект, 1 КАК База ПОМЕСТИТЬ Данные ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Б", 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "В", 3 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(Данные.База) КАК СуммаБазы, &Сумма / СУММА(Данные.База) КАК Коэффициент ПОМЕСТИТЬ Итог ИЗ Данные КАК Данные ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные1.Объект, Данные1.База, ЕСТЬNULL(СУММА(Данные2.База), 0) КАК БазаНакопления ПОМЕСТИТЬ ДанныеСНакоплением ИЗ Данные КАК Данные1 ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные2 ПО Данные1.Объект > Данные2.Объект СГРУППИРОВАТЬ ПО Данные1.Объект, Данные1.База ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДанныеСНакоплением.Объект, ДанныеСНакоплением.База, ВЫРАЗИТЬ((&Сумма - (ВЫРАЗИТЬ((ДанныеСНакоплением.БазаНакопления) * Итог.Коэффициент КАК ЧИСЛО(15, 2))))*ДанныеСНакоплением.База/(Итог.СуммаБазы-ДанныеСНакоплением.БазаНакопления) КАК ЧИСЛО(15,2)) КАК Результат ИЗ ДанныеСНакоплением КАК ДанныеСНакоплением, Итог КАК Итог |
|||
59
andrewks
22.06.12
✎
16:26
|
(58) накопительную ошибку округления не учитываешь
|
|||
60
andrewks
22.06.12
✎
16:30
|
на скорую руку так получается (типовые не смотрел)
|
|||
61
Ненавижу 1С
гуру
22.06.12
✎
16:32
|
(59) пример данных, где не верно
|
|||
62
andrewks
22.06.12
✎
16:34
|
(61) сумма = 150,250
|
|||
63
shuhard
22.06.12
✎
16:47
|
(60) ВТ убивают искусство подзапросов =)
|
|||
64
Ненавижу 1С
гуру
22.06.12
✎
16:49
|
(62) ВЫРАЗИТЬ((&Сумма - (ВЫРАЗИТЬ(ДанныеСНакоплением.БазаНакопления * Итог.Коэффициент КАК ЧИСЛО(15, 3)))) * ДанныеСНакоплением.База / (Итог.СуммаБазы - ДанныеСНакоплением.БазаНакопления) КАК ЧИСЛО(15, 2)) КАК Результат
|
|||
65
Ненавижу 1С
гуру
22.06.12
✎
16:50
|
(63) да уж искусство ))
|
|||
66
andrewks
22.06.12
✎
16:54
|
(64) это называется "подгон"
|
|||
67
Ненавижу 1С
гуру
22.06.12
✎
16:54
|
(66) да, оно тоже не верно
|
|||
68
Ненавижу 1С
гуру
22.06.12
✎
16:55
|
но, имхо, в (60) тоже наверное нарваться на неприятности можно
если предельно считать что база у первого 0, то толку от его исключения в отдельную таблицу? хотя хз |
|||
69
Ненавижу 1С
гуру
22.06.12
✎
16:56
|
+(68) и что-то мне говорит, что задача запросом 1С 8 не решается в общем случае
|
|||
70
Coldboy
22.06.12
✎
16:58
|
а нельзя, обработать табличную часть, типа 10 руб, есть процоциональн овсем, 10 \ количество строк, и в каждую строку записать в нужную колонку эту строчку и все?
|
|||
71
andrewks
22.06.12
✎
16:59
|
(68) select top 1 ... where Base>0
|
|||
72
Coldboy
22.06.12
✎
16:59
|
а если в запросе, то использовать, вложенные запросы?
|
|||
73
Coldboy
22.06.12
✎
17:00
|
(0) я эт тебе
|
|||
74
Ненавижу 1С
гуру
22.06.12
✎
17:03
|
(71) ну может и так, а может и нет
|
|||
75
shuhard
22.06.12
✎
17:03
|
(68) ни кто же не мешает распределить, найти максимум и выделить его
и на выделенную запись зафигачить расхождение, которое может быть и отрицательным |
|||
76
Ненавижу 1С
гуру
22.06.12
✎
17:05
|
(75) фишка в том, чтобы ошибка округления была размазана более менее равномерно по всем, а у тебя на максимальный все вешается
|
|||
77
andrewks
22.06.12
✎
17:06
|
(76) ошибка округления не может быть размазана более менее равномерно по всем, на то она и ошибка округления
|
|||
78
Ненавижу 1С
гуру
22.06.12
✎
17:08
|
(77) имел ввиду, чтобы сделать как можно меньше величину
(РасчетныйРезультат[1]-ТочныйРезультат[1])^2+...+(РасчетныйРезультат[N]-ТочныйРезультат[N])^2 |
|||
79
Coldboy
22.06.12
✎
17:09
|
(78) а вы щас о чем говорите?
|
|||
80
andrewks
22.06.12
✎
17:10
|
(78) оптимизацией решил заняться? это уже явно не на языке запросов 1с
|
|||
81
shuhard
22.06.12
✎
17:10
|
(76) в типовых вешается на максимальный
и я не вижу в этом минусов (78) ты корень извлечь забыл =) |
|||
82
andrewks
22.06.12
✎
17:12
|
(79) о дисперсии
|
|||
83
anddro
22.06.12
✎
17:33
|
Вот пример функции для распределения без остатка и равномерным распределением погрешности.
И как это сделать запросом в 1С? Функция РаспределитьЗначениеПоТаблице(Таблица, ИмяКолонкиБазы, ИмяКолонкиРезультат, Знач РаспределяемаяВеличина, Точность) БазаРаспределения = Таблица.Итог(ИмяКолонкиБазы); Для Каждого СтрокаТаблицы Из Таблица Цикл Если РаспределяемаяВеличина = 0 Тогда Прервать; КонецЕсли; Если СтрокаТаблицы[ИмяКолонкиБазы] <> 0 Тогда Распределить = Окр(РаспределяемаяВеличина / БазаРаспределения * СтрокаТаблицы[ИмяКолонкиБазы], Точность); СтрокаТаблицы[ИмяКолонкиРезультат] = Распределить; РаспределяемаяВеличина = РаспределяемаяВеличина - Распределить; БазаРаспределения = БазаРаспределения - СтрокаТаблицы[ИмяКолонкиБазы]; КонецЕсли; КонецЦикла; КонецФункции |
|||
84
shuhard
22.06.12
✎
17:36
|
(83) что - то в (57) не понятно ?
|
|||
85
andrewks
22.06.12
✎
17:37
|
(83) " и равномерным распределением погрешности" шо це таке?
|
|||
86
anddro
22.06.12
✎
17:39
|
(84) да, вся погрешность падает на первый по сортировке показатель, даже если в той строке сумма нулевая или минимальная.
(85) ты где-то там видишь вычисление погрешности? нет, но и в итоге ее не будет. |
|||
87
shuhard
22.06.12
✎
17:40
|
(86) нам это известно, вопрос о чём ?
|
|||
88
andrewks
22.06.12
✎
17:43
|
(86) 2. распределение погрешности не равномерное, просто дисперсия будет меньше. чтобы минимизировать, нужно отсортировать по базе в начале. и здесь чисто итеративный алгоритм
|
|||
89
anddro
22.06.12
✎
17:47
|
(87) о том, что так ли надо извращаться в данном случае с запросами, если у задачи есть простое решение. Или это просто пятница?
(88) да понятно, что не декларативный. Но в языке запросов это сделать гораздо сложнее и те варианты, что приведены - они более ресурсоемкие. |
|||
90
shuhard
22.06.12
✎
17:50
|
(89) это типовая задача, решаемая во множестве отчётов
и выносить её в программный цикл бессмысленно |
|||
91
Speshuric
22.06.12
✎
18:45
|
(69) Всё можно:
ВЫБРАТЬ "А" КАК Объект, 1 КАК База ПОМЕСТИТЬ Данные ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Б", 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "В", 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Г", 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Д", 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Е", 1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СУММА(Данные.База) КАК СуммаБазы ПОМЕСТИТЬ Итог ИЗ Данные КАК Данные ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные1.Объект КАК Объект, ВЫРАЗИТЬ(Данные1.База КАК ЧИСЛО(15, 2)) КАК База, ВЫРАЗИТЬ(ЕСТЬNULL(СУММА(Данные2.База), 0) КАК ЧИСЛО(15, 2)) КАК БазаНакопленная ПОМЕСТИТЬ ДанныеСНакоплением ИЗ Данные КАК Данные1 ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные2 ПО Данные1.Объект > Данные2.Объект СГРУППИРОВАТЬ ПО Данные1.Объект, Данные1.База ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Данные.Объект, Данные.База, (ВЫРАЗИТЬ(&Сумма * (Данные.БазаНакопленная + Данные.База) / Итог.СуммаБазы КАК ЧИСЛО(15, 2))) - (ВЫРАЗИТЬ(&Сумма * Данные.БазаНакопленная / Итог.СуммаБазы КАК ЧИСЛО(15, 2))) КАК РаспределеноПоБазе ИЗ Итог КАК Итог, ДанныеСНакоплением КАК Данные |
|||
92
anddro
22.06.12
✎
18:59
|
а вот это (91) уже значительно красивее, чем (57)
|
|||
93
andrewks
22.06.12
✎
21:19
|
(91) браво!
|
|||
94
Ненавижу 1С
гуру
22.06.12
✎
21:55
|
(91) точно, точно, а я все вспоминал как-же получалось то...
|
|||
95
artbear
23.06.12
✎
14:32
|
закладка1
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |