Autor Tema: INCLUDE para realizar ALV con Objetos  (Leído 7590 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Carlos

  • Usuario Sr.
  • ****
  • Mensajes: 177
    • Ver Perfil
INCLUDE para realizar ALV con Objetos
« en: 08 de Julio de 2011, 11:56:54 am »
Aquí dejo un Include para realizar ALV con Objetos

  • 1REP -> Primera llamada en Report (previa a CALL SCREEN).
  • 2REP -> Cambios en la descripción de los campos de la cab. del listado
  • 3REP -> Asignar o quitar la propiedad 'Campo Clave'
  • 1PBO -> Primera llamada en PBO. Container, Status y Título.
  • 2PBO -> Realización de un SPLIT en el listado.
  • 3PBO -> Listado simple.
  • 4PBO -> Picture en un container.


************************************************************************
********************** INCLUDE ZMETODOS ********************************
************************************************************************
*
* Índice
*
* 1REP -> Primera llamada en Report (previa a CALL SCREEN).
* 2REP -> Cambios en la descripción de los campos de la cab. del listado
* 3REP -> Asignar o quitar la propiedad 'Campo Clave'
*
* 1PBO -> Primera llamada en PBO. Container, Status y Título.
* 2PBO -> Realización de un SPLIT en el listado.
* 3PBO -> Listado simple.
* 4PBO -> Picture en un container.
*
*---------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
  CLASS lcl_event_receiver DEFINITION.
    PUBLIC SECTION.

*      methods handle_data_changed
*        for event data_changed of cl_gui_alv_grid
*        importing er_data_changed.

  ENDCLASS.

*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  class lcl_event_receiver implementation.
*
*    method handle_data_changed.
*      perform data_changed using er_data_changed.
*    endmethod.
*
*  endclass.

************************************************************************
* Declaraciones.
************************************************************************
  TYPE-POOLS: slis.

  DATA: repname LIKE sy-repid.

* Declaraciones generales para métodos.
  DATA: go_custom_container TYPE REF TO cl_gui_custom_container,
        lo_event_receiver   TYPE REF TO lcl_event_receiver,
        go_grid_listado     TYPE REF TO cl_gui_alv_grid,
        g_container_listado TYPE scrfname.

* Declaraciones Layout.
  DATA: gs_layout    TYPE lvc_s_layo,
        gs_variant   TYPE disvariant,
        gt_fieldcat  TYPE lvc_t_fcat,
        gt_fieldcat2 TYPE lvc_t_fcat,
        gt_sort      TYPE lvc_t_sort,
        fieldtab TYPE slis_t_fieldcat_alv,
        gs_fieldcat TYPE lvc_s_fcat,
        gs_fieldtab TYPE slis_fieldcat_alv.

  FIELD-SYMBOLS: <fieldcat> TYPE lvc_s_fcat,
                 <fs> TYPE LVC_S_FCAT.

* Variables para hacer el split del container.
*    data: container TYPE REF TO cl_gui_custom_container,
  DATA: container_1 TYPE REF TO cl_gui_container,
        container_2 TYPE REF TO cl_gui_container,
        splitter TYPE REF TO cl_gui_splitter_container.

* Variables para añadir el logo en el listado.
  TYPE-POOLS cndp.
  DATA: url(132),
        query_table LIKE w3query OCCURS 1 WITH HEADER LINE,
        html_table LIKE w3html OCCURS 1,
        return_code LIKE  w3param-ret_code,
        content_type LIKE  w3param-cont_type,
        content_length LIKE  w3param-cont_len,
        pic_data LIKE w3mime OCCURS 0,
        pic_size TYPE i,
        picture_1 TYPE REF TO cl_gui_picture,
        picture_2 TYPE REF TO cl_gui_picture.

************************************************************************
* Primera llamada en Report (previa a CALL SCREEN). (*)
************************************************************************
  FORM 1rep USING p_repname
                  p_tablename TYPE slis_tabname
                  indicador.

* Recogida de atributos de todos los campos de la tabla interna.
*
* Importante!!: La tabla interna no se tiene que definir como un data
* referenciado a una estructura type (Si se hace de este modo no
* reconocerá ningún campo). Utilizar siempre:
* Data begin of .....  occurs 0.
* Data end of ......
* No utilizar tampoco: Data: itab type standard table of ...............
*
    CLEAR: fieldtab.
    REFRESH: fieldtab.

    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
         EXPORTING
              i_program_name     = p_repname
              i_internal_tabname = p_tablename
              i_inclname         = p_repname
         CHANGING
              ct_fieldcat        = fieldtab.

* Asignación de atributos.

* El indicador nos dice si se trata de 1 tabla o de 2 tablas
* principalmente para utilizarlo en un listado tipo SPLIT.
    CASE indicador.
      WHEN '1'.
        CLEAR: gt_fieldcat.
        REFRESH: gt_fieldcat.
      WHEN '2'.
        CLEAR: gt_fieldcat2.
        REFRESH: gt_fieldcat2.
    ENDCASE.

    LOOP AT fieldtab INTO gs_fieldtab.
      CLEAR: gs_fieldcat.
      gs_fieldcat-fieldname  = gs_fieldtab-fieldname.
      gs_fieldcat-ref_table  = gs_fieldtab-ref_tabname.
      gs_fieldcat-outputlen  = gs_fieldtab-outputlen.
      gs_fieldcat-key        = gs_fieldtab-key.
      gs_fieldcat-tabname    = p_tablename.
      gs_fieldcat-scrtext_l  = gs_fieldtab-seltext_l.
      gs_fieldcat-scrtext_m  = gs_fieldtab-seltext_m.
      gs_fieldcat-scrtext_s  = gs_fieldtab-seltext_s.
      gs_fieldcat-coltext    = gs_fieldtab-seltext_m.
      gs_fieldcat-selddictxt = 'L'.
*    gs_fieldcat-edit       = gs_fieldtab-edit.
*    gs_fieldcat-auto_value = 'X'.

      CASE indicador.
        WHEN '1'.
          APPEND gs_fieldcat TO gt_fieldcat.
        WHEN '2'.
          APPEND gs_fieldcat TO gt_fieldcat2.
      ENDCASE.

    ENDLOOP.

  ENDFORM.

************************************************************************
* Segunda llamada en Report (previa a CALL SCREEN).
* Cambios en la descripción de los campos de la cabecera del listado.
************************************************************************
  FORM 2rep USING var1
                  pf_fieldname
                  pf_coltext
                  pf_scrtext_l
                  pf_scrtext_m
                  pf_scrtext_s.

    CASE var1.
      WHEN '1'.
        READ TABLE gt_fieldcat WITH KEY fieldname = pf_fieldname
           ASSIGNING <fieldcat>.
      WHEN '2'.
        READ TABLE gt_fieldcat2 WITH KEY fieldname = pf_fieldname
           ASSIGNING <fieldcat>.
    ENDCASE.

    IF sy-subrc EQ 0.
* Si el cuarto campo vale 'X' entonces todas las descripciones serán
* iguales.
      IF pf_scrtext_l = 'X'.
        <fieldcat>-scrtext_l    = pf_coltext.
        <fieldcat>-scrtext_m    = pf_coltext.
        <fieldcat>-scrtext_s    = pf_coltext.
        <fieldcat>-coltext      = pf_coltext.

      ELSE.
        <fieldcat>-scrtext_l    = pf_scrtext_l.
        <fieldcat>-scrtext_m    = pf_scrtext_m.
        <fieldcat>-scrtext_s    = pf_scrtext_s.
        <fieldcat>-coltext      = pf_coltext.
      ENDIF.
    ENDIF.

  ENDFORM.

************************************************************************
* Tercera llamada en Report (previa a CALL SCREEN).
* Asignar o quitar la propiedad 'Campo Clave'.
************************************************************************
  FORM 3rep USING var1 TYPE fieldname
                  var2 TYPE char1.

* Esta form asigna o quita la propiedad de campo clave. Los campos clave
* aparecen en color azul a la izquierda de la pantalla, y se quedan
* bloqueados sin que se puedan mover.
    TRANSLATE var1 TO UPPER CASE.
    READ TABLE gt_fieldcat WITH KEY fieldname = var1 ASSIGNING <fs>.
    IF sy-subrc EQ 0.
      <fs>-key = var2.
    ENDIF.

  ENDFORM.

************************************************************************
* Primera llamada en PBO. Container, Status y Título. (*)
************************************************************************
  FORM 1pbo USING var1 var2 var3.

    SET PF-STATUS var2.
    SET TITLEBAR var3.

    MOVE: var1 TO g_container_listado.

* Refrescamos el container si no estaba vacío.
    IF NOT go_custom_container IS INITIAL.
      CALL METHOD go_custom_container->free.
    ENDIF.

* Creamos el container.
    CREATE OBJECT go_custom_container
                 EXPORTING container_name = g_container_listado.

  ENDFORM.

************************************************************************
* Segunda llamada en PBO.  (*)
* Realización de un SPLIT en el listado.
* Este form es NO COMPATIBLE con el 3PBO (uno u otro).
************************************************************************
  FORM 2pbo TABLES tab1 tab2.

    CREATE OBJECT splitter
                      EXPORTING parent = go_custom_container
                                rows    = 1
                                columns = 2.

    CALL METHOD splitter->get_container
                      EXPORTING row      = 1
                                column   = 1
                      RECEIVING container = container_1.

    CALL METHOD splitter->get_container
                  EXPORTING row      = 1
                            column   = 2
                  RECEIVING container = container_2.

    CREATE OBJECT go_grid_listado
               EXPORTING i_parent = container_1.

    CREATE OBJECT lo_event_receiver.

    CALL METHOD go_grid_listado->register_edit_event
            EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    gs_layout-zebra      = 'X'.
    gs_layout-cwidth_opt = 'X'.
*    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_variant-report = repname.

    CALL METHOD go_grid_listado->set_table_for_first_display
         EXPORTING                     " i_buffer_active = 'X'
                   i_save          = 'A'
                   is_variant      = gs_variant
                   is_layout       = gs_layout
         CHANGING  it_fieldcatalog = gt_fieldcat
                   it_sort         = gt_sort
                   it_outtab       = tab1[].


    CREATE OBJECT go_grid_listado
                   EXPORTING i_parent = container_2.

    CREATE OBJECT lo_event_receiver.

    CALL METHOD go_grid_listado->register_edit_event
            EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    gs_layout-zebra      = 'X'.
    gs_layout-cwidth_opt = 'X'.
*    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_variant-report = repname.

    CALL METHOD go_grid_listado->set_table_for_first_display
            EXPORTING                     " i_buffer_active = 'X'
                      i_save          = 'A'
                      is_variant      = gs_variant
                      is_layout       = gs_layout
            CHANGING  it_fieldcatalog = gt_fieldcat2
                      it_sort         = gt_sort
                      it_outtab       = tab2[].

  ENDFORM.

************************************************************************
* Tercera llamada en PBO.  (*)
* Listado simple.
* Este form es NO COMPATIBLE con el 2PBO (uno u otro).
************************************************************************
  FORM 3pbo TABLES tab1.

    CREATE OBJECT go_grid_listado
               EXPORTING i_parent = go_custom_container.

    CREATE OBJECT lo_event_receiver.

    CALL METHOD go_grid_listado->register_edit_event
            EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter.

    gs_layout-zebra      = 'X'.
    gs_layout-cwidth_opt = 'X'.
*    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_variant-report = repname.

    CALL METHOD go_grid_listado->set_table_for_first_display
         EXPORTING                     " i_buffer_active = 'X'
                   i_save          = 'A'
                   is_variant      = gs_variant
                   is_layout       = gs_layout
         CHANGING  it_fieldcatalog = gt_fieldcat
                   it_sort         = gt_sort
                   it_outtab       = tab1[].

  ENDFORM.

************************************************************************
* Cuarta llamada en PBO.
* *.gif en un container.
*
* Crear la picture en SE38 -> Entorno -> Repository SAP Web ->
* -> Pincho datos Binarios... -> Crear
* Actualizar tb. los tipos MIME si fuera necesario (para añadir *.gif).
* Actualizar tb. el editor MIME para ese tipo si fuera necesario.
*
* Llamar con nombre de la picture creada y con la variable container.
* Ejemplo:
*   PERFORM gif_en_container USING 'ZLOGO' go_custom_container.
*
************************************************************************
  FORM gif_en_container USING var1 var2.

* Creamos la "picture" correspondiente.
    CREATE OBJECT picture_1
                  EXPORTING parent  = var2.

* Extracción de la URL.
    REFRESH query_table.
    query_table-name = '_OBJECT_ID'.
    query_table-value = var1.
    APPEND query_table.

    CALL FUNCTION 'WWW_GET_MIME_OBJECT'
         TABLES
              query_string        = query_table
              html                = html_table
              mime                = pic_data
         CHANGING
              return_code         = return_code
              content_type        = content_type
              content_length      = content_length
         EXCEPTIONS
              object_not_found    = 1
              parameter_not_found = 2
              OTHERS              = 3.
    IF sy-subrc = 0.
      pic_size = content_length.
    ENDIF.

    CALL FUNCTION 'DP_CREATE_URL'
         EXPORTING
              type     = 'image'
              subtype  = cndp_sap_tab_unknown
              size     = pic_size
              lifetime = cndp_lifetime_transaction
         TABLES
              data     = pic_data
         CHANGING
              url      = url
         EXCEPTIONS
              OTHERS   = 1.

* Cargamos la imagen en el listado.
    CALL METHOD picture_1->load_picture_from_url
            EXPORTING url = url.

    CALL METHOD cl_gui_cfw=>flush
            EXCEPTIONS cntl_system_error = 1
                       cntl_error = 2.
    IF sy-subrc <> 0.
    ENDIF.

  ENDFORM.