SAPфорум.RU
https://sapboard.ru/forum/

DATA(var) - неприятный сюрприз
https://sapboard.ru/forum/viewtopic.php?f=13&t=92078
Страница 1 из 1

Автор:  Николай Рыжов [ Вт, дек 22 2015, 17:57 ]
Заголовок сообщения:  DATA(var) - неприятный сюрприз

Недавно, ну как недавно пяти лет еще не прошло, в языке появились автоматические переменные, объявляемые как DATA(var) = ...
Я обрадовался, наконец то можно объявлять по месту, держись, C#, мы тебя догоним.
Правда, все оказалось "как обычно", эта та же переменная, что и просто DATA var, scope ее ровно такой же здоровенный, никаких локальных в пределах цикла переменных нет. Синтаксический сахар, ну да и то ладно, используем.

А вот сегодня пишут мне - у тебя расчет какой-то странный (считается банальщина - кол-во * цену, суммируется в разном порядке). И тут возникает прикол, который можно продемонстрировать на этом:

data x type p DECIMALS 2.
data y type p DECIMALS 3.
x = '1.44'.
y = '1.445'.
data(z) = x * y.

Какого типа переменная Z? C# и прочие хаскели подсказывают нам, что должен быть p decimal 5. Хелп самого абапа говорит - "The date type of the variable is determined by the operand type. It must be possible to derive this type statically in full.". Ну что, вроде статически все определимо, предупреждений нет, проблем быть не должно.

Фиг!
Z = 2 и тип Z = P DECIMALS 0.
Произошел самый что ни на есть каст в целое, с округлением.
Я, честно говоря, в шоке. В тот момент, когда другие языки уже окучивают по полной шаблоны/ФП/ПМ и прочее и прочее, нам предлагается какое-то студенческое поделие.

PS. На предыдущих страницах не нашел вроде...

Автор:  Sam Stone [ Ср, дек 23 2015, 10:29 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз  Тема решена

Однако...
Можно закостылить, засунув умножение в EXACT :lol: Это если заранее не объявлять переменную.

Автор:  UKY [ Чт, дек 24 2015, 04:38 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

А можно ещё написать так:
Code:
data(z) = CONV wrbtr( x * y ).


Но вообще да, подлянка. Спасибо, что поделились.

Автор:  Николай Рыжов [ Чт, дек 24 2015, 22:38 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

Кстати, уровень исполнения можно даже и по хелпу увидеть:

The date type of the variable is determined by the operand type. It must be possible to derive this type statically in full.

Знаю, знаю, что помощь и код пишут совершенно разные люди. Но это вот всё символизирует.

Автор:  Sam Stone [ Пт, дек 25 2015, 16:07 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

К слову о подлянках... Вспомнил случай. В выражении вида x = menge * abs( wrbtr ) (где х определен ранее), словил от abs() округление до целого :shock:

Автор:  dedzinatajs [ Пн, фев 01 2016, 20:38 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

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

Автор:  konobiser [ Чт, ноя 23 2017, 10:21 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

Sam Stone написал(а):
К слову о подлянках... Вспомнил случай. В выражении вида x = menge * abs( wrbtr ) (где х определен ранее), словил от abs() округление до целого :shock:
Нельзя ли подробнее?
Какого типа объявлена Х,
какого menge?

Я пробую, не округляется ничего.

Автор:  chumpa [ Чт, ноя 23 2017, 11:49 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

строители велосипедов решили вывод типов сделать "как менеджер сказал".

Автор:  ghost [ Чт, ноя 23 2017, 12:28 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

Думаю вот эта оговорка объясняет такую "не совсем стандартную" реализацию инлайн объявлений (без EXACT)
Цитата:
If more than one equally valid operand type is possible in the same declaration position, the recommended preferred data type is generally used.

видно в вашем случае как раз это и был рекомендованный тип :gigi:

Автор:  Kengur [ Чт, ноя 23 2017, 12:39 ]
Заголовок сообщения:  Re: DATA(var) - неприятный сюрприз

Работа с целочисленными значениями - рекомендации лучших собаководов.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/