norman003
7/15/2019 - 3:17 PM

_alvshow #alv

_alvshow #alv

*----------------------------------------------------------------------*
* Mostrar alv
* Ver 1.0
*----------------------------------------------------------------------*
FORM _alv CHANGING ct_table TYPE STANDARD TABLE.

  DATA: ls_layo TYPE lvc_s_layo,
        lt_fcat TYPE lvc_t_fcat.
*        lt_event TYPE slis_t_event.
*        ls_vari TYPE disvariant.
*        ls_print TYPE lvc_s_prnt.
  FIELD-SYMBOLS: <fs_fcat> TYPE lvc_s_fcat.

  "Layout
  ls_layo-cwidth_opt  = abap_on.
  ls_layo-col_opt     = abap_on.
  ls_layo-zebra       = abap_on.
*  ls_layo-box_fname   = 'BOX'.       "Columna seleccionable
*  ls_layo-no_rowmark  = abap_on.     "Ocultar columna seleccionable
*  ls_layo-grid_title  = 'Reporte'.   "Título del reporte

** Para style por celda
*  ls_layo-stylefname  = 'T_STYLE'.   "Campo para añadir stylo por celda
*  t_style type lvc_t_styl
*  ls_style-fieldname = 'CANT'.
*  ls_style-style = cl_gui_alv_grid=>mc_style_disabled.
*  append ls_style into table ls_report-t_style.

** Para pintar filas
*  ls_report-color  = 'C700'.         "Fila se pintará, campo color en la tabla report
*  ls_layo-info_fname  = 'COLOR'.     "Nombre del Campo(char04) que lleva el color

* Para permitir grabar variante
*  ls_vari-handle   = sy-dynnr.
*  ls_vari-username = sy-uname.
*  ls_vari-report   = sy-repid.
*  ls_vari-variant  = i_variant.      "Disposición personalizado

** Para imprimir
*  ls_print-prntselinf = 'X'.
*  ls_print-prntlstinf = 'X'.

**Añadir evento
*   perform _100eventos changing lt_event.

  "Catálogo   
*  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
*    EXPORTING
*      i_structure_name = sy-repid(30)
*    CHANGING
*      ct_fieldcat      = lt_fcat.
  PERFORM _getfcat USING abap_on CHANGING ct_table lt_fcat.

  "Fcat - Descripción
  "LOOP AT lt_fcat ASSIGNING <fs_fcat>.
    " CASE <fs_fcat>-fieldname.
      "WHEN 'ICON'.       <fs_fcat>-hotspot = abap_on. <fs_fcat>-just = 'C'.
      "WHEN 'MESSAGE4'.   <fs_fcat>-tech = abap_on.
      "WHEN 'TEXT'.       <fs_fcat>-edit = abap_on.
      "WHEN 'STAT_USER'.  <fs_fcat>-outputlen = 4.
      "WHEN 'NETWR'.      <fs_fcat>-emphasize = 'C700'.
      "WHEN 'K0001'.      PERFORM _fcatname USING 'Observación' '' CHANGING <fs_fcat>.
    " ENDCASE.
  "ENDLOOP.

  "Alv
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_bypassing_buffer = abap_on
      i_buffer_active    = abap_on
      i_callback_program = sy-repid
*      i_callback_pf_status_set = '_100ST'
*      i_callback_top_of_page   = '_100TOP'
*      i_callback_user_command  = '_100UC'
*      i_grid_title       = 'Titulo'
      is_layout_lvc      = ls_layo
      it_fieldcat_lvc    = lt_fcat
      i_save             = 'A'
*      is_variant         = ls_vari
*      is_print_lvc       = ls_print
    TABLES
      t_outtab           = ct_table
    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.

*----------------------------------------------------------------------*
* Obtiene catálogo de manera dinámica
*----------------------------------------------------------------------*
FORM _getfcat USING i_clearpos TYPE xfeld
              CHANGING ct_table TYPE STANDARD TABLE
                       et_fcat  TYPE lvc_t_fcat.
  DATA: lo_alv  TYPE REF TO cl_salv_table,
        lo_cols TYPE REF TO cl_salv_columns_table,
        lo_aggr TYPE REF TO cl_salv_aggregations,
        ls_fcat LIKE LINE OF et_fcat.

  TRY .
      cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
                               CHANGING t_table = ct_table ).
    CATCH cx_salv_msg.                                  "#EC NO_HANDLER
  ENDTRY.

  lo_cols = lo_alv->get_columns( ).
  lo_aggr = lo_alv->get_aggregations( ).
  et_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
    r_columns = lo_cols
    r_aggregations = lo_aggr
  ).

  IF i_clearpos = abap_on.
    MODIFY et_fcat FROM ls_fcat TRANSPORTING col_pos WHERE col_pos <> space.
  ENDIF.
ENDFORM.

