BW Conversion Routine 探究以及实例操作和异常处理

BW Conversion Routine 探究以及实例操作和异常处理     

在SAP平台,我们经常发现“Conversion Routine”( Convers. Rout.)这个字眼,这是一个稍不留神就会一笑而过的东西,但是深究下去就会发现,其实这裡面大有文章。今天我们就来亲密接触一次“Conversion Routine”。
 我们先看一下官方的说明:
Conversion takes place when converting the contents of a screen field from display format to SAP-internal format and vice versa and when outputting with the ABAP statement WRITE, depending on the data type of the field.
If standard conversion is not suitable, it can be overridden by specifying a conversion routine in the underlying domain.
A conversion routine is identified by its five-place name and is stored as a group of two function modules. The function modules have a fixed naming convention. The following function modules are assigned to conversion routine xxxxx:
• CONVERSION_EXIT_xxxxx_INPUT
• CONVERSION_EXIT_xxxxx_OUTPUT
The INPUT module performs the conversion from display format to internal format. The OUTPUT module performs the conversion from internal format to display format.
If a screen field refers to a domain with a conversion routine, this conversion routine is executed automatically each time an entry is made in this screen field or when values are displayed with this screen field.
 上面的官方文档大概涉及到两个问题:1. 显示格式和SAP内部格式 2.Conversion执行动作时间
 针对第一个问题,我是这样理解的,凡是用户前台操作看到的都是用栏位的显示格式,凡是IT后台操作显示的都是栏位的SAP内部格式(我把它称为存储格式,感觉更为恰切)。
第二个问题说的是转化的执行时间。在显示和存储的切换过程会进行转化动作,这个动作是自动执行的。
爲了说明“Conversion Routine”的上述两个问题,我使用其中的“ALPHA”例子进行一次真实演练。
Step 1 在ABAP Dictionary(T-CODE:SE11)建立一个Domain:ZPERSON
 
注意选择类型为“CHAR”,长度为10, Convers. routine采用“ALPHA”

Step  2在ABAP Dictionary(T-CODE:SE11)建立一个Data Element:ZPERSON
 
  Data Element采用Domain“ZPERSON”来定义。
 
Step 3 在实际裱中定义两个栏位“ZPERSON”,“ZPERSON1”,分别采用Data Element,Predefined Type
 
 Step 4 在Data Brower(T-CODE:SE16)新增一笔记录
  
我将ZPERSON与ZPERSON1都赋值为“1”,选择保存
Step 5 显示新增后的结果
 
ZPERSON在值的前面自动补充了九个零,而ZPERSON1则仍旧是1,虽然ZPERSON与ZPERSON1的类型都为“CHAR”,且长度都为“10”,但是保存之后的结果却大不同,原因就在ZPERSON使用的Domain定义了“ALPHA”机制。
 这时候大家会有一个错觉,认为ZPERSON1如果赋值的时候前面加零也会自动忽略,那么我们在测试一下。
Step 6 我将两个栏位都赋值为“0000000002”
 
保存之后查看结果。
Step 7 显示结果
  
无论是ZPERSON或是ZPERSON1的值都是“0000000002”。
通过以上测试,我们可以得到一个结论,数据库内部是区分数字前面的零的,有零无零的区别对待的。
    以上贴了一大堆图,可能会人迷惑,这跟BW没什么关係吧?那么我就从InfoObject的几个截图来解析它们之间的关联。
我用CO裡面的Cost Element来举例:
Step 8  Cost Element的维护界面,大家请关注我用红框选择的部分
  这边的Data Element和我们之前定义的Data Element是一个概念
Step 9 显示Data Element的信息
 
Data Element也是定义在Domain的基础上的,所以我们要进一步了解
Step 10 Domain显示的信息和我们之前测试的是何其相似
 

