Modification d'un sous-total dans une grille ALV

Modification d'un sous-total dans une grille ALV

Messagede ghosteur » 01 Février 2010, 12:22

Les grilles ALV ont l’avantage de proposer en standard des fonctionnalités bien utiles telles le calcul des sous-totaux. Cependant, dans le cas où les lignes qui entrent dans le calcul du sous-total contiennent des pourcentages, le résultat standardisé obtenu (somme des pourcentages) n’a souvent aucun sens. Il est donc nécessaire dans ce cas de "reprendre la main" sur le standard en remplaçant la valeur faussée dans la ligne de sous-total par notre propre sous-total calculé spécifiquement.

Voici les étapes à suivre :
1. Utiliser le module fonction GET_GLOBALS_FROM_SLVC_FULLSCR pour obtenir l’objet de la grille ALV.

2. Utiliser la méthode GET_SUBTOTALS de l’objet ALV déterminé précédemment pour obtenir le sous-total partiel de premier niveau par le paramètre EP_COLLECT01 (ou le sous-total partiel de second niveau par le paramètre EP_COLLECT02, etc…)

3. Modifier le sous-total par la valeur calculée spécifiquement en utilisation un field-symbol faisant référence à EP_COLLECT01.

4. Rafraîchissement de la grille ALV en utilisant la méthode REFRESH_TABLE_DISPLAY.

IMPORTANT : le module fonction GET_GLOBALS_FROM_SLVC_FULLSCR (étape 1) doit être appelé avant l’affichage réel de la grille ALV. Pour cette raison, l’implémentation d’un évènement TOP_OF_PAGE est nécessaire. C’est dans la routine du TOP_OF_PAGE que le code de modification du sous-total sera utilisé.

Ci-dessous, un extrait de code. Notez le paramètre « i_callback_top_of_page = 'TOP_OF_PAGE' » dans les paramètres du module fonction 'REUSE_ALV_GRID_DISPLAY' ainsi que le form du même nom dans lequel la modification proprement dite du sous-total s’effectue, conformément aux étapes mentionnées.


Code: Tout sélectionner
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = l_repid
      i_callback_top_of_page  = 'TOP_OF_PAGE'
      is_layout               = l_layout
      is_print                = l_print
      it_sort                 = it_sort
      it_filter               = it_filter
      it_fieldcat             = t_fieldcat[]
      it_event_exit           = it_event_exit
    TABLES
      t_outtab                = it_bkpf
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


*---------------------------------------------------------------------*
*      Form  TOP_OF_PAGE
*---------------------------------------------------------------------*
FORM top_of_page.
DATA: lo_grid TYPE REF TO cl_gui_alv_grid.
DATA: it_01 TYPE REF TO data.
FIELD-SYMBOLS: <ft_tab> TYPE ANY TABLE,
                              <fs_tab> TYPE ANY,
                              <ff_field> TYPE ANY.

* Récupération de la référence de la grille ALV
*-------------------------------------------------------------
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

* Récupération du sous-total de niveau 1
*-------------------------------------------------------------
  CALL METHOD lo_grid->get_subtotals
    IMPORTING
      ep_collect01 = it_01.

* Assignation de la table des sous-totaux au field symbol
*-------------------------------------------------------------
  ASSIGN it_01->* TO <ft_tab>.

* Modification du sous-total par une valeur imposée (ici 100)
*-------------------------------------------------------------
  LOOP AT <ft_tab> ASSIGNING <fs_tab>.
    ASSIGN COMPONENT 'PER' OF STRUCTURE <fs_tab> TO <ff_field>.
    <ff_field> = '100'.
  ENDLOOP.

* Rafraîchissement de la grille ALV
*-------------------------------------------------------------
  CALL METHOD lo_grid->refresh_table_display
    EXPORTING
      i_soft_refresh = 'X'.

ENDFORM.                    " top_of_page
ghosteur
Posteur débutant
Posteur débutant
 
Messages: 8
Inscription: 01 Février 2010, 11:12

Retourner vers ABAP

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité