14 febrero, 2012

Uso de Splitter, eventos, celdas editables, cuadro de listas, gestión de botones estandar, creación botones propios.

Posted in ABAP, ALV OO a 7:09 pm por sapyabap


He creado este programa a modo de ejemplo, para mostrar el uso de los manejadores de eventos, objetos, etc … más comúnes a la hora de crear un ALV. Utiliza las tablas SPFLI y  SBOOK (Itinerarios de vuelos y reservas).

El informe contiene un splitter con dos grid. El superior muestra los itinerarios de vuelos de las compañias. Al hacer doble click sobre un registro del grid superior, nos mostrará en el grid de abajo todas las reservas para ese vuelo.

Al hacer un doble click sobre un registro del grid inferior, mostrará un pop-up con dicho registro.

También muestra como crear una celda editable a nivel de columna(campo peso equipaje), así como un cuadro de lista(campo medida).

Sirve también de ejemplo, para ver como excluir los botones estandar de un ALV y crear nuestros propios botones.

Ejemplo ALV.

 REPORT  zvuelos.

TYPE-POOLS: slis.

********************* Tablas DD ****************************************
TABLES: spfli, sbook.
************************************************************************

********************* Tablas internas **********************************
DATA: it_vuelos TYPE TABLE OF spfli WITH HEADER LINE,
      it_reservas TYPE TABLE OF sbook WITH HEADER LINE,
      it_fieldcat TYPE lvc_t_fcat.
************************************************************************

********************* Estructuras **************************************
DATA: wa_layout   TYPE lvc_s_layo,
      wa_reservas LIKE LINE OF it_reservas.
************************************************************************

********************* Includes *****************************************
INCLUDE zvuelvos_clases.
************************************************************************
********************* Clases *******************************************
CLASS lcl_application DEFINITION DEFERRED.
CLASS cl_gui_cfw      DEFINITION LOAD.
************************************************************************

********************* Variables ****************************************
DATA: contenedor TYPE REF TO cl_gui_custom_container, “Contenedor.
      g_application TYPE REF TO lcl_application,
      splitter TYPE REF TO cl_gui_splitter_container,
      contenedorgrid1 TYPE REF TO cl_gui_container, “Grid Contenedor.
      contenedorgrid2 TYPE REF TO cl_gui_container, “Grid Contenedor.
      grid1 TYPE REF TO cl_gui_alv_grid,
      grid2 TYPE REF TO cl_gui_alv_grid.
************************************************************************

********************* Pantalla de Selección ****************************
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001.

SELECT-OPTIONS:
              so_cia FOR spfli-carrid,
              so_paiso FOR spfli-countryfr, “Clave pais origen
              so_ciuor FOR spfli-cityfrom, ” Ciudad origen
              so_paisd FOR spfli-countryto,” Clave pais destino
              so_ciude FOR spfli-cityto. “Ciudad destiono
SELECTION-SCREEN END OF BLOCK block1.
************************************************************************

START-OF-SELECTION.

  CALL SCREEN ‘0100’.
*&———————————————————————*
*&      Module  STATUS_0100  OUTPUT
*&———————————————————————*
*       text
*———————————————————————-*
MODULE status_0100 OUTPUT.
  SET PF-STATUS ‘STATUS0100’.
  SET TITLEBAR ‘TITLE0100’.

  IF contenedor IS INITIAL.

    CREATE OBJECT contenedor
        EXPORTING container_name = ‘CONTENEDOR’.

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

* Contenedores del splitter
    CALL METHOD splitter->get_container
      EXPORTING
        row       = 1
        column    = 1
      RECEIVING
        container = contenedorgrid1.
