|
Неоднозначная точность расчета поля в запросе | ☑ | ||
---|---|---|---|---|
0
geek
30.01.12
✎
10:44
|
Добрый день!
Я уже не знаю что мне делать, затуп жуткий. Существует такой сложный запрос из СКД: ВЫБРАТЬ ОстаткиПоДоговорамДляРаспределенияОстатки.Организация, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Владелец, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Дата, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаНачалаРабот КАК ДатаНачалаРабот, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаОкончанияРабот КАК ДатаОкончанияРабот, ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток КАК СуммаОстаток, ВЫБОР КОГДА ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток <> 0 ТОГДА ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток / ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток ИНАЧЕ 0 КОНЕЦ КАК Коэффициент ИЗ РегистрНакопления.ОстаткиПоДоговорамДляРаспределения.Остатки(&ДатаПо, ) КАК ОстаткиПоДоговорамДляРаспределенияОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиПоДоговорамДляРаспределения.Остатки(&ДатаПо, ) КАК ОстаткиПоДоговорамДляРаспределенияОстатки1 ПО ОстаткиПоДоговорамДляРаспределенияОстатки.Организация = ОстаткиПоДоговорамДляРаспределенияОстатки1.Организация СГРУППИРОВАТЬ ПО ОстаткиПоДоговорамДляРаспределенияОстатки.Организация, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Владелец, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.Дата, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаНачалаРабот, ОстаткиПоДоговорамДляРаспределенияОстатки.ДоговорКонтрагента.ДатаОкончанияРабот, ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток, ВЫБОР КОГДА ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток <> 0 ТОГДА ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток / ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток ИНАЧЕ 0 КОНЕЦ Вычисляемое поле Коэффициент расчитывается странно. К примеру, в ноябре оно считается с 10 знаками после запятой, а в декабре с 5-ю. Хотя числе везде выгружаются с одинаковой точностью. Как в запросе принудительно выставить Формат()? Менял в настройках СКД (как в Наборе данных, так и в Настройках), подставляет цифру с 5 знаками точности, остальное добивает 0-ми. |
|||
1
PR
30.01.12
✎
10:45
|
ВЫРАЗИТЬ
|
|||
2
geek
30.01.12
✎
10:46
|
Во как вставилось:(
|
|||
3
geek
30.01.12
✎
10:46
|
(1) Пробовал, не помогает
|
|||
4
PR
30.01.12
✎
10:46
|
(3) Неудачник
|
|||
5
geek
30.01.12
✎
10:47
|
Хотя может не так как нужно писал ВЫРАЗИТЬ()
ВЫРАЗИТЬ(ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток/ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток, ЧИСЛО(15,9)) |
|||
6
geek
30.01.12
✎
10:47
|
(4) Да не говори:(
|
|||
7
PR
30.01.12
✎
10:50
|
(5) ВЫРАЗИТЬ для числа округляет, а не добивает нулями. Число — оно и есть число, его нельзя добить нулями, иначе получится строка.
|
|||
8
geek
30.01.12
✎
10:52
|
(7) В смысле, я правильно написал? =)
|
|||
9
PR
30.01.12
✎
10:53
|
(8) Если тебя нужно округлить до восьмого знака, то да.
Остальное делается условным оформлением. |
|||
10
Ненавижу 1С
гуру
30.01.12
✎
10:53
|
ВЫРАЗИТЬ(ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток/ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток КАК ЧИСЛО(15,9))
но если значащих цифр нет, то это ничего не даст, форматируйте уже в СКД |
|||
11
geek
30.01.12
✎
10:57
|
Там не запятая, а "КАК".
ВЫРАЗИТЬ(ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток/ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток КАК ЧИСЛО(15,9)) (9) Нет, у меня в декабре коэффициент рассчитывается с 6-ю знаками после запятой. 0,004818 - к примеру. Мне надо чтобы хотя бы не 6, а девять знаков. Очевидно, что 2 350 500 / 487 760 411,94 = 0,0048189642755208, а запрос мне выдает 0,004818 |
|||
12
Serg_1960
30.01.12
✎
10:58
|
(старая шутка) ЧЯДН?
Сообщить(13.1/13); // в окне сообщений число 1,007692307692307692307692307692307692 Запрос = Новый Запрос("ВЫБРАТЬ 13.1 / 13 КАК Результат"); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Сообщить(Выборка.Результат); // в окне сообщений число 1,007692307692307692307692307692307692 Возврат; |
|||
13
geek
30.01.12
✎
10:58
|
(10) В СКД есть механизм, где можно было бы рассчитать (поделить) два получившихся поля (результат запрос) и вывести форматированный результат в третье?
|
|||
14
geek
30.01.12
✎
11:01
|
(12) Простите, мне, вероятно, не понять юмор.
|
|||
15
Ненавижу 1С
гуру
30.01.12
✎
11:03
|
(13) формат есть у полей СКД
|
|||
16
hhhh
30.01.12
✎
11:05
|
(14) а зачем вам 9 знаков? Вы что ФобосГРунт запускаете? ВЫ знаете, что если налоговая у вас найдет в расчетах такой коэффициент, будете штраф платить?
|
|||
17
geek
30.01.12
✎
11:10
|
(15) Я же писал в первом посте, что менял Оформление в Наборе данных. Не помогает. Добивает число нулями. К примеру:
0,004818 = 0,004818000 |
|||
18
Ненавижу 1С
гуру
30.01.12
✎
11:16
|
(17) а в консоли сколько выдает?
|
|||
19
geek
30.01.12
✎
11:24
|
(18) Консоли запросов?
Выдает 0,004818. Хотя калькулятор показывает цифру 0,0048189642755208 Странно, но консоль за предыдущие месяцы выдает цифры с детализацией 6 чисел после запятой, а в отчет попадают цифры детальные. 1С, бл*дь надо мной издевается :( Или это первые признаки сумасшествия. |
|||
20
geek
30.01.12
✎
11:33
|
Зайдем с другой стороны. Есть код в модуле ФормыОтчета СКД.
Процедура ДействияФормыДействие(Кнопка) ЭКСПОРТ ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ПараметрРасчетнаяДатаКонецГраницы = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период")); ПараметрРасчетнаяДатаКонецГраницы.Значение = Новый Граница(КонецДня(ЭлементыФормы.РасчетнаяДата.Значение), ВидГраницы.Включая); ПараметрРасчетнаяДатаКонецГраницы.Использование = Истина; ПараметрРасчетнаяДатаКонецГраницы = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоПериода")); ПараметрРасчетнаяДатаКонецГраницы.Значение = Новый Граница(НачалоМесяца(ЭлементыФормы.РасчетнаяДатаНачало.Значение), ВидГраницы.Включая); ПараметрРасчетнаяДатаКонецГраницы.Использование = Истина; ПараметрРасчетнаяДатаКонецГраницы = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецПериода")); ПараметрРасчетнаяДатаКонецГраницы.Значение = Новый Граница(КонецДня(ЭлементыФормы.РасчетнаяДата.Значение), ВидГраницы.Включая); ПараметрРасчетнаяДатаКонецГраницы.Использование = Истина; Настройки = КомпоновщикНастроек.Настройки; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки, ); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки,Истина); ЭлементыФормы.Результат.Очистить(); ДокументРезультат = ЭлементыФормы.Результат; ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); Сообщить(ТипЗнч(МакетКомпоновки)); ДокументРезультат.Показать(); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры Можно ли обратиться каким-то образом к процессору компоновки данных или еще чему-то и откорректировать данные перед методом Вывести()? |
|||
21
Serg_1960
30.01.12
✎
11:44
|
(14) Сорри. Вам, наверное, не до моих шуток сейчас :) "Округлением" в запросах можно и нужно "управлять". Третий запрос - пример для Вас:
Запрос = Новый Запрос("ВЫБРАТЬ 13.1 / 13 КАК Результат"); // максимальная точность (как она есть на самом деле) Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Сообщить(Выборка.Результат); // в окне сообщений число 1,007692307692307692307692307692307692 Запрос = Новый Запрос("ВЫБРАТЬ ВЫРАЗИТЬ(13.1 КАК ЧИСЛО(15,1)) / ВЫРАЗИТЬ(13 КАК ЧИСЛО(15,0)) КАК Результат"); // округление результата "по умолчанию" Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Сообщить(Выборка.Результат); // в окне сообщений число 1,00769231 (восемь знаков после запятой) Запрос = Новый Запрос("ВЫБРАТЬ ВЫРАЗИТЬ(13.1 КАК ЧИСЛО(15,9)) / ВЫРАЗИТЬ(13 КАК ЧИСЛО(15,9)) КАК Результат"); // Округляем так, как нам надо! Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Сообщить(Выборка.Результат); // в окне сообщений число 1,007692308 (девять знаков после запятой!) |
|||
22
geek
30.01.12
✎
11:58
|
{Форма.Форма.Форма(759)}: Ошибка при вызове метода контекста (Выполнить): Ошибка выполнения запроса: Ошибка при выполнении операции над данными:
Microsoft OLE DB Provider for SQL Server: Arithmetic overflow error converting numeric to data type numeric. HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1 О_____О |
|||
23
PR
30.01.12
✎
12:55
|
(21) Напиши в своем примере 13/13
|
|||
24
Fragster
гуру
30.01.12
✎
12:57
|
Выразить(0 как число 15,9)
|
|||
25
Ненавижу 1С
гуру
30.01.12
✎
12:58
|
SQL Server какой?
|
|||
27
geek
30.01.12
✎
13:34
|
||||
28
geek
30.01.12
✎
14:22
|
Проблему решил, всем огромное спасибо.
ВЫБОР КОГДА ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток <> 0 ТОГДА ВЫРАЗИТЬ (ОстаткиПоДоговорамДляРаспределенияОстатки.СуммаОстаток КАК ЧИСЛО(23,6)) / ВЫРАЗИТЬ (ОстаткиПоДоговорамДляРаспределенияОстатки1.СуммаОстаток КАК ЧИСЛО(23,6)) ИНАЧЕ 0 КОНЕЦ КАК Коэффициент Вот. Если оформить так, тогда на выходе мы число с, кажется, 15-ю знаками после запятой. Через формат в СКД я обрезал его до 10-ти знаков. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |