Caractères interdits sur BW
Lors de chargements il peut arriver d'avoir une erreur à cause de caractères interdits : "Value 'xxxxx' for characteristic YYYY contains invalid characters"
La transaction RSKC permet de définir la liste des caractères autorisés. Classiquement le générique "ALL_CAPITAL" est utilisé. Mais à quoi correspond-il exactement ?
ALL_CAPITAL autorise tous les caractères à l'exception de 31 caractères de contrôle, c'est-à-dire des caractères invisibles généralement utilisés par les programmes de traitement de texte pour gérer la mise en forme. Aucun de ces caractères ne peut être saisi directement dans SAP, seules des interfaces tiers peuvent éventuellement les injecter. En revanche, il est fréquent de les introduire par erreur lors de copier/coller depuis des logiciels tiers (Word, Excel ou Outlook par exemple).
SAP ne sachant pas les interpréter, ils sont affichés comme des # (mais sont conservés dans leur forme d’origine grâce à Unicode).
Voici la liste des 31 caractères interdits par ALL_CAPITAL :
Code | Désignation |
---|---|
01 | START OF HEADING |
02 | START OF TEXT |
03 | END OF TEXT |
04 | END OF TRANSMISSION |
05 | ENQUIRY |
06 | ACKNOWLEDGE |
07 | BELL |
08 | BACKSPACE |
09 | CHARACTER TABULATION |
0A | LINE FEED (LF) |
0B | LINE TABULATION |
0C | FORM FEED (FF) |
0D | CARRIAGE RETURN (CR) |
0E | SHIFT OUT |
0F | SHIFT IN |
10 | DATA LINK ESCAPE |
11 | DEVICE CONTROL ONE |
12 | DEVICE CONTROL TWO |
13 | DEVICE CONTROL THREE |
14 | DEVICE CONTROL FOUR |
15 | NEGATIVE ACKNOWLEDGE |
16 | SYNCHRONOUS IDLE |
17 | END OF TRANSMISSION BLOCK |
18 | CANCEL |
19 | END OF MEDIUM |
1A | SUBSTITUTE |
1B | ESCAPE |
1C | INFORMATION SEPARATOR FOUR |
1D | INFORMATION SEPARATOR THREE |
1E | INFORMATION SEPARATOR TWO |
1F | INFORMATION SEPARATOR ONE |
Pour autoriser ces caractères, il est possible d'utiliser "ALL_CAPITAL_PLUS_HEX" dans RSKC.
Quelques fonctions utiles :
RSKC_ALLOWED_CHAR_GET permet d'obtenir la liste des caractères autorisés saisis dans RSKC.
RSKC_CHAVL_CHECK permet de tester si une valeur va être autorisée par BW.
Un petit fragment de code qui permet de supprimer d'une variable les 31 caractères :
* w_data contient le texte à nettoyer DATA: l_length TYPE i, l_pos TYPE i, lo_not_allowed TYPE REF TO cl_abap_conv_in_ce, l_not_allowed_x(32) TYPE x VALUE '000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F', l_not_allowed TYPE string. * Get list of unauthorized values lo_not_allowed = cl_abap_conv_in_ce=>create( input = l_not_allowed_x ). lo_not_allowed->read( IMPORTING data = l_not_allowed ). * search if unauthorized value is found IF w_data CA l_not_allowed. * If found, replace it by space l_length = STRLEN( w_data ). l_pos = 0. DO l_length TIMES. IF w_data+l_pos(1) CA l_not_allowed. w_data+l_pos(1) = space. ENDIF. l_pos = l_pos + 1. ENDDO. ENDIF.