通过以上的一系列对比,InfoObject的定义和我们在裱中的定义是类似的。
回过头来,我们在讨论下面这个问题:
为什么InfoObject的“Convers. Routine”可以在选择“ALPHA”后修改为空,即不使用此Routing呢?
Conversion Routine在这裡要做的有两个动作,外部显示格式变为内部存储格式,内部存储格式变为显示格式。如果一开始选择“ALPHA”,那么系统会有将数字型字符在存储到数据库的时候进行填零动作,而在显示的时候会自动将零拿掉。同时有一个很重要的过程叫“查询”,会去判断栏位是否要执行“Conversion”动作,如果栏位是选择了“ALPHA”,那么你输入查询的条件前面补不补零是没有区别的,因为系统都会自动进行转化动作。如果这时候去掉“ALPHA”,系统就不会对数字型字符进行转化,输入什么即保存什么,前面不会有补零动作。同样是上面那么很重要的过程,此时栏位是没有选择“ALPHA”的,那么也就不会对你的输入值进行转化,结果是如果要查询“00000001”,你必须要把前面的零都补齐,否则是不会有查询结果的,除非,如果系统的确保存有一笔值就是为“1”的。所以去掉“ALPHA”的过程是OK,系统不会提示错误,因为实际中也走的通(想不同的人再想想)。
那么问题往往发生在,拿掉“ALPHA”之后,想重新加回去,却怎么也加不了了。
上面说了一大堆,其实是有原因的。我重点提到,在查询过程,系统会判断栏位是否要“ALPHA”转化。拿掉“ALPHA”之后,之前有一笔值为“0000000001”的保存良好,而你又新增的一笔值为“1”的记录,保存也OK,这样系统就存在两条记录了。当然你要查询“1”的时候,直接输“1”就可以了,如果要查询“0000000001”,就要麻烦你都在“1”的前面输九个零。说到这边估计很多人都看出问题了 。
 假设“ALPHA”拿掉之后可以重新加回去,这时候你还可以查询出“1”吗?估计不行,哪怕你说“我可以不要查询1”,但是站在系统的角度,他会认为这个过程会给用户带来迷惑,所以试图再加上“ALPHA”,那就会碰壁了。
 如果我们真的是需要重新选择“ALPHA”,你需要确认一下几点:
 1. 没有类似“0000000001”和“1”这样的情况
 2. 即使发生了上述情况,我也可以忽略“1”的情况
 3. 改后台数据不是什么好习惯
 
 接下来我们就一步一步来更正:
Step 11 先贴一个加入“ALPHA”后重新激活显示的错误图片
 
通过上面的信息,我发现忘记说明一件事情,如果InfoObject没有数据,那么什么时候加都是无所谓的。
打开错误帮助,会看到下面一句发人深思的一句话:
Procedure
Undo the changes that led to the incompatible conversion (the changes in the key) or delete all data from table /BIC/SZASS_MAIN.
SAP售后还是很周到的,你想的出他就做的到,所以他有一个程序是专门帮你去处理事后转化的
Step 12 将字符进行ALPHA转化(当然不只针对ALPHA)
 虽然有这个T-CODE,我是从来没有执行成功过,估计是历时太长,Time-out 了。
 那我就直奔主题了。
Step 13 进入表RSDCHABAS,输入InfoObject的名字进行选择,会有两笔记录显示出来,即版本粉分别为“A”,“M”,将栏位“CONVEXIT”都置为“ALPHA”,保存退出。
Step 14 查看InfoObject对应的Data Element使用的Domain,加入“ALPHA”(之前有图我就不贴了),重新激活,激活过程会有一次警告,我们都这样做了,还管什么警告,一路“OK”。
做完这些是否就万事大吉,基本上是,但是(全世界的人都讨人这个词)你必须要检查新建的InforSources是否有引用这个InfoObject,否则你还需要做一步
Step 15 将图中红圈内,加入“ALPHA”
 
 
做完以上,基本就完成了。
            
Reed Lei
2009/04/16

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/554557/viewspace-591150/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/554557/viewspace-591150/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值