Techniques d'Amélioration des Données Financières en SAP ABAP

  1. Substitutions

Les substitutions permettent de modifier dynamiquement les données pendant le traitement des documents financiers. Dans SAP, cette fonctionnalité est configurée via les transactions OBBH et GCX2.

Pour configurer, accédez à la transaction GCX2 pour gérer les programmes de sortie des zones d'application. Copiez le programme standard RGGBS000 dans un objet Z, par exemple ZRGGBS000, et adaptez les noms des formulaires de sortie.

Dans le programme de sortie, ajoutez les formulaires de sortie à la table EXITS. Voici un exemple de code modifié avec des noms de variables et une structure alternatifs :

FORM obtenir_titres_sorties TABLES table_sorties.
  DATA: BEGIN OF entree_sorties OCCURS 50,
          identifiant(5) TYPE c,
          parametre LIKE c_exit_param_none,
          libelle(60) TYPE c,
        END OF entree_sorties.

  entree_sorties-identifiant = 'U100'.
  entree_sorties-parametre = c_exit_param_none.
  entree_sorties-libelle = TEXT-100.
  APPEND entree_sorties.

  entree_sorties-identifiant = 'U101'.
  entree_sorties-parametre = c_exit_param_field.
  entree_sorties-libelle = TEXT-101.
  APPEND entree_sorties.

  entree_sorties-identifiant = 'U401'.
  entree_sorties-parametre = c_exit_param_field.
  entree_sorties-libelle = TEXT-401.
  APPEND entree_sorties.

  entree_sorties-identifiant = 'U200'.
  entree_sorties-parametre = c_exit_param_field.
  entree_sorties-libelle = TEXT-200.
  APPEND entree_sorties.

  entree_sorties-identifiant = 'U500'.
  entree_sorties-parametre = c_exit_param_field.
  entree_sorties-libelle = TEXT-401.
  APPEND entree_sorties.

  INCLUDE rggbs_ps_titles.

  REFRESH table_sorties.
  LOOP AT entree_sorties.
    table_sorties = entree_sorties.
    APPEND table_sorties.
  ENDLOOP.
ENDFORM.

Ensuite, créez les formulaires correspondants pour implémenter la logique métier. Par exemple, pour substituer un code motif :

FORM u401 USING code_motif.
  DATA: lv_code_motif TYPE bseg-rstgr.
  SELECT SINGLE rstgr INTO lv_code_motif FROM zfit008 WHERE hkont = bseg-hkont.
  IF sy-subrc = 0.
    DATA(lv_temp_code) = lv_code_motif.
  ENDIF.

  IF bkpf-blart = 'ZP' OR bkpf-blart = 'DZ'.
    IF bseg-hkont+0(4) = '1001' OR bseg-hkont+0(4) = '1002'.
      IF bseg-rstgr IS INITIAL.
        bseg-rstgr = lv_temp_code.
        CLEAR lv_temp_code.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
  1. Validations

Les validations vérifient l'intégrité des données avant l'enregistrement. Configurez-les via la transaction OB28, où vous pouvez définir des règles et des classes de messages pour les groupes de validation.

  1. Améliorations BTE

Les Business Transaction Events (BTE) offrent une flexibilité étendue pour les processus financiers. Utilisez la transaction FIBF pour configurer les événements et modules fonctionnels.

Voici un exemple de module fonctinonel BTE modifié pour traiter les données de type D et K :

