Quelquepart

Blog d'un développeur ABAP

Vous êtes ici : Accueil>Mots clés>fonction

Fonction

Caractères interdits sur BW

Rédigé par Sébastien Hermann dans Fonction, Liste mémo -

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 :

CodeDésignation
01START OF HEADING
02START OF TEXT
03END OF TEXT
04END OF TRANSMISSION
05ENQUIRY
06ACKNOWLEDGE
07BELL
08BACKSPACE
09CHARACTER TABULATION
0ALINE FEED (LF)
0BLINE TABULATION
0CFORM FEED (FF)
0DCARRIAGE RETURN (CR)
0ESHIFT OUT
0FSHIFT IN
10DATA LINK ESCAPE
11DEVICE CONTROL ONE
12DEVICE CONTROL TWO
13DEVICE CONTROL THREE
14DEVICE CONTROL FOUR
15NEGATIVE ACKNOWLEDGE
16SYNCHRONOUS IDLE
17END OF TRANSMISSION BLOCK
18CANCEL
19END OF MEDIUM
1ASUBSTITUTE
1BESCAPE
1CINFORMATION SEPARATOR FOUR
1DINFORMATION SEPARATOR THREE
1EINFORMATION SEPARATOR TWO
1FINFORMATION 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.

Rendre invisible une fenêtre SAPGUI (un mode)

Rédigé par Sébastien Hermann dans Fonction -

Devenez le Majax de l'ABAP grâce à la fonction SAPGUI_SET_PROPERTY
En effet cette fonction du SAPGUI permet de modifier les propriétés de ce dernier, comme par exemple l'affichage des fenêtres SAP !

CALL FUNCTION 'SAPGUI_SET_PROPERTY'
     DESTINATION 'SAPGUI'
     EXPORTING PROPERTY   = 'VISIBLE'
               VALUE = ' '.

Par ce simple appel votre fenêtre disparait complètement. Heureusement l'opération n'est pas irréversible :

CALL FUNCTION 'SAPGUI_SET_PROPERTY'
     DESTINATION 'SAPGUI'
     EXPORTING PROPERTY   = 'VISIBLE'
               VALUE = 'X'.

vous permettra de faire réapparaitre la fenêtre disparue.

En revanche, les usages productifs de cette fonction semblent assez restreint...
On peut imaginer s'en servir lors de lien OLE avec Excel ou Word (création dynamique de document sur le poste utilisateur)
Si vous trouvez un autre usage ou que vous arrivez à avoir des informations sur les autres propriétés modifiables du SAPGUI par cette fonction, n'hésitez pas a laisser un commentaire.

Modifications en production

Rédigé par Sébastien Hermann dans Fonction -

Faire des modifications en production, c'est mal, c'est même carrément interdit.
Oui, tout le monde le sait. Mais alors, pourquoi SAP met a disposition ces 2 fonctions ?

DB_EXECUTE_SQL
Cette fonction permet d'exécuter la requête SQL passée en paramètre. Cette requête, au format "EXEC SQL", peut être INSERT, DELETE, UPDATE... ou tout autre instruction ne nécessitant pas de résultat (SELECT ne renverra rien).

Un exemple inoffensif :

( DROP INDEX TESTINDEX pour supprimer l'index créé)

RFC_ABAP_INSTALL_AND_RUN
Encore plus dangereux, cette fonction compile et exécute tout code abap passé en paramètre. Il suffit de passer le code dans la table PROGRAM. Le résultat sera contenu dans la table WRITES.

Un exemple qui liste les 10 premier clients :

Avec un simple accès à SE37, le mode test permet de faire virtuellement n'importe quelle opération sur un système productif grâce à ces 2 fonctions livrées en standard par SAP.

Terminated change run : fonction RSDDS_AGGR_MOD_CLOSE

Rédigé par Sébastien Hermann dans Fonction -

Lors d'une interruption de chargement d'une donnée de base, elle peut se retrouver complètement bloquée avec une erreur "Attributes for characteristic are locked by a terminated change run" (RSENQ 063 ou RSENQ 062) ou bien une erreur plus générale "Lock NOT set for: ...." (RSENQ 002)

Le cas peut être diagnostiqué en lançant le module fonction : RSDDS_AGGR_MOD_STATE_GET (ne rien renseigner en entrée), la table E_T_CHABASNM contiendra la liste des données de base bloquées. S'il n'y a aucun problème, la fonction renverra une exception.

Pour débloquer la situation il suffit de lancer le module fonction : RSDDS_AGGR_MOD_CLOSE

Fonction RV_CALL_DISPLAY_TRANSACTION

Rédigé par Sébastien Hermann dans Fonction -

Petit focus sur une fonction "magique" de SAP.

RV_CALL_DISPLAY_TRANSACTION permet d'ouvrir en mode transactionnel tout type (ou presque) de documents SD/MM dans SAP.

function rv_call_display_transaction.
*"----------------------------------------------------------------------
*"*"Globale Schnittstelle:
*"       IMPORTING
*"             VALUE(BUKRS) DEFAULT '    '
*"             VALUE(FCODE) DEFAULT '    '
*"             VALUE(GJAHR) DEFAULT '0000'
*"             VALUE(LGNUM) LIKE  VBFA-LGNUM DEFAULT '   '
*"             VALUE(POSNR) LIKE  VBAP-POSNR DEFAULT '000000'
*"             VALUE(VBELN) LIKE  VBUK-VBELN
*"             VALUE(AUFNR) LIKE  VBAK-AUFNR OPTIONAL
*"             VALUE(VBTYP) LIKE  VBUK-VBTYP DEFAULT ' '
*"             VALUE(FI_APPLI) LIKE  VBFAL-APPLI DEFAULT '  '
*"----------------------------------------------------------------------

Il suffit de renseigner le numéro de document (VBELN) pour ouvrir commande, contrat, livraison sortante ou facture. Mieux, ajouter le numéro de poste (POSNR) et le document ouvert arrive directement sur ce poste.

Mais ce n'est pas tout. Si vous spécifiez le type de document (VBTYP), vous pouvez ouvrir une multitude d'autres documents. Voici un petit tableau des transactions gérées par cette fonction :

VBTYPTransactionDocumentChamps pris en compte
1VC03, VC02ContactVBELN
3 ou 4VF23, VF22Liste de facturesVBELN
5, 6, M, N, O, P, S, UVF03, VF02FactureVBELN POSNR
7VL33N, VL32NLivraison entranteVBELN
8VT03N, VT02NTransportVBELN
AVA13, VA12Demande d'offreVBELN POSNR
BVA23, VA22OffreVBELN POSNR
C, H, I, K, LVA03, VA02CommandeVBELN POSNR
DVA53, VA52PropositionVBELN POSNR
E, FVA33, VA32Programme de livraisonVBELN POSNR
F, G, 0VA43, VA42ContratVBELN POSNR
QLT21Ordre de transfertVBELN LGNUM
R, h, iMB03, MB02Doc articleVBELN
J, TVL03N, VL02NLivraison sortanteVBELN POSNR
VME23N, ME33, ME43, ME53N, ML81N, ME22, ME32K, ME32L, ME42, ME52Document achat (demande, commande, VBELN
vME53NDemande d'achatVBELN
WMD83, MD82Plan de besoinVBELN POSNR
Xfct HU_DISPLAY (?)Unité de manutentionVBELN
&LX44Document magasinVBELN LGNUM
aVI03Frais de transportVBELN
YVB03Liste d'exclusionVBELN
.IW33OrdreAUFNR
:IQS3AvisAUFNR
1 et FI_APPLI=MMMB03Doc articleVBELN (comme doc article)+GJAHR+BUKRS
2, 3 et FI_APPLI=MMFB03Piece comptableVBELN (comme doc article)+GJAHR+BUKRS
A et FI_APPLI=MMMIR4Doc de facturationVBELN (comme doc article)+GJAHR
vide et BUKRS renseignéFB02Piece comptableVBELN (comme doc article)+GJAHR+BUKRS

Légende : Document accessible sans indiquer de VBTYP
Uniquement pour la fonction DISPLAY
Uniquement pour la fonction CHANGE

Vous pouvez utiliser RV_CALL_CHANGE_TRANSACTION pour ouvrir en modification les mêmes documents.
Ces fonctions sont très utilisées par le standard pour afficher des documents.
A noter, les USEREXIT de LV06AFZZ sont utilisés.