Difference between revisions of "SAP ABAP ALV REUSE ALV GRID DISPLAY"

From SapWiki
Line 1: Line 1:
 
==Ejemplo con edición de columna, eventos USER_COMMAND y DATA_CHANGED==
 
==Ejemplo con edición de columna, eventos USER_COMMAND y DATA_CHANGED==
  *&---------------------------------------------------------------------*
+
  <nowiki> *&---------------------------------------------------------------------*
 
  *& Report YALV
 
  *& Report YALV
 
  *&---------------------------------------------------------------------*
 
  *&---------------------------------------------------------------------*
Line 217: Line 217:
 
   ENDLOOP.
 
   ENDLOOP.
 
   
 
   
  ENDFORM.
+
  ENDFORM.</nowiki>

Revision as of 14:29, 4 April 2020

Ejemplo con edición de columna, eventos USER_COMMAND y DATA_CHANGED

 *&---------------------------------------------------------------------*
 *& Report YALV
 *&---------------------------------------------------------------------*
 *& ejemplo reuse_alv_grid_display con edición, eventos user_command y data_changed
 *&---------------------------------------------------------------------*
 REPORT yalv_grid.
 TYPES: BEGIN OF ty_data,
          checkbox type checkbox,
          vbeln      TYPE vbrk-vbeln,
          fkart      TYPE vbrk-fkart,
          fkdat      TYPE vbrk-fkdat,
          netwr      TYPE vbrk-netwr,
          waerk      TYPE vbrk-waerk,
        END OF ty_data.
 
 DATA gt_data TYPE TABLE OF ty_data.
 DATA wa_data LIKE LINE OF gt_data.
 
 **********************************************************************
 *ALV DATA
 **********************************************************************
 DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
       gt_events   TYPE slis_t_event,
       gs_layout   TYPE slis_layout_alv.
 *--------------------------------------------------------------------*
 *
 *--------------------------------------------------------------------*
 SELECT-OPTIONS s_vbeln FOR wa_data-vbeln.
 
 *--------------------------------------------------------------------*
 START-OF-SELECTION.
 *--------------------------------------------------------------------*
 
   SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_data FROM vbrk UP TO 100 ROWS
                                                      WHERE vbeln IN s_vbeln.
 
   PERFORM display_alv.
 
 
 *&---------------------------------------------------------------------*
 *&      Form  SET_PF_STATUS
 *&---------------------------------------------------------------------*
 *       text
 *----------------------------------------------------------------------*
 *      -->RT_EXTAB   text
 *----------------------------------------------------------------------*
 FORM set_pf_status USING rt_extab TYPE slis_t_extab.        "#EC NEEDED
 
   SET PF-STATUS 'STAT_ALV'. "copiar de SALV_DEMO_TABLE_LAYOUT    SALV_STANDARD
 
 ENDFORM.                    "SET_PF_STATUS
 
 FORM user_command USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.
   CASE r_ucomm.
     WHEN 'PRINT'. "ICON_PRINT
      loop at gt_data into wa_data where checkbox = 'X'.
 * do something
        MESSAGE i000(0k) WITH 'Valor neto:' wa_data-netwr.
      endloop.
   ENDCASE.
 ENDFORM.
 
 FORM top_of_page.
 
 ENDFORM.
 
 FORM build_fieldcat.
   data ls_fieldcat like LINE OF gt_fieldcat.
 
   CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
     EXPORTING
       i_structure_name       = 'VBRK'
     CHANGING
       ct_fieldcat            = gt_fieldcat
     EXCEPTIONS
       inconsistent_interface = 1
       program_error          = 2
       OTHERS                 = 3.
   IF sy-subrc NE 0.
     EXIT.
   ENDIF.
 
   DELETE gt_fieldcat WHERE fieldname <> 'VBELN'
                        AND fieldname <> 'FKART'
                        AND fieldname <> 'FKDAT'
                        AND fieldname <> 'NETWR'
                        AND fieldname <> 'WAERK'.
 
   READ TABLE gt_fieldcat ASSIGNING FIELD-SYMBOL(<wa>) WITH KEY fieldname = 'NETWR'.
   <wa>-edit = 'X'.
 
 ENDFORM.
 *&---------------------------------------------------------------------*
 *&      Form  BUILD_EVENTS
 *&---------------------------------------------------------------------*
 *       Build events table
 *----------------------------------------------------------------------*
 FORM build_events.
   DATA: ls_event TYPE slis_alv_event.
 
   CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
     EXPORTING
       i_list_type = 0
     IMPORTING
       et_events   = gt_events[].
 
   MOVE 'DATA_CHANGED' TO ls_event-form.
   MOVE 'DATA_CHANGED' TO ls_event-name.
   APPEND ls_event TO gt_events.
 
 ENDFORM.                    " BUILD_EVENTS
 
 *&---------------------------------------------------------------------*
 *&      Form  BUILD_LAYOUT
 *&---------------------------------------------------------------------*
 *       Build layout for ALV grid report
 *----------------------------------------------------------------------*
 FORM build_layout.
   gs_layout-colwidth_optimize = 'X'.
   gs_layout-header_text       = 'Facturas'.
   gs_layout-box_fieldname     = 'CHECKBOX'.
 
 ENDFORM.                    " BUILD_LAYOUT
 
 *----------------------------------------------------------------------*
 *       FORM .......
 *----------------------------------------------------------------------*
 *       text
 *----------------------------------------------------------------------*
 *  -->  p1        text
 *  <--  p2        text
 *----------------------------------------------------------------------*
 FORM display_alv.
 
   DATA : ls_grid_setting TYPE lvc_s_glay.
 
   ls_grid_setting-edt_cll_cb = 'X'.
   DATA(l_repid) = sy-repid.
 
   PERFORM build_fieldcat.
   PERFORM build_events.
   PERFORM build_layout.
 
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
     EXPORTING
       i_callback_program       = l_repid
 *     i_callback_top_of_page   = 'TOP-OF-PAGE'  "see FORM
       i_callback_pf_status_set = 'SET_PF_STATUS'
       i_callback_user_command  = 'USER_COMMAND'
       i_grid_settings          = ls_grid_setting
       is_layout                = gs_layout
       it_fieldcat              = gt_fieldcat
 *     is_variant               = gv_variante
       it_events                = gt_events
 *     is_print                 = gd_prntparams
       i_save                   = 'X'
     TABLES
       t_outtab                 = gt_data
     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.
 
 ENDFORM.
 
 *&---------------------------------------------------------------------*
 *&      Form  data_changed
 *&---------------------------------------------------------------------*
 *       text
 *----------------------------------------------------------------------*
 *      -->RR_DATA    text
 *----------------------------------------------------------------------*
 FORM data_changed USING rr_data TYPE REF TO cl_alv_changed_data_protocol.
   DATA : ls_mod_cell TYPE lvc_s_modi.
   DATA: l_netwr TYPE vbrk-netwr.
 
   SORT rr_data->mt_mod_cells BY row_id .
   LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
     IF ls_mod_cell-fieldname = 'NETWR'.
       CALL METHOD rr_data->get_cell_value
         EXPORTING
           i_row_id    = ls_mod_cell-row_id
           i_fieldname = 'NETWR'
         IMPORTING
           e_value     = l_netwr.
 
       IF l_netwr > 10000. "valida monto no mayor a 1.000.000
         CALL METHOD rr_data->add_protocol_entry
           EXPORTING
             i_msgid     = '0K'
             i_msgno     = '000'
             i_msgty     = 'E'
             i_msgv1     = 'Monto mayor a 1.000.000'
             i_msgv2     = ''
             i_msgv3     = ''
             i_fieldname = ls_mod_cell-fieldname
             i_row_id    = ls_mod_cell-row_id.
         CONTINUE.
       ENDIF.
 
       ls_mod_cell-value = l_netwr.
 
 *   Para actualizar la celda.
 *    CALL METHOD rr_data->modify_cell
 *      EXPORTING
 *        i_row_id    = ls_mod_cell-row_id
 *        i_fieldname = ls_mod_cell-fieldname
 *        i_value     = ls_mod_cell-value.
 
     ENDIF.
 
   ENDLOOP.
 
 ENDFORM.