如何在开放式SQL中舍入浮点数?

2020-08-12 16:12发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我可以知道如何在开放SQL中舍入浮点数吗?

下面的SQL不起作用...请帮助,谢谢!

选择回合((cast(lvar1 as FLTP)/cast(lvar2 as FLTP)),6)...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我可以知道如何在开放SQL中舍入浮点数吗?

下面的SQL不起作用...请帮助,谢谢!

选择回合((cast(lvar1 as FLTP)/cast(lvar2 as FLTP)),6)...

付费偷看设置
发送
4条回答
1楼 · 2020-08-12 16:38.采纳回答

对于浮点数(FLTP)类型的值,Open SQL函数回合不可用。

此外,对于Open SQL,整数和整数不能除(运算符'/')。 小数点,但用于浮点数。 但是,FLTP值不能转换为DEC十进制,实际上不能转换为任何其他值类型(<< CAST表达式应与平台无关。不允许将类型从FLTP转换为其他数字类型,因为结果

因此,对于带有小数位的小数,需要使用函数DIVISION代替,这也将处理四舍五入的小数。 (函数DIV仅可用于不带小数位的数字值。)

因此,这是您必须要做的:

 select除法(lvar1,lvar2、6)..  。
 

更多信息:

自ABAP 7.50+起,就有用于数字值的Open SQL函数,例如舍入函数和除法函数:

不过,SQL DIVISION函数仅自7.51以后才可用于Open SQL。
SAP在7.50中"仅"将其引入ABAP CDS。

用法:

  • ROUND(expr,pos)
    expr:INT1,INT2,INT4,INT8,DEC,CURR和QUAN
    pos:INT1 ,INT2和INT4
  • 分区(expr1,expr2,dec)
    expr1,expr2:INT1,INT2,INT4,INT8,DEC,CURR和QUAN
    dec:文字或常量主机 ABAP类型b,s,i,int8的变量大于或等于0且不大于6的最大值和exp2的长度加上exp1的小数位数加1
    结果:

示例:

 SELECT round(zwert,1)AS zwert," CURR 13,2
        round(zmeng,2)AS zmeng," QUAN 13,3
        round(umvkz,-1)AS umvkz," DEC 5,0
        round(stcur,4)AS stcur," DEC 9,5
 " round(posnr,-2)AS posnr" NUMC =>不允许非数字数据类型;)
        round(cast(posnr as DEC(6,0)),-2)AS posnr" NUMC强制转换为DEC
 " round(umref,2)AS umref" FLTP =>不允许数据类型F
 " round(cast(umref as DEC(38,14)),2)AS umref"无法转换FLTP
   从vbap
   到表@DATA(itab)。
 

该怎么做:

a)强制转换为DEC(例如38,14或38,7之间的任何值)

将内容投放到FLTP并不会给您带来麻烦 很多选择:

我假设您是出于精度原因进行转换和舍入。 您可能希望在某些时候投入使用,因为涉及到以某种方式截断的数字时,您永远不可能做到100%精确。

您的问题的解决方案是上述DIVISION语句 :

 select除法(lvar1,lvar2、6)... 

b)在SQL/ABAP内部计算

相反,您可以从以下位置选择值: 数据库作为FLTP,然后在ABAP中执行任何必要的计算。 例如,将其转换为具有所需小数位数的十进制(DEC)或添加另一个小数并使用必要的舍入函数对其进行舍入。

"只是如何"舍入" FLTP的不同示例示例
 vardec6 = varfloat。

 vardec16 = varfloat。
 vardec6 = round(val = vardec16 dec = 6)。

 vardec16 = cl_abap_math => round_f_to_15_decs(float)
 
2楼-- · 2020-08-12 16:24

GK Goh ,现在我已经完全理解了您的问题。 我使用以下信息和编码再次更新了上面的答案,该信息和编码将为您提供帮助。

这就是您要做的:

  • 使用Open SQL DIVISION函数处理带小数的数字值(浮点数除外)
  • < li>该函数还可以定义需要舍入的小数位
  • 除法运算符'/'仅可用于FLTP,而舍入和强制转换不能用于FLTP
 select除法(lvar1,lvar2、6)... 
3楼-- · 2020-08-12 16:24

迈克尔,您好,非常感谢您的出色建议。

不幸的是,我使用的是较旧的SAP ABAP(版本7.50),而针对abap版本7.50的Open SQL不支持SQL DIVISION函数。

https://help.sap.com/doc/ abapdocu_750_index_htm/7.50/zh-CN/abensql_functions_numeric.htm

另一方面,也不支持从FLTP到DEC的转换。

https://help.sap.com/doc/ abapdocu_751_index_htm/7.51/zh-cn/abensql_cast.htm

谢谢。

4楼-- · 2020-08-12 16:27

GK Goh ,哦,不。 是的,您目前不走运。 我只需要仔细检查一下,但SQL DIVISION函数可用于7.51+中的Open SQL。 SAP在7.50中"仅"将其引入了ABAP CDS。

并且在任何版本上都根本不支持从FLTP到DEC的转换(<< CAST表达式应与平台无关。不允许将类型从FLTP转换为其他数字类型,因为结果是

所以现在唯一的选择就是等待下一次升级到7.51,或者使用这些功能实现CDS视图,或者在之后的ABAP中实现该逻辑。 您从数据库中选择了"原始"数据。

一周热门 更多>