FUNCTION ztraitement_evenement_00001120.
*"----------------------------------------------------------------------
*"*"Interface locale :
*"  IMPORTING
*"     VALUE(I_BKDF) TYPE  BKDF OPTIONAL
*"  TABLES
*"      T_BKPF STRUCTURE  BKPF
*"      T_BSEG STRUCTURE  BSEG
*"      T_BKPFSUB STRUCTURE  BKPF_SUBST
*"      T_BSEGSUB STRUCTURE  BSEG_SUBST
*"      T_BSEC STRUCTURE  BSEC OPTIONAL
*"  CHANGING
*"     REFERENCE(I_BKDFSUB) TYPE  BKDF_SUBST OPTIONAL
*"----------------------------------------------------------------------
  DATA: lv_document TYPE bkpf.

  IF sy-tcode = 'F-44' OR sy-tcode = 'F-32' OR sy-tcode = 'F-53'.
    DATA: lt_lignes TYPE TABLE OF bseg WITH HEADER LINE,
          lv_solde TYPE bseg-wrbtr.

    lt_lignes[] = t_bseg[].
    LOOP AT t_bseg INTO DATA(ls_ligne).
      IF ls_ligne-koart = 'D'.
        CLEAR: lv_solde, lt_lignes.
        LOOP AT lt_lignes WHERE koart = ls_ligne-koart
                            AND saknr = ls_ligne-saknr
                            AND kunnr = ls_ligne-kunnr.
          IF lt_lignes-shkzg = 'S'.
            lv_solde = lv_solde + lt_lignes-wrbtr.
          ELSE.
            lv_solde = lv_solde - lt_lignes-wrbtr.
          ENDIF.
        ENDLOOP.
        IF lv_solde IS INITIAL.
          IF ls_ligne-shkzg = 'S'.
            READ TABLE t_bsegsub ASSIGNING FIELD-SYMBOL(<ligne_sub>) WITH KEY tabix = sy-tabix.
            IF <ligne_sub> IS ASSIGNED.
              <ligne_sub>-xnegp = 'X'.
            ENDIF.
          ELSEIF ls_ligne-shkzg = 'H'.
            READ TABLE t_bsegsub ASSIGNING <ligne_sub> WITH KEY tabix = sy-tabix.
            IF <ligne_sub> IS ASSIGNED.
              <ligne_sub>-xnegp = ''.
            ENDIF.
          ENDIF.
        ENDIF.
      ELSEIF ls_ligne-koart = 'K'.
        CLEAR: lv_solde, lt_lignes.
        LOOP AT lt_lignes WHERE koart = ls_ligne-koart
                            AND saknr = ls_ligne-saknr
                            AND lifnr = ls_ligne-lifnr.
          IF lt_lignes-shkzg = 'S'.
            lv_solde = lv_solde + lt_lignes-wrbtr.
          ELSE.
            lv_solde = lv_solde - lt_lignes-wrbtr.
          ENDIF.
        ENDLOOP.
        IF lv_solde IS INITIAL.
          IF ls_ligne-shkzg = 'S'.
            UNASSIGN <ligne_sub>.
            READ TABLE t_bsegsub ASSIGNING <ligne_sub> WITH KEY tabix = sy-tabix.
            IF <ligne_sub> IS ASSIGNED.
              <ligne_sub>-xnegp = 'X'.
            ENDIF.
          ELSEIF ls_ligne-shkzg = 'H'.
            UNASSIGN <ligne_sub>.
            READ TABLE t_bsegsub ASSIGNING <ligne_sub> WITH KEY tabix = sy-tabix.
            IF <ligne_sub> IS ASSIGNED.
              <ligne_sub>-xnegp = ''.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.
  ENDIF.

  READ TABLE t_bkpf INTO lv_document INDEX 1.
  IF sy-subrc = 0.
    IF lv_document-blart = 'RE' OR lv_document-blart = 'RV'.
      LOOP AT t_bsegsub.
        t_bsegsub-sgtxt = lv_document-bktxt.
        MODIFY t_bsegsub INDEX sy-tabix.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFUNCTION.</ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub></ligne_sub>

Dans la transaction FIBF, créez un produit, associez l'événement et le module fonctionnel, puis activez-le en cochant la case correspondante.

  1. Synchronisation des Champs ACDOCA et BSEG

Pour les champs spécifiques à ACDOCA, utilisez le BADI BADI_FINS_ACDOC_POSTING_EVENTS. Voici une implémentation modifiée :

