Archive for category Général

Journal d’application

Je vous conseille d’aller lire cet article à sa nouvelle adresse : Journal d’application

Lorsque l’on développe un programme spécifique et plus particulièrement une interface, intervient le besoin de gérer des messages d’erreur / alerte / succès et surtout de les sauvegarder pour les restituer ultérieurement.
SAP dispose d’un moyen standard pour gérer les logs applicatifs, y compris pour les programmes spécifiques. Composé d’un ensemble de transactions, programmes, fonctions et tables, cette approche permet d’économiser en coût de développement et de se rattacher à une architecture SAP standard, robuste et complète.

La transaction SLG1 (ou directement le programme SBAL_DISPLAY) permet d’afficher le journal d’application. Via des variantes de sélection, le journal pourra être filtré à convenance, répondant ainsi au besoin de reporting usuel de suivi d’interfaces. Le module fonction BAL_DSP_LOG_DISPLAY permet également d’afficher un log, évitant ainsi d’avoir à gérer un rapport d’exécution d’interface.

SLG1 - Affichage du journal d'application

SLG1 - Affichage du journal d'application

La transaction SLG0 permet de définir ses propres objets / sous-objets.

Pour créer un log dans un programme spécifique, l’usage classique utilise 3 fonctions :

  • BAL_LOG_CREATE qui permet d’initialiser le nouveau log.
  • BAL_LOG_MSG_ADD qui permet d’insérer les messages, 1 par 1
  • BAL_DB_SAVE qui permet de sauvegarder le log en base de données

Les données sont sauvegardées dans les tables BALHDR et BALM
Il est possible d’associer des objets métiers pour chaque message, afin de contextualiser l’erreur.

La fonction APPL_LOG_DB permet d’extraire l’ensemble des données d’un log (pour export vers un autre système ou reporting avancé par exemple).

Enfin la transaction SLG2 (ou directement le programme SBAL_DELETE) permet de supprimer les logs expirés.

SAP fournit une multitude de modules fonctions pour exploiter le journal d’application. Ces fonctions sont toutes préfixée par BAL_*. Afin de faciliter leur utilisation, plusieurs programmes démo sont également livrés par SAP. Ces programmes sont préfixés par SBAL_DEMO_*

Pour plus d’information sur l’utilisation du journal d’application, la documentation est disponible en exécutant le programme SBAL_DOCUMENTATION

Pour exemple, un petit programme qui permet de sauvegarder une entrée dans le journal d’application puis de l’afficher.

* Data pour le log
DATA : s_log_hdr TYPE bal_s_log,
       w_log_hnd TYPE balloghndl,
       t_log_hnd TYPE bal_t_logh,
       s_log_msg TYPE bal_s_msg.

* Ecriture En-tete du log
CLEAR s_log_hdr.
s_log_hdr-object        = 'ZINTERFACE'.
s_log_hdr-subobject     = 'COMMANDES'.
s_log_hdr-extnumber     = 'INT CMD RETOUR PIECE'.
s_log_hdr-aldate_del    = sy-datum + 30. "effacement apres 30j
s_log_hdr-aluser        = sy-uname.
s_log_hdr-alprog        = sy-repid.
s_log_hdr-altcode       = sy-tcode.
s_log_hdr-del_before    = 'X'.

CALL FUNCTION 'BAL_LOG_CREATE'
  EXPORTING
    i_s_log                 = s_log_hdr
  IMPORTING
    e_log_handle            = w_log_hnd
  EXCEPTIONS
    log_header_inconsistent = 1
    OTHERS                  = 2.
IF sy-subrc <> 0.
* error
ENDIF.

* Ecriture d'un message d'erreur
CLEAR s_log_msg.
s_log_msg-msgty = 'E'.
s_log_msg-msgid = 'V1'.
s_log_msg-msgno = '302'.
s_log_msg-msgv1 = '1000125423'. "param : doc number

