Je vous conseille d’aller lire cet article à sa nouvelle adresse : 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.

Tags: , , ,