* Contenedores del splitter
    CALL METHOD splitter->get_container
      EXPORTING
        row       = 2
        column    = 1
      RECEIVING
        container = contenedorgrid2.

    CREATE OBJECT grid1
          EXPORTING i_parent = contenedorgrid1.

    CREATE OBJECT grid2
          EXPORTING i_parent = contenedorgrid2.

    CREATE OBJECT g_application.
    SET HANDLER g_application->handle_double_clickgrid1 FOR grid1.
    SET HANDLER g_application->handle_toolbargrid1 FOR grid1.
    SET HANDLER g_application->handle_user_commandgrid1 FOR grid1.

    SET HANDLER g_application->handle_double_clickgrid2 FOR grid2.

    PERFORM obtener_datos_vuelos TABLES it_vuelos so_cia
                                                  so_paiso so_ciuor
                                                  so_paisd so_ciude.

    PERFORM mostrar_datos TABLES it_vuelos.

  ENDIF.

ENDMODULE.                 ” STATUS_0100  OUTPUT
*&———————————————————————*
*&      Module  SALIR  INPUT
*&———————————————————————*
*       text
*———————————————————————-*
MODULE salir INPUT.
  CASE sy-dynnr.
    WHEN ‘0100’.
      LEAVE PROGRAM.
    WHEN ‘0200’.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.                 ” SALIR  INPUT
*&———————————————————————*
*&      Form  OBTENER_DATOS_VUELOS
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM obtener_datos_vuelos TABLES t_vuelos STRUCTURE spfli
                                 r_cia STRUCTURE so_cia
                                 r_paiso STRUCTURE so_paiso
                                 r_ciuor STRUCTURE so_ciuor
                                 r_paisd STRUCTURE so_paisd
                                 r_ciude STRUCTURE so_ciude.

  SELECT *
  INTO CORRESPONDING FIELDS OF TABLE t_vuelos
  FROM spfli CLIENT SPECIFIED
  WHERE mandt = sy-mandt AND
        carrid IN r_cia AND
        countryfr IN r_paiso AND
        cityfrom IN r_ciuor AND
        countryto IN r_paisd AND
        cityto IN r_ciude.

ENDFORM.                    ” OBTENER_DATOS_VUELOS
*&———————————————————————*
*&      Form  MOSTRAR_DATOS
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_IT_VUELOS  text
*———————————————————————-*
FORM mostrar_datos TABLES t_vuelos STRUCTURE spfli.

  CALL METHOD grid1->set_table_for_first_display
    EXPORTING
      i_structure_name = ‘SPFLI’
      is_layout        = wa_layout
    CHANGING
      it_outtab        = t_vuelos[].

ENDFORM.                    ” MOSTRAR_DATOS
*&———————————————————————*
*&      Form  OBTENER_RESERVA
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_IT_VUELOS  text
*      –>P_E_ROW  text
*———————————————————————-*
FORM obtener_reserva  TABLES   t_vuelos STRUCTURE it_vuelos
                               t_reservas STRUCTURE it_reservas
                      USING fila.

  READ TABLE t_vuelos INDEX fila.
  IF sy-subrc = 0.
    SELECT *
    INTO CORRESPONDING FIELDS OF TABLE t_reservas
    FROM sbook CLIENT SPECIFIED
    WHERE mandt = sy-mandt AND
          carrid = t_vuelos-carrid AND
          connid = t_vuelos-connid.
  ENDIF.

ENDFORM.                    ” OBTENER_RESERVA
*&———————————————————————*
*&      Form  MOSTRAR_RESERVAS
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_IT_RESERVAS  text
*———————————————————————-*
FORM mostrar_reservas TABLES t_reservas STRUCTURE it_reservas
                             t_fieldcat TYPE lvc_t_fcat.

  DATA: lt_excluir TYPE ui_functions.

  PERFORM generar_fieldcat_reservas USING ‘LUGGWEIGHT’ “Equipaje
                                          ‘WUNIT’ “Unidad Peso
                                    CHANGING t_fieldcat[].

  PERFORM cuadro_lista_grid2 USING ‘WUNIT’.
  PERFORM excluir_funciones CHANGING lt_excluir.

  CALL METHOD grid2->set_table_for_first_display
    EXPORTING
      i_structure_name = ‘SBOOK’
    CHANGING
      it_outtab        = t_reservas[]
      it_fieldcatalog  = t_fieldcat[].

* Set editable cells to ready for input initially
  CALL METHOD grid2->set_ready_for_input
    EXPORTING
      i_ready_for_input = 1.