CALL FUNCTION 'BAL_LOG_MSG_ADD'
  EXPORTING
    i_log_handle     = w_log_hnd
    i_s_msg          = s_log_msg
  EXCEPTIONS
    log_not_found    = 1
    msg_inconsistent = 2
    log_is_full      = 3
    OTHERS           = 4.
IF sy-subrc <> 0.
* error
ENDIF.

* Sauvegarde du log
APPEND w_log_hnd TO t_log_hnd.
CALL FUNCTION 'BAL_DB_SAVE'
  EXPORTING
    i_client         = sy-mandt
    i_t_log_handle   = t_log_hnd
  EXCEPTIONS
    log_not_found    = 1
    save_not_allowed = 2
    numbering_error  = 3
    OTHERS           = 4.
IF sy-subrc <> 0.
* error
ENDIF.

* Affichage du log
CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
  EXPORTING
    i_t_log_handle       = t_log_hnd
  EXCEPTIONS
    profile_inconsistent = 1
    internal_error       = 2
    no_data_available    = 3
    no_authority         = 4
    OTHERS               = 5.
IF sy-subrc <> 0.
* error
ENDIF.

Tags: , , , ,

MOVE-CORRESPONDING à la sauce objet

Je vous conseille d’aller lire cet article à sa nouvelle adresse : MOVE-CORRESPONDING à la sauce objet

L’instruction

MOVE-CORRESPONDING A TO B

permet de copier les champs d’une structure A vers les champs d’une structure B, pour peu qu’ils portent le même nom. Les champs de A n’existant pas dans B sont ignorés.

Vous pouvez écrire la même chose en utilisant field symbol et abap objet :

lo_descr ?= cl_abap_typedescr=>describe_by_data( A ).
LOOP AT lo_descr->components INTO ls_compx.
  CONCATENATE 'A-' ls_compx-name INTO lv_fsname.
  ASSIGN (lv_fsname) TO <lfs_component1>.
  CHECK sy-subrc = 0
  CONCATENATE 'B-' ls_compx-name INTO lv_fsname.
  ASSIGN (lv_fsname) TO <lfs_component2>.
  CHECK sy-subrc = 0
  <lfs_component2> = <lfs_component1>.
ENDLOOP.

Et la vous dites, Waou c’est merveilleux, mais pourquoi irai-je remplacer une ligne de code simple, lisible et éprouvée contre 10 lignes aux performances incertaines ?

Dans l’exemple simpliste présenté ici cela n’a aucun intérêt. En revanche, quand les structures A et B sont assez larges, et qu’il y a des règles spéciales à appliquer sur certains champs, cela peut s’avérer intéressant : quand vous ne voulez pas écraser un champs de B par son homonyme de A ou que vous voulez mettre un champs de A dans un champs portant un autre nom dans B…

A ne surtout pas utiliser de manière systématique, mais peut être utile lorsque les règles sont complexes ;-)

Tags: ,

Mais qu’est ce que l’ABAP ?

Je vous conseille d’aller lire cet article à sa nouvelle adresse : Mais qu’est ce que l’ABAP ?

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.

Tags:

Upload/download de fichiers

Je vous conseille d’aller lire cet article à sa nouvelle adresse : Upload/download de fichiers

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.

SXDA_TOOLS : Upload/Download de fichiers

SXDA_TOOLS : Upload/Download de fichiers

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

  • CG3Z permet de charger un fichier sur le serveur sap depuis le poste client (upload)
    CG3Z : Upload de fichiers

    CG3Z : Upload de fichiers

  • CG3Y permet de charger un fichier sur le poste client depuis le serveur sap (download)
    CG3Y : Download de fichiers

    CG3Y : Download de fichiers

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

Tags: , ,

Ajouter des boutons sur un écran de sélection

Je vous conseille d’aller lire cet article à sa nouvelle adresse : Ajouter des boutons sur un écran de sélection

SSCRFIELDS : Boutons dans un écran de sélection

SSCRFIELDS : Boutons dans un écran de sélection


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.

Tags: , , ,