METHOD if_badi_fins_acdoc_post_events~subst_acdoca_extension_fields.
  DATA: ls_substitution TYPE LINE OF finst_acdoc_subst,
        ls_donnee TYPE acdoca,
        lv_segment_marche TYPE zz004.

  CLEAR et_acdoc_subst.
  LOOP AT it_acdoc REFERENCE INTO DATA(lr_reference).
    MOVE-CORRESPONDING lr_reference->* TO ls_donnee.
    IF ls_donnee-racct+0(4) = '1122' AND ls_donnee-kunnr IS NOT INITIAL AND ls_donnee-blart+0(1) <> 'Z'.
      SELECT SINGLE kdgrp FROM knvv WHERE kunnr = @ls_donnee-kunnr AND vkorg = @ls_donnee-rbukrs INTO @lv_segment_marche.
      EXIT.
    ENDIF.
  ENDLOOP.

  LOOP AT it_acdoc REFERENCE INTO lr_reference.
    MOVE-CORRESPONDING lr_reference->* TO ls_substitution.
    MOVE-CORRESPONDING lr_reference->* TO ls_donnee.
    IF lv_segment_marche IS NOT INITIAL.
      CASE ls_donnee-racct+0(4).
        WHEN '6001' OR '6051' OR '6401' OR '6402' OR '1122'.
          ls_substitution-zz004 = lv_segment_marche.
      ENDCASE.
    ENDIF.
    DATA: lv_ordre TYPE aufnr.
    CALL FUNCTION 'ZFM_ENHANCEMENT_ZZ002'
      EXPORTING iv_belnr = ls_donnee-belnr
      IMPORTING ev_aufnr = lv_ordre.
    IF lv_ordre IS NOT INITIAL.
      ls_substitution-zz002 = lv_ordre.
    ENDIF.
    APPEND ls_substitution TO et_acdoc_subst.
  ENDLOOP.
ENDMETHOD.

Pour les mises à jour par lot d'ACDOCA, utilisez la classe cl_fins_acdoc_change :

FORM modifier_donnees_acdoca.
  DATA: lo_modificateur TYPE REF TO cl_fins_acdoc_change,
        lt_champs_a_modifier TYPE finst_fieldname,
        ls_champ TYPE LINE OF finst_fieldname,
        lt_mises_a_jour TYPE finst_acdoca,
        lt_donnees_triees TYPE if_fins_acdoc_util_types=>tt_acdoca_sorted WITH HEADER LINE.

  CLEAR: lt_donnees_triees, lt_mises_a_jour.
  ls_champ = 'KUNNR'.
  COLLECT ls_champ INTO lt_champs_a_modifier.
  ls_champ = 'LIFNR'.
  COLLECT ls_champ INTO lt_champs_a_modifier.
  ls_champ = 'MWSKZ'.
  COLLECT ls_champ INTO lt_champs_a_modifier.

  SORT gt_data BY rldnr rbukrs gjahr belnr docln.
  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_donnee>) WHERE sel = 'X'.
    APPEND VALUE #( rldnr = <fs_donnee>-rldnr
                    rbukrs = <fs_donnee>-rbukrs
                    gjahr = <fs_donnee>-gjahr
                    belnr = <fs_donnee>-belnr
                    docln = <fs_donnee>-docln
                    mwskz = ''
                    lifnr = <fs_donnee>-bseg_lifnr
                    kunnr = <fs_donnee>-bseg_kunnr ) TO lt_donnees_triees.
  ENDLOOP.
  IF sy-subrc <> 0.
    MESSAGE 'Sélectionnez des lignes' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  IF lt_donnees_triees[] IS NOT INITIAL.
    lt_mises_a_jour = lt_donnees_triees[].
    CREATE OBJECT lo_modificateur.
    lo_modificateur->set_support_mode( it_change_fields = lt_champs_a_modifier ).
    lo_modificateur->change_acdoca(
      it_change_fields = lt_champs_a_modifier
      it_acdoca_upd = lt_mises_a_jour
      iv_write_change_docs = abap_false
      iv_direct_update = abap_true ).
    COMMIT WORK.
    MESSAGE 'Mise à jour réussie' TYPE 'S'.
  ENDIF.
ENDFORM.</fs_donnee></fs_donnee></fs_donnee></fs_donnee></fs_donnee></fs_donnee></fs_donnee></fs_donnee>
  1. Identification des Événements BTE

Pour localiser les événements BTE liés à une transaction, utilisez les modules fonctionnels BF_FUNCTIONS_FIND ou PC_FUNCTION_FIND. Placez des points d'arrêt dans ces fonctions et exécutez la transaction frontale pour observer les événements déclenchés.

Étiquettes: SAP_ABAP Finance_Enhancements Substitutions BTE ACDOCA

Publié le 10 juin à 06h49