*----------------------------------------------------------------------*
* Modificar nombre de un campo de catálogo
*----------------------------------------------------------------------*
FORM _fcatname USING i_unico TYPE clike "Recomendable 20
                     i_large TYPE clike "Recomendable 40
               CHANGING cs_fcat TYPE lvc_s_fcat.
  DATA: l_large TYPE string.

  "Inicializa
  CLEAR: cs_fcat-scrtext_s.
  CLEAR: cs_fcat-scrtext_m.
  CLEAR: cs_fcat-rollname.

  l_large = i_large.
  IF l_large IS INITIAL.
    l_large = i_unico.
  ENDIF.

  "Asigna textos
  IF strlen( i_unico ) LE 10.
    cs_fcat-scrtext_s = i_unico.  "10
  ENDIF.
  IF strlen( i_unico ) LE 20.
    cs_fcat-scrtext_m = i_unico.  "20
  ENDIF.

  cs_fcat-coltext = i_unico.      "40
  cs_fcat-reptext = i_unico.      "55

  cs_fcat-seltext   = l_large.    "40
  cs_fcat-scrtext_l = l_large.    "40

ENDFORM.

*----------------------------------------------------------------------*
* Status del alv 0100 sin status
*----------------------------------------------------------------------*
FORM _100st USING ct_excl TYPE slis_t_extab.
  data: lt_fcode  type table of smp_dyntxt,
        ls_fcode  like line of lt_fcode.

  "Añadir a exclusión
  APPEND '&AQW'     TO ct_excl. "ambos - tratamiento de textos
  APPEND '%PC'      TO ct_excl. "ambos - fichero local
  APPEND '%SL'      TO ct_excl. "ambos - envio mail
  APPEND '&ABC'     TO ct_excl. "ambos - abc
  APPEND '&VEXCEL'  TO ct_excl. "alv grid - excel incrustado
  APPEND '&GRAPH'   TO ct_excl. "alv grid - grafico
  APPEND '&INFO'    TO ct_excl. "alv grid - info
  APPEND 'DNOT'     TO ct_excl. "alv list - visualizar nota
  APPEND 'CNOT'     TO ct_excl. "alv list - tratar nota
  APPEND '&REFRESH' TO ct_excl. "ambos - refrescar
  "APPEND '&DATA_SAVE'  TO ct_excl. "alv list - grabar
  
  "Hana
  SELECT SINGLE COUNT(*) FROM cvers WHERE component = 'S4CORE'.
  IF sy-subrc = 0.
    APPEND '&UMC'   TO ct_excl. "ambos - suma
    APPEND '&SUM'   TO ct_excl. "ambos - subtotal
    APPEND '&OL0'   TO ct_excl. "ambos - modificar disposición
    APPEND '&AVE'   TO ct_excl. "ambos - grabar disposición
  ENDIF.

  ""Añadir FC01
  "ls_fcode-icon_id   = icon_print.
  "ls_fcode-icon_text = 'Imprimir'.
  "ls_fcode-text      = 'Imprimir Formulario'.
  "APPEND ls_fcode TO lt_fcode.

  PERFORM dynamic_report_fcodes IN PROGRAM rhteiln0 TABLES lt_fcode USING ct_excl '' ''.
  SET PF-STATUS 'ALVLIST' EXCLUDING ct_excl OF PROGRAM 'RHTEILN0'.
ENDFORM.

*----------------------------------------------------------------------*
* User_command del alv 0100
*----------------------------------------------------------------------*
FORM _100uc USING i_ucomm TYPE sy-ucomm
                  cs_sel  TYPE slis_selfield.
*  DATA: ls_report LIKE LINE OF gt_report.

  CASE i_ucomm.
    WHEN '&IC1'.  "Evento click
*      READ TABLE gt_report INTO ls_report INDEX cs_sel-tabindex.
*      CASE cs_sel-fieldname.
*        WHEN 'ICON'. go_con->ver_detalle( ls_report ).
*        WHEN 'VBELN'. PERFORM _show_va03 USING ls_report-vbeln.
*        WHEN 'STAT'. PERFORM _showalvpopup USING 160 12 ls_report-t_statu.
*        WHEN OTHERS.
*      ENDCASE.
    WHEN 'FC01'.
    WHEN '&DATA_SAVE'.
    WHEN '/&REFRESH'.
*      PERFORM create_report.
      cs_sel-refresh = abap_on.
      cs_sel-col_stable = abap_on.
      cs_sel-row_stable = abap_on.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

*----------------------------------------------------------------------*
*	Verifica selección
*----------------------------------------------------------------------*
FORM _100isselected.

*  DATA: ls_report LIKE LINE OF gt_report.

*  READ TABLE gt_report WITH KEY box = abap_on TRANSPORTING NO FIELDS.
  IF sy-subrc <> 0.
*    MESSAGE s000 WITH 'Debe seleccionar linea(s)'.
    sy-subrc = 1.
  ENDIF.

ENDFORM.