在SAP的Domain定义中,Output Length下面有个Convers. routine的标识,这是SAP用来进行输入输出转换的。
我们知道,屏幕上的I/O字段都是字符串形式的,而数据在我们内部则分为C, S, N, P, D等诸多类型,这中间就有个转换过程。
Conversion Routine就是实现这种转换的一种工具。
可以在SE12中录入Domain:MATNR,我们可以看到,这里定义了名为MATN1的转换方法。
这就是为什么我们输入的物料号都会被系统自动加上前导0。
双击MATN1,可以看到CONVERSION_EXIT_MATN1_INPUT和CONVERSION_EXIT_MATN1_OUTPUT两个函数,它们分别负责输入转换和输出转换。如图。
下面我们也可以定义个简单的Conversion Routine实例。假设我们有个类型为NUMC、长度为2的数字,要求其前台录入和输出的必须是英文单词。
1. 定义函数 CONVERSION_EXIT_ZZ01_INPUT.
可以参考CONVERSION_EXIT_MATN1_INPUT来定义我们的接口:INPUT和OUTPUT。
该函数的功能是,当用户录入一个字符串形式的屏幕字段后,将其转化成内部数据的格式。
INPUT在这里代表用户录入,当被系统调用时,它就是字符串的格式;OUTPUT则代表了内部的数据,函数被调用时它代表的是NUMC(2)格式。
我们的代码如下:
function conversion_exit_zz01_input.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(INPUT)
*" EXPORTING
*" REFERENCE(OUTPUT)
*"----------------------------------------------------------------------
check input is not initial.
if input = 'TEN'.
output = 10.
elseif input = 'ELEVEN'.
output = 11.
elseif input = 'TWELVE'.
output = 12.
else.
message 'Invalid value.' type 'E' raising invalid_value.
endif.
endfunction.
2. 定义函数 conversion_exit_zz01_output.
可以参考CONVERSION_EXIT_MATN1_OUTPUT来定义我们的接口。该函数的功能是执行输出转化,将内部数据转化成字符串形式。INPUT代表了我们的内部数据,而OUTPUT则代表了输出到界面上的字符串效果。
代码如下:
function conversion_exit_zz01_output.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(INPUT)
*" EXPORTING
*" REFERENCE(OUTPUT)
*"----------------------------------------------------------------------
check input is not initial.
if input = 10.
output = 'TEN'.
elseif input = 11.
output = 'ELEVEN'.
elseif input = 12.
output = 'TWELVE'.
endif.
endfunction.
3. 创建域和数据元素(YCRTEST)如下图.
激活时会警告定义长度和输出长度不一致,先不管它。
4. 测试程序如下:
data: c2 type c length 2.
parameters: p type ycrtest.
c2 = p."c2是p的内部存储形式,所以此时会调用input函数
write: 'Now internal value of p is:', c2.
p = 12."p是12的外部显示形式,所以此时会调用ouptout函数
write: / 'For p = 12, the output is:', p.
5. 执行结果如下图.