ENDFORM.                    ” MOSTRAR_RESERVAS
*&———————————————————————*
*&      Module  STATUS_0200  OUTPUT
*&———————————————————————*
*       text
*———————————————————————-*
MODULE status_0200 OUTPUT.
  SET PF-STATUS ‘STATUS0200’.
  SET TITLEBAR ‘TITLE0200’.

ENDMODULE.                 ” STATUS_0200  OUTPUT
*&———————————————————————*
*&      Form  EDITAR_RESERVA
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_IT_RESERVAS  text
*      <–P_WA_RESERVAS  text
*———————————————————————-*
FORM editar_reserva  TABLES t_reservas STRUCTURE it_reservas
                     USING fila
                     CHANGING wa LIKE wa_reservas.
  CLEAR wa.
  READ TABLE t_reservas INDEX fila.
  IF sy-subrc = 0.
    MOVE t_reservas TO wa.
  ENDIF.

ENDFORM.                    ” EDITAR_RESERVA
*&———————————————————————*
*&      Form  GENERAR_FIELDCAT_RESERVAS
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_T_RESERVAS  text
*———————————————————————-*
FORM generar_fieldcat_reservas  USING  campo_editable
                                       campo_lista
                                CHANGING t_fieldcat TYPE lvc_t_fcat.

  DATA: wa_fieldcat LIKE lvc_s_fcat.

  CALL FUNCTION ‘LVC_FIELDCATALOG_MERGE’
   EXPORTING
*         I_BUFFER_ACTIVE              =
     i_structure_name             = ‘SBOOK’
     i_client_never_display       = ‘X’
*     i_bypassing_buffer           =
*     i_internal_tabname           =
    CHANGING
      ct_fieldcat                  = t_fieldcat
   EXCEPTIONS
     inconsistent_interface       = 1
     program_error                = 2
     OTHERS                       = 3.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  IF campo_editable IS NOT INITIAL.
    LOOP AT t_fieldcat INTO wa_fieldcat.
      IF wa_fieldcat-fieldname = campo_editable.
        wa_fieldcat-edit = ‘X’.
        MODIFY t_fieldcat FROM wa_fieldcat.
      ENDIF.

    ENDLOOP.
  ENDIF.

  IF campo_lista IS NOT INITIAL.
    LOOP AT t_fieldcat INTO wa_fieldcat.
      IF wa_fieldcat-fieldname = campo_lista.
        wa_fieldcat-drdn_hndl =’1′.
        wa_fieldcat-outputlen = 7.
        MODIFY t_fieldcat FROM wa_fieldcat.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDFORM.                    ” GENERAR_FIELDCAT_RESERVAS
*&———————————————————————*
*&      Form  CUADRO_LISTA_GRID2
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_0404   text
*———————————————————————-*
FORM cuadro_lista_grid2  USING campo_lista.

  DATA: it_dropdownlist TYPE lvc_t_drop,
        wa_dropdownlist TYPE lvc_s_drop.

  wa_dropdownlist-handle = ‘1’.
  wa_dropdownlist-value =’KG’.
  APPEND wa_dropdownlist TO it_dropdownlist.

  wa_dropdownlist-handle = ‘1’.
  wa_dropdownlist-value =’G’.
  APPEND wa_dropdownlist TO it_dropdownlist.

  CALL METHOD grid2->set_drop_down_table
    EXPORTING
      it_drop_down = it_dropdownlist.

ENDFORM.                    ” CUADRO_LISTA_GRID2
*&———————————————————————*
*&      Form  EXCLUIR_FUNCIONES
*&———————————————————————*
*       text
*———————————————————————-*
*      –>P_LT_EXCLUIR  text
*———————————————————————-*
FORM excluir_funciones CHANGING t_excluir TYPE ui_functions..

  DATA ls_exclude TYPE ui_func.

  ls_exclude = cl_gui_alv_grid=>mc_fc_sum.
  APPEND ls_exclude TO t_excluir.
  ls_exclude = cl_gui_alv_grid=>mc_fc_filter.
  APPEND ls_exclude TO t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
*  append ls_exclude to t_excluir.
*  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
*  append ls_exclude to t_excluir.

ENDFORM.                    ” EXCLUIR_FUNCIONES

 *&———————————————————————*
*&  Include           ZVUELVOS_CLASES
*&———————————————————————*

CLASS lcl_application DEFINITION.

  PUBLIC SECTION.
    METHODS handle_double_clickgrid1
          FOR EVENT double_click OF cl_gui_alv_grid
          IMPORTING e_row e_column es_row_no.

    METHODS handle_double_clickgrid2
          FOR EVENT double_click OF cl_gui_alv_grid
          IMPORTING e_row e_column es_row_no.

    METHODS handle_toolbargrid1
          FOR EVENT toolbar OF cl_gui_alv_grid
          IMPORTING e_object e_interactive.

    METHODS handle_user_commandgrid1
          FOR EVENT user_command OF cl_gui_alv_grid
          IMPORTING e_ucomm.

ENDCLASS.                    “lcl_application DEFINITION
*———————————————————————-

*       CLASS lcl_application IMPLEMENTATION
*———————————————————————-

*
*———————————————————————-

CLASS lcl_application IMPLEMENTATION.

  METHOD handle_double_clickgrid1.
    PERFORM obtener_reserva TABLES it_vuelos
                                   it_reservas
                            USING e_row.

    PERFORM mostrar_reservas TABLES it_reservas
                                    it_fieldcat.
  ENDMETHOD.                    “handle_double_click

  METHOD handle_double_clickgrid2.
    PERFORM editar_reserva TABLES it_reservas
                           USING e_row
                           CHANGING wa_reservas.
    IF wa_reservas IS NOT INITIAL.
      CALL SCREEN ‘0200’ STARTING AT 05 05
                           ENDING AT  80 15.
    ENDIF.

  ENDMETHOD.                    “handle_double_clickgrid2

  METHOD handle_toolbargrid1.

    DATA: ls_toolbar TYPE stb_button.

    CLEAR ls_toolbar.
    MOVE 3 TO ls_toolbar-butn_type.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR ls_toolbar.
    MOVE 0 TO ls_toolbar-butn_type.
    MOVE ‘Tipo0’ TO ls_toolbar-function.
    MOVE icon_employee TO ls_toolbar-icon.
    MOVE ‘Tipo 0’ TO ls_toolbar-quickinfo.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    MOVE 1 TO ls_toolbar-butn_type.
    MOVE ‘Tipo1’ TO ls_toolbar-function.
    MOVE icon_dummy TO ls_toolbar-icon.
    MOVE ‘Tipo 1’ TO ls_toolbar-quickinfo.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    MOVE 2 TO ls_toolbar-butn_type.
    MOVE ‘Tipo2’ TO ls_toolbar-function.
    MOVE icon_dummy TO ls_toolbar-icon.
    MOVE ‘Tipo 2’ TO ls_toolbar-quickinfo.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    MOVE 3 TO ls_toolbar-butn_type.
    MOVE ‘Tipo3’ TO ls_toolbar-function.
    MOVE icon_checked TO ls_toolbar-icon.
    MOVE ‘Tipo 3’ TO ls_toolbar-quickinfo.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    MOVE 4 TO ls_toolbar-butn_type.
    MOVE ‘Tipo4’ TO ls_toolbar-function.
    MOVE icon_incomplete TO ls_toolbar-icon.
    MOVE ‘Tipo 4’ TO ls_toolbar-quickinfo.
    APPEND ls_toolbar TO e_object->mt_toolbar.

    MOVE 5 TO ls_toolbar-butn_type.
    MOVE ‘Tipo5’ TO ls_toolbar-function.
    MOVE icon_failure TO ls_toolbar-icon.
    MOVE ‘Tipo 5’ TO ls_toolbar-quickinfo.
    APPEND ls_toolbar TO e_object->mt_toolbar.

  ENDMETHOD.             “handle_double_click

  METHOD handle_user_commandgrid1.
  ENDMETHOD.                    “user_command

ENDCLASS.                    “lcl_application IMPLEMENTATION

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: