删除乱码

来源:互联网 发布:熊族软件图片 编辑:程序博客网 时间:2024/06/14 05:37

原文:

http://scn.sap.com/community/data-warehousing/bw/blog/2010/12/23/removing-invalid-characters-using-field-routine

Removing Invalid Characters using field routine

发贴人 Jyothi Velpula 在 SAP Business Warehouse 打开 2010-12-23 11:45:01

Summary

 

This Blog shows a simple way to remove the Invalid Characters in BW using a Field Routine.

 

We often face the issue of load failures due to Invalid characters in BW, Instead of Editing the data in PSA temporarily, we wrote a simple routine in Field level.

  

Load Failed Due to Invalid Chars

image

 

Info object ZSR_DEC contains Invalid Chars

image

 


DATA A TYPE </BIC/OI XXX>.

DATA: L_LEN TYPE I,

 L_TIME TYPE I.

 

MOVE SOURCE_FIELDS-/BIC/XXX TO A.

TRANSLATE A TO UPPER CASE.

L_LEN = STRLEN(A).

DO L_LEN TIMES.

IF A+L_TIME(1) CN

',<>?/\:;"''ABCDEFGHI JKLMNOPQRSTUVWXYZ!%^&*()__+=1234567890'.

A+L_TIME(1) = ‘~’

ENDIF.

L_TIME = L_TIME + 1.

ENDDO.

REPLACE ALL OCCURRENCES OF ‘~’ IN A WITH SPACE.

CONDENSE A.

RESULT = A.



Explanation

 

1)  ',<>?/\:;"''ABCDEFGHI JKLMNOPQRSTUVWXYZ!%^&*()__+=1234567890'.

These are the Valid chars and numbers which will be accepted by BW system, System will throw an error only when load receives a char which is not there in the above. And that char will be treated as a Invalid Char.

 

2)  IF  A+l_time(1)  CN    ',<>?/\:;"''ABCDEFGHI JKLMNOPQRSTUVWXYZ!%^&*()__+=1234567890'.

     A is a Char which contains the data .

    I_time is used for iteration(it’ll check each char by char in a word/Sentence).

    CN – Contains not

     

 A+l_time(1) = '~'.

 What ever the special/Invalid char appears in the load apart from the above mentioned, system will convert  them to ‘~’

 

 

3) REPLACE ALL OCCURRENCES OF '~' IN a WITH space.

   CONDENSE A.

  
   System will replace all the ~ with space, then condenses the space.

Activate the transformation, Delete and Reload the data 

image

 

load successful to Data target

 image


************************************************************************************************************

第二个牛人写了个function


FUNCTION zbw_allow.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(UPPER) TYPE CHAR1 DEFAULT ' '
*" VALUE(CONDENSE) TYPE CHAR1 DEFAULT 'X'
*" VALUE(CHAR_DEF) TYPE CHAR1 DEFAULT ' '
*" CHANGING
*" VALUE(SL_CHAR)
*"----------------------------------------------------------------------

DATA: sl32(32) TYPE c VALUE '!"%&''()*+,-./:;<=>?_0123456789 '.
DATA: slcap(26) TYPE c VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
DATA: sllow(26) TYPE c VALUE 'abcdefghijklmnopqrstuvwxyz'.
DATA: sl60(60) TYPE c.

DATA: sl_pos LIKE sy-fdpos.

sl60 = sl_char.

IF char_def CA sl32
OR char_def CA slcap
OR char_def CA sllow.
ELSE.
CLEAR char_def.
ENDIF.

*Only the following standard characters are valid in characteristic
*values by default:
*!"%&''()*+,-./:;<=>?_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.
*Furthermore, characteristic values that only consist of the character #
* or that begin with ! are not valid.

IF sl60 EQ '#'.
sl60 = char_def.
ENDIF.

CLEAR sl_pos.
DO 60 TIMES.
IF sl60+sl_pos(1) CA sl32
OR sl60+sl_pos(1) CA slcap
OR sl60+sl_pos(1) CA sllow.
ELSE.
sl60+sl_pos(1) = char_def.
ENDIF.
ADD 1 TO sl_pos.
ENDDO.
SHIFT sl60 LEFT DELETING LEADING ' '.

WHILE sl60(1) = '!'.
sl60(1) = char_def.
SHIFT sl60 LEFT DELETING LEADING ' '.
ENDWHILE.

IF upper = 'X'.
TRANSLATE sl60 TO UPPER CASE.
ENDIF.

IF condense = 'X'.
CONDENSE sl60 NO-GAPS.
ENDIF.

CLEAR sl_char.
sl_char = sl60.

ENDFUNCTION.



***********************************************

第三个牛人的function.

class ZCL_IOBJ_CHECK definition
public
create public .

*"* public components of class ZCL_IOBJ_CHECK
*"* do not include other source files here!!!
public section.

type-pools RSD .
class-methods ELIM_INVALID_CHARS
importing
value(IN_VALUE) type /BI0/OIPOSTXT
value(IN_INFOOBJECT) type RSD_IOBJNM
exporting
value(OUT_VALUE) type /BI0/OIPOSTXT .

method ELIM_INVALID_CHARS.
DATA: length TYPE I,
index TYPE I,
current_char TYPE C,
result(60) TYPE C,
infoobject TYPE RSD_IOBJNM.

CLEAR: result, infoobject.
MOVE IN_VALUE TO result.
MOVE IN_INFOOBJECT TO infoobject.
* TRANSLATE result TO UPPER CASE.
length = strlen( result ).
index = -1.
DO length TIMES.
index = index + 1.
current_char = result+index(1).
CALL FUNCTION 'RSKC_CHAVL_OF_IOBJ_CHECK'
EXPORTING
I_CHAVL = current_char
I_IOBJNM = infoobject
EXCEPTIONS
CHAVL_NOT_ALLOWED = 1.
IF SY-SUBRC <> 0.
MOVE ' ' TO result+index(1).
ENDIF.
ENDDO.
MOVE result TO OUT_VALUE.
endmethod.

0 0
原创粉丝点击