ABAP 例程程序在SAP BW TRANFORMATION中的应用,去除非法字符

来源:互联网 发布:eplan软件 64位 编辑:程序博客网 时间:2024/05/01 04:57

在标准DSO中,由于数据源的复杂性,经常会会激活失败,常见的原因是非法字符。非法字符通常有几种:

1,小写字母,如果INFOOBJECT 没有点选允许小写的选项,会造成激活失败

2,德语,法语中英语没有的字符。

解决的方法有多种,例如在RSKC添加,但是如果非法字符未知的话,还是难以解决。比较稳妥的方法是用例程解决。


CONSTANTS:
           c_allowed_char  TYPE c LENGTH 200 VALUE
           '!,<>?/\:;"''ABCDEFGHI JKLMNOPQRSTUVWXYZ!%^&*()__+=1234567890', " 定义BW中所有的字符为常量
 
           c_escape        TYPE c VALUE 'Ø'.     " because '!' is a valid character too “将非法字符统一转换为同一字符Ø
 
     DATA: l_allowed_char  TYPE c LENGTH 200,
           l_alocnum         TYPE c LENGTH 000050,
           l_len           TYPE i,
           l_time          TYPE i.
 
 
 
     " get list of allowed characters - from system config
     CALL FUNCTION 'RSKC_ALLOWED_CHAR_GET'  ”调用FM, 得到系统全部的合法字符
       IMPORTING
         e_allowed_char = l_allowed_char.
 
     IF sy-subrc <> 0.
       " if it fails, get use standard list, from constant 如果调用失败,则用常量
       l_allowed_char = c_allowed_char.
     ENDIF.
 
     MOVE source_fields-alocnum  TO l_alocnum.
 
     TRANSLATE l_alocnum TO UPPER CASE. “全部转换为大写,注意SAP BW 里,小写为非法
 
     l_len = STRLEN( l_alocnum ).  
 
     DO l_len TIMES.  "这里的调用循环,原理就不解释了
 
       IF l_alocnum+l_time(1) CN  l_allowed_char .
         l_alocnum+l_time(1) = c_escape.
       ENDIF.
 
       l_time = l_time + 1.
 
     ENDDO.
 
     REPLACE ALL OCCURRENCES OF c_escape IN l_alocnum WITH space.
 
     CONDENSE l_alocnum.
 
     result = l_alocnum.

0 0