🐧 转载文章
SAP 内外码概述与转换
前人栽树,后人乘凉,作者总结的很好,把自己第一次遇到的坑基本上都提到了😭
🎏 前言
SAP 的表设计,有些字段是有内外码关系的,当我们在功能开发说明书中,写取值逻辑时,如果忽略了内外码的转换,就可能出现,逻辑写的没问题,但是就是取不到值;或者 BAPI
入参赋值没问题,但是,就是无法正确调用,这时,我们就要考虑内外码转换的问题了。
🥝 概念
在 SAP 系统中,实际已内码作为存储,外码作为显示的字段
- 外码:在系统操作界面直接查看到的值
- 内码:真正在表里存储的值
🍉 分析
我们以 PS
模块中的 WBS
字段,做一下说明
WBS
是典型的内外码转换的字段,如上图,我们使用 CJ20N
查看到的是:C/0000-034-4
可是,当我们使用存储 WBS
的表 PRSP
中查看时,我们查看到的值是:00003044
这就是典型的有内外码转换关系的字段
可是有人问了?咦,我在表里查询的时候,咋就还是前台显示的字段呢?比如如下图所示,这是为什么呢?
这实际上是 SAP 为了方便我们查看和校验,在 SE11
、SE16N
等查看透明表的事务码中,带了内外码转化的功能
如下图,当我们勾选了“存在检查转换”时,系统就会将内码转换为外码,进行显示了
是什么实现了内外码的转换?
对于 WBS
这个字段来说,是以下函数
CONVERSION_EXIT_ABPSP_INPUT
CONVERSION_EXIT_ABPSP_OUTPUT
当我们使用 SE11
等查看表时,勾选“存在检查转换”,系统会根据相应字段,取到相应的转换函数,将内码转化成外码进行显示,如下图
当然下图是 SAP 标准代码,其实没必要深入研究,截图只是为了效果展示
换句话说:在 SAP 的前台操作时,针对这类有内外码转换关系的字段,我们看到的是外码,实际上,SAP 已经在界面展示的程序中,调用了相关函数,并进行了转化。
🐷 注意事项
这里给大家分享一下,实际项目中,关于这个问题,非常容易犯错,而且经常犯错的几个点:
1. BAPI 的调用
我们在调用 BAPI
时,大多数情况下,赋值就得用内码
比如上述举例的 WBS
,在调用 WBS
相关 BAPI
时,得赋值 00003044
,而不是 C/0000-034-4
;那么这个时候,我们就需要用相关函数将外码,转化成内码,再给 BAPI
赋值
2. 写取值逻辑时,要注意取值
这个原理和 1
差不多,当我们取值的时候,如果程序直接取 "PRPS-PSPNR
",并放在内表中进行 loop
,此时,很有可能取的是一堆数字的内码。然后,接着用 "C/0000-034-4
" 等的外码值,进行相等或者不相等的判断,你测试时,会发现怎么都没法实现测试效果;万一 ABAP 顾问,和业务顾问都不了解这个点,那么,三个人也得郁闷一对半了。别问我曾经郁闷了多久。
3. BDC 和 BAPI 的区别
很多顾问在面试的时候,可能会被问到采用 BDC
和 BAPI
的方式,到底有什么区别呢?
这个内外码的转换就是区别的一种
BDC
录屏的方式,本质上就是模拟人的前台操作,那么输入值的时候,得和人操作系统一样,应该输入外码,比如WBS
,我们输入的时候就得输入外码。BAPI
调用赋值的时候,大多数时候需要用内码,也就是需要我们把外码转化成内码,再进行赋值处理。
4. 内外码转换函数的查找和测试
同样的,我们依旧以 WBS
为例,测试一下内外码转换函数的测试效果
函数的展示和执行事务码:SE37
除了外码转内码,我们还有内码转外码的需求,比如我们自开发一个 WBS
查询的报表,用户不可能去看一堆数字。如下图:
可是除了 WBS
,还有哪些字段具有内外码转换这一特点的呢?
常见的比如:
- 语言:前台显示是
ZH
,实际表里存的是1
;前台是EN
,实际存的是E
等 - 物料主数据上的“单位”,如下图,虽然前台录入时的值
BOT
,但是如果你调用BAPI
,还是赋值BOT
就会报错,应该赋值BT
;
物料编号,内码显示物料编号有前导零,可是外码显示没有,如下图
我们不可能把所有字段都记住,以下方法,可以帮助大家看看字段有没有,内外码转储的特点:
我们可以查看字段的数据类型,看看数据类型中,有没有转换例程,如果有就说明此字段涉及内外码转换;
双击转换例程,还能查看到相应转换函数:
其他字段,大家可以自行研究测试