ABAP 增强中加减乘除计算结果不准(固定点计算)

博客探讨了在ABAP编程中遇到的计算结果不正确的问题,特别是在标准程序的增强中。文章通过示例代码展示了未启用固定点计算时,数值计算可能出现的异常。解决方案包括使用勾选了固定点计算的自定义函数进行计算,以及检查程序属性中的固定点计算设置。

问题背景
在很多标准程序debug的时候经常发现加减乘除的计算结果不对,比如5+9.5 = 100 这个计算想来想去都不知道什么原因,然后我要在增强中写个计算的校验,怎么写计算结果都不对。我该如何解决?

了解固定点计算
按照官方的解释:虽然很详细但是没怎么看懂。
在这里插入图片描述
不过我们ABAPer 一般创建程序的时候都会打上这个勾:
在这里插入图片描述
例子
如果不勾选这个勾,看看计算结果会变成什么样子:
在这里插入图片描述
代码实例

"不勾选固定点计算

DATA:lv_num1 TYPE char4,
     lv_num2 TYPE char4,
     lv_res  TYPE char4.

"计算除法
lv_num1 = '9'.
lv_num2 = '3'.
lv_res = lv_num1 / lv_num2 .
WRITE:/ lv_num1 && '/' && lv_num2 && '=' &&     lv_res.

"计算除法
lv_num1 = '9'.
lv_num2 = '3.0'.
lv_res = lv_num1 / lv_num2 .
WRITE:/ lv_num1 && '/' && lv_num2 && '=' &&     lv_res.


"计算 5 + 95
lv_num1 = '5'.
lv_num2 = '95'.
lv_res = lv_num1 + lv_num2 .
WRITE:/ lv_num1 && '+' && lv_num2 && '=' &&     lv_res.

"计算  5+ 9.5
CLEAR:lv_num1, lv_num2,lv_res.
lv_num1 = '5'.
lv_num2 = '9.05'.
lv_res = lv_num1 + lv_num2 .
WRITE:/ lv_num1 && '+' && lv_num2 && '=' &&     lv_res.

CLEAR:lv_num1, lv_num2,lv_res.
lv_num1 = '5'.
lv_num2 = '9.5'.
lv_res = lv_num1 + lv_num2 .
WRITE:/ lv_num1 && '+' && lv_num2 && '=' &&     lv_res.

"调用函数计算
CLEAR:lv_num1, lv_num2,lv_res.
lv_num1 = '5'.
lv_num2 = '9.5'.
CALL FUNCTION 'ZFM_SD_ADD'  "自定义的函数:里面代码逻辑就是  加法计算
  EXPORTING
    i_zyfk   = lv_num1
    i_ztlk   = lv_num2
    i_zdhk   = '0'
    i_zazjgk = '0'
    i_zsbtyk = '0'
    i_zzbk   = '0'
  IMPORTING
    e_he     = lv_res.
WRITE:/'调用函数' && lv_num1 && '+' && lv_num2 && '=' &&     lv_res.

然后看执行结果
在这里插入图片描述

发现其中的结果有时候对,有时候不对。
而我如果调用了勾选固定点计算的函数的计算结果是对的

结论总结
1.标准程序(未勾选固定点计算的标准程序)增强中如果有计算结果不对的情况,请调用自定义的函数进行计算。
2.如果发现自定义报表的计算结果不对,可以检查下程序属性中的固定点计算 的勾,有没有勾上。

ABAP中使用BAdI增强MRP计算日期时,有以下注意事项: #### 1. 兼容性和稳定性 - **系统版本兼容性**:同的SAP系统版本对BAdI的支持和实现可能存在差异。在进行增强开发前,需要确认所使用的BAdI在当前系统版本中是可用的,并且其接口定义没有发生变化。例如,某些新的功能可能只在较新的系统版本中提供,而旧版本可能支持。 - **标准功能影响**:BAdI的增强代码可能会影响标准的MRP计算逻辑。在开发和测试过程中,需要进行充分的测试,确保增强代码会破坏原有的标准功能。例如,修改MRP计算日期可能会影响到物料的需求计划、采购计划等。 #### 2. 代码质量和性能 - **代码注释和文档**:编写清晰的代码注释和文档是非常重要的。在定义变量、内表、工作区时,应注释其含义或用途,方便后续的维护和理解。例如: ```abap DATA: lv_mrp_date TYPE sy-datum. " MRP计算日期 ``` - **性能优化**:增强代码的性能会直接影响系统的整体性能。在编写代码时,应避免使用复杂的逻辑和低效的算法。例如,尽量减少数据库查询次数,避免在循环中进行大量的数据库操作。 #### 3. 激活和传输 - **激活顺序**:在激活BAdI实现时,需要注意激活的顺序。如果存在多个BAdI实现,激活顺序可能会影响最终的执行结果。 - **传输管理**:在将增强代码传输到生产系统时,需要遵循严格的传输管理流程。确保传输的代码经过充分的测试,并且会对生产系统造成影响。 #### 4. 错误处理 - **异常情况处理**:增强代码中应包含适当的错误处理逻辑,以应对可能出现的异常情况。例如,当修改MRP计算日期时,如果日期格式正确或超出了允许的范围,应给出明确的错误提示。 ```abap TRY. " 修改MRP计算日期的逻辑 CATCH cx_sy_datum_invalid. MESSAGE '日期格式正确' TYPE 'E'. ENDTRY. ``` #### 5. 监控和维护 - **日志记录**:在增强代码中添加日志记录功能,方便后续的问题排查和监控。例如,记录修改前后的MRP计算日期,以及修改的原因。 - **定期检查**:定期检查增强代码的运行情况,确保其仍然符合业务需求。随着系统的升级和业务的变化,可能需要对增强代码进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值