Quelquepart

Blog d'un développeur

Vous êtes ici : Accueil>Archives> 2009

Archives 2009

Mais qu'est ce que l'ABAP ?

Rédigé par Sébastien Hermann dans Général - Aucun commentaire

Cet acronyme vous est familier ? Vraiment ? Voici quelques unes de ses définitions.

En dehors de ce message, ce blog ne traitera d'aucun de ces sujets. Il se concentrera sur l'Advanced Business Application Programming, et le développement autour de SAP en général.

Upload/download de fichiers

Rédigé par Sébastien Hermann dans Non classé - Aucun commentaire

Si la transaction AL11 permet de visualiser les fichiers sur le serveur, elle ne permet ni de les télécharger, ni d'en ajouter. C'est un vrai manque qui se fait resentir de manière chronique chez la plupart des sociétés utilisatrices de SAP.

Généralement, un programme spécifique est déployé pour répondre à ce besoin. J'ai même fait une version améliorée qui historise les fichiers en utilisant une compression tar+bz2, cela fera peut-être l'objet d'un prochain billet.

Les personne ayant déjà travaillés sur un projet de reprise de données connaissent probablement la transaction SXDA et plus spécifiquement SXDA_TOOLS, qui permet de faire des upload/download entre serveur sap et poste client, même si ce n'est pas son but premier. Cette solution standard s'apparente à un hack car on renseigne les paramètres obligatoires avec des données bidons avant d'appeler la fonction de copie. Néanmoins elle évite de développer un programme spécifique.

Mais grâce au module EHS (Environment, Health and Safety), 2 transaction 100% dédiées à ces opérations ont vues le jour :

Testé sur divers systèmes sap, de 4.6b à ECC5, les transactions semblent fonctionner convenablement.

Modifications en production

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

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.

Ajouter des boutons sur un écran de sélection

Rédigé par Sébastien Hermann dans Général - Aucun commentaire

Dans un écran SAP, pour gérer des boutons au niveau de la barre de fonction (toolbar), vous devez créer un statut de surface (set pf-status et SE41) et y définir vos boutons. Sans être vraiment long, l'opération est assez fastidieuse, surtout si l'on doit documenter chaque objet créé ;-)

Dans un écran de sélection, il existe une astuce afin de gérer jusqu'à 5 boutons dans la toolbar sans avoir à déclarer de statut de surface, simplement avec un peu d'ABAP. C'est la structure SSCRFIELDS qui va nous permettre ce petit tour de magie.

  1. Tout d'abord déclarer la structure sscrfields.
    TABLES sscrfields.
  2. Activer les boutons (de 1 à 5)
    SELECTION-SCREEN FUNCTION KEY 1.
    SELECTION-SCREEN FUNCTION KEY 2.
  3. Renseigner le texte du bouton (il est possible d'y mettre un icone)
    INITIALIZATION.
      sscrfields-functxt_01 = 'Fonction 1'.
      sscrfields-functxt_02 = '@01@Fonction 2'.
  4. Capturer l'action dans le PAI de l'écran de sélection
    AT SELECTION-SCREEN.
      CASE sy-ucomm.
        WHEN 'FC01'.
          MESSAGE i000(38) WITH 'Fonction 1 !'.
        WHEN 'FC02'.
          CLEAR sy-ucomm.
          MESSAGE e000(38) WITH 'Fonction 2 !'.
      ENDCASE.

C'est tout !
Autre avantage, les boutons étant intégralement déclarés dans le code, un simple copier-coller vous permet de réutiliser votre code ailleurs ;-)

La preuve par cet exemple complet :

REPORT zkunnr.

* declaration
TABLES sscrfields.

* Ecran de sélection
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN BEGIN OF BLOCK one WITH FRAME TITLE text-t01.
PARAMETERS p_kunnr LIKE kna1-kunnr.
SELECTION-SCREEN END OF BLOCK one.

INITIALIZATION.
  sscrfields-functxt_01 = 'Fonction 1'.
  sscrfields-functxt_02 = '@01@Fonction 2'.

AT SELECTION-SCREEN.
  CASE sy-ucomm.
    WHEN 'FC01'.
      MESSAGE i000(38) WITH 'Fonction 1 !'.
    WHEN 'FC02'.
      CLEAR sy-ucomm.
      MESSAGE e000(38) WITH 'Fonction 2 !'.
  ENDCASE.

START-OF-SELECTION.
  WRITE p_kunnr.

Terminated change run : fonction RSDDS_AGGR_MOD_CLOSE

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

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