- 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.
- 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.
- 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.
- 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>
- 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.