Autor Tema: ALV orientado a objetos  (Leído 26111 veces)

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

Desconectado Neo_25

  • Novato
  • *
  • Mensajes: 17
    • Ver Perfil
ALV orientado a objetos
« en: 14 de Mayo de 2009, 02:26:20 pm »
Muy buenas.
He creado un ALV orientado a objetos:
- he creado el contenedor
- el objeto ALV
- el catálogo
- layout:
    g_layout_a-sel_mode   = 'A'.  "pestaña marcar
    g_layout_a-box_fname  = 'MARCAR'.
    g_layout_a-col_opt = 'X'.
    g_layout_a-cwidth_opt = 'X'.  "se ajusta el texto a la casilla
    g_layout_a-zebra = 'X'.
- muestro en el ALV la tabla q kiero: i_mail[]

Todo bien.

Imaginar q hay varias líneas en el ALV, y nosotros marcamos la 1ª y la 3ª.
Kiero q al dar a un botón se marke con una X un campo q hay en la i_mail q es marcar de char1.

No se leer de la ALV la pestaña q se marca y según cual sea escribir en un a tabla interna.

Gracias de antemano

Desconectado Nuria

  • Usuario Completo
  • ***
  • Mensajes: 90
    • Ver Perfil
Re: ALV orientado a objetos
« Respuesta #1 en: 14 de Mayo de 2009, 03:33:47 pm »
Las líneas marcadas se recuperan con este método.

Código: [Seleccionar]
  DATA: lf_et_index_rows TYPE lvc_t_row,
        lf_et_row_no TYPE lvc_t_roid.

Código: [Seleccionar]
    CALL METHOD go_grid_listado->get_selected_rows
      IMPORTING
        et_index_rows = lf_et_index_rows
        et_row_no     = lf_et_row_no.


Un saludo.

Desconectado Neo_25

  • Novato
  • *
  • Mensajes: 17
    • Ver Perfil
Re: ALV orientado a objetos
« Respuesta #2 en: 15 de Mayo de 2009, 10:11:22 am »
Perfecto. Muchas gracias Nuria.

Kisiera hacer otra preguntilla, q supongo básica, pero no lo veo.

He obtenido las filas marcadas en la tabla lf_et_row_no. El campo ROW_ID de esa tabla tiene los números de las filas marcadas, por ejemplo (2 y 4).

Tengo una i_tabla con un campo MARCAR (char1), q tiene por ejemplo 5 filas.

Y kiero marcar la  i_tabla-marcar[2] = 'X'    y
                        i_tabla-marcar[4] = 'X'

¿Supongo q será un insert o un update, pero se puede indicar el campo y la posición de la tabla interna a la q le kieres meter un cierto valor?

Supongo q no será mu complicado, pero no lo veo.

Gracias de nuevo por adelantado

Desconectado Neo_25

  • Novato
  • *
  • Mensajes: 17
    • Ver Perfil
Re: ALV orientado a objetos
« Respuesta #3 en: 15 de Mayo de 2009, 12:40:00 pm »
Solucionado, pero sin marcar la X en el campo. Como ya tengo las líneas q selecciono cojo de ellas la información q me interesa.

Pongo el código q he usado por si a alguien le puede venir bien:
*  saco los email de las personas a las q se mandarán 
  DATA: lv_emails_a TYPE string.
*  obtengo el nº de fila que se ha marcado en alv_a
*  con esos nº guardo los emails en strings

  DATA: li_indices_filas_a    TYPE lvc_t_row,
           li_numeros_filas_a  TYPE lvc_t_roid.
*  filas marcadas en alv_a
  CALL METHOD g_grid_a->get_selected_rows
    IMPORTING
      et_index_rows = li_indices_filas_a
      et_row_no      = li_numeros_filas_a.
*  saco los emails para a
  IF NOT li_numeros_filas_a IS INITIAL.
    LOOP AT li_numeros_filas_a ASSIGNING <lw_numeros_filas>.
      READ TABLE i_mail_a ASSIGNING <w_tab_mail_a> INDEX <lw_numeros_filas>-row_id.
      CONCATENATE lv_emails_a <w_tab_mail_a>-email ';' INTO lv_emails_a.
    ENDLOOP.
  ENDIF.

Gracias por todo.

Desconectado javi.mart

  • Novato
  • *
  • Mensajes: 5
    • Ver Perfil
Re: ALV orientado a objetos
« Respuesta #4 en: 21 de Mayo de 2009, 11:05:32 pm »
Buenas,

Yo necesito hacer una ALV orientada a objetos puesto que tengo que meter en la misma dynpro 2 alv, podrías poner el codigo del alv entero para poder tener un ejemplo.

Muchas gracias!!!

Desconectado Nuria

  • Usuario Completo
  • ***
  • Mensajes: 90
    • Ver Perfil
Re: ALV orientado a objetos
« Respuesta #5 en: 22 de Mayo de 2009, 09:09:06 am »
Hola,

te dejo un ejemplo de un ALV con objetos bastante resumido.

Recuerda que tienes que crearte el CONTAINER en el MODULE POOL.


Este sería el código del programa.

*&---------------------------------------------------------------------*
*& Report  ZALV_OO_SENCILLO
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZALV_OO_SENCILLO.

************************************************************************
* INCLUDE
************************************************************************
INCLUDE: zalv.

************************************************************************
* TABLES
************************************************************************
TABLES: mara,             " Datos generales material
        marc,             " Datos centro p.material
        mard,             " Datos de almacén para el material
        makt.             " Textos breves de material




************************************************************************
*DATA
************************************************************************
DATA: BEGIN OF gt_listado OCCURS 0,
        matnr               LIKE mara-matnr,       " Material
        werks               LIKE mard-werks,       " Centro
        lgort               LIKE mard-lgort,       " Almacen
        mtart               LIKE mara-mtart,       " Tipo Material
        eisbe_uv            LIKE marc-eisbe,       " Stock seguridad
        eisbe_umb           LIKE marc-eisbe,       " Stock seguridad
        mabst_uv            LIKE marc-mabst,       " Stock máximo
        mabst_umb           LIKE marc-mabst,       " Stock máximo
        maktx               LIKE makt-maktx,       " Descrip. material
        color_celdas        TYPE lvc_t_scol,
      END OF gt_listado.




DATA: g_container_listado     TYPE scrfname VALUE 'CONTAINER_LISTADO',
      go_grid_listado         TYPE REF TO cl_gui_alv_grid,
      go_custom_container     TYPE REF TO cl_gui_custom_container.

DATA: gt_f4                   TYPE lvc_t_f4.
DATA: gs_f4                   TYPE lvc_s_f4.

DATA: gs_layout               TYPE lvc_s_layo.
DATA: gs_variant              TYPE disvariant.

DATA: gs_fieldcat             TYPE lvc_s_fcat.
DATA: gt_fieldcat             TYPE lvc_t_fcat.

DATA: gs_fieldtab             TYPE slis_fieldcat_alv.

DATA: gt_sort                 TYPE lvc_t_sort.

DATA: gf_okcode               TYPE ok.

FIELD-SYMBOLS: <fieldcat>     TYPE lvc_s_fcat.


*---------------------------------------------------------------------*
*       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.

    METHODS handle_data_changed_finished
      FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified
                et_good_cells.

    METHODS handle_toolbar
    FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object e_interactive.


    METHODS handle_user_command
    FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm.

ENDCLASS.                    "lcl_event_receiver DEFINITION


*---------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.
    PERFORM data_changed USING er_data_changed.
  ENDMETHOD.                    "handle_data_changed


  METHOD handle_data_changed_finished.
    PERFORM data_changed_finished USING e_modified
                                        et_good_cells.
  ENDMETHOD.                    "handle_data_changed_finished



  METHOD handle_toolbar.
    PERFORM barra_herramientas USING e_object
                                     e_interactive.
  ENDMETHOD.                    "handle_toolbar


  METHOD handle_user_command.
    PERFORM user_command USING e_ucomm.
  ENDMETHOD.                    "handle_user_command

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION





************************************************************************
*SELECTION-SCREEN
************************************************************************
SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME.

SELECT-OPTIONS: s_werks FOR mard-werks.           " Centro
SELECT-OPTIONS: s_lgort FOR mard-lgort.           " Almacen
SELECT-OPTIONS: s_mtart FOR mara-mtart.           " Tipo Material
SELECT-OPTIONS: s_matnr FOR mara-matnr.           " Material

SELECTION-SCREEN END OF BLOCK b01.






************************************************************************
*START-OF-SELECTION
************************************************************************
START-OF-SELECTION.


  PERFORM recuperar_datos.

  PERFORM datos_listado.

************************************************************************
*END-OF-SELECTION
************************************************************************
END-OF-SELECTION.

  PERFORM mostrar_listado.













*&---------------------------------------------------------------------*
*&      Form  recuperar_datos
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM recuperar_datos .

  SELECT mara~matnr
         marc~werks
*         mard~lgort
         mara~mtart
         marc~eisbe
         marc~mabst
         makt~maktx
  INTO (gt_listado-matnr,
        gt_listado-werks,
*        gt_listado-lgort,
        gt_listado-mtart,
        gt_listado-eisbe_uv,
        gt_listado-mabst_uv,
        gt_listado-maktx)
  FROM marc AS marc
  INNER JOIN mara AS mara
     ON mara~matnr EQ marc~matnr
  INNER JOIN makt AS makt
     ON makt~matnr EQ mara~matnr
*  INNER JOIN mard AS mard
*     ON mard~matnr EQ makt~matnr
*    AND mard~werks EQ marc~werks

  WHERE mara~matnr IN s_matnr
    AND marc~werks IN s_werks
*    AND mard~lgort IN s_lgort
    AND mara~mtart IN s_mtart
    AND makt~spras EQ sy-langu.

    APPEND gt_listado.
    CLEAR  gt_listado.
  ENDSELECT.

ENDFORM.                    " recuperar_datos

*&---------------------------------------------------------------------*
*&      Form  datos_listado
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM datos_listado .

  LOOP AT gt_listado.
    PERFORM md_convert_material_unit USING gt_listado-matnr
                                           gt_listado-eisbe_uv
                                           gt_listado-eisbe_umb.

    PERFORM md_convert_material_unit USING gt_listado-matnr
                                           gt_listado-mabst_uv
                                           gt_listado-mabst_umb.

    MODIFY gt_listado.
    CLEAR  gt_listado.
  ENDLOOP.

ENDFORM.                    " datos_listado

*&---------------------------------------------------------------------*
*&      Form  mostrar_listado
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM mostrar_listado .

  repname = sy-repid.

* Descripción estándar de campos
  PERFORM obt_descrip_campos_tabla USING repname 'GT_LISTADO'.

  CLEAR gt_fieldcat[].

  LOOP AT fieldtab INTO gs_fieldtab.
    CLEAR gs_fieldcat.
    gs_fieldcat-fieldname  = gs_fieldtab-fieldname.
    gs_fieldcat-ref_field  = gs_fieldtab-ref_fieldname.
    gs_fieldcat-ref_table  = gs_fieldtab-ref_tabname.
    gs_fieldcat-outputlen  = gs_fieldtab-outputlen.
    gs_fieldcat-key        = gs_fieldtab-key.
    gs_fieldcat-tabname    = 'GT_LISTADO'.
    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'.


    IF    gs_fieldtab-fieldname = 'EISBE_UV'
       OR gs_fieldtab-fieldname = 'MABST_UV'.

      gs_fieldcat-edit = 'X'.
    ENDIF.


    APPEND gs_fieldcat TO gt_fieldcat.
  ENDLOOP.

* Cambio de descripciones
  PERFORM cambio_descripcion USING:
    'EISBE_UV'         text-l01  text-l01  text-l01  text-l01,
    'EISBE_UMB'        text-l02  text-l02  text-l02  text-l02,
    'MABST_UV'         text-l03  text-l03  text-l03  text-l03,
    'MABST_UMB'        text-l04  text-l04  text-l04  text-l04.


* Se fijan los campos claves
  PERFORM eliminar_o_fijar_campo_clave USING: 'MATNR'    'X',
                                              'WERKS'    ' ',
                                              'LGORT'    ' ',
                                              'MTART'    ' '.


  CALL SCREEN 9001.

ENDFORM.                    " mostrar_listado

*&---------------------------------------------------------------------*
*&      Form  barra_herramientas
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM barra_herramientas  USING rr_object TYPE REF TO
                                         cl_alv_event_toolbar_set
                               pf_e_interactive.

  DATA: ls_toolbar            TYPE stb_button.


* Se añade un separador
  CLEAR ls_toolbar.
  MOVE 3 TO ls_toolbar-butn_type.
  APPEND ls_toolbar TO rr_object->mt_toolbar.

* Añadimos icono Grabar
  CLEAR ls_toolbar.
  MOVE 'OK_SAVE' TO ls_toolbar-function.
  MOVE icon_system_save TO ls_toolbar-icon.
  MOVE 'Grabar'(ic2) TO ls_toolbar-quickinfo.
* MOVE 'Grabar'(ic2) TO ls_toolbar-text.
  MOVE ' ' TO ls_toolbar-disabled.
  APPEND ls_toolbar TO rr_object->mt_toolbar.

ENDFORM.                    " barra_herramientas

*&---------------------------------------------------------------------*
*&      Form  data_changed
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM data_changed USING  rr_data_changed TYPE REF TO
                                         cl_alv_changed_data_protocol.

  DATA: ls_mod_cells          TYPE lvc_s_modi.
  DATA: lf_busab              TYPE t001s-busab.
  DATA: ls_t001s              LIKE t001s.
  DATA: lf_vendedor           LIKE zvbrk_mex-vendedor.
  DATA: ls_lfa1               LIKE lfa1.
  DATA: lf_fecha              LIKE sy-datum.
  DATA: lf_folio_acuse        LIKE zvbrk_mex-folio_acuse.
  DATA: lf_observaciones      LIKE zvbrk_mex-observaciones.
  DATA: ls_zvbrk_mex          LIKE gt_listado.
  DATA: ls_cellcolor          TYPE lvc_s_scol .
  DATA: ls_is_stable          TYPE lvc_s_stbl.

  DATA: lf_eisbe_uv           LIKE marc-eisbe.
  DATA: lf_mabst_uv           LIKE marc-mabst.

  DATA: lf_et_index_rows      TYPE lvc_t_row,
        lf_et_row_no          TYPE lvc_t_roid.


  CALL METHOD go_grid_listado->get_selected_rows
    IMPORTING
      et_index_rows = lf_et_index_rows
      et_row_no     = lf_et_row_no.



  LOOP AT rr_data_changed->mt_mod_cells INTO ls_mod_cells.

    READ TABLE gt_listado INDEX ls_mod_cells-row_id.

    CASE ls_mod_cells-fieldname.

      WHEN 'EISBE_UV'.
        CALL METHOD rr_data_changed->get_cell_value
          EXPORTING
            i_row_id    = ls_mod_cells-row_id
            i_fieldname = ls_mod_cells-fieldname
          IMPORTING
            e_value     = lf_eisbe_uv.

        gt_listado-eisbe_uv = lf_eisbe_uv.

        DELETE gt_listado-color_celdas
        WHERE fname = ls_mod_cells-fieldname.
        IF ls_zvbrk_mex-eisbe_uv <> gt_listado-eisbe_uv.
          CLEAR ls_cellcolor.
          ls_cellcolor-fname     = ls_mod_cells-fieldname.
          ls_cellcolor-color-col = '7' .
          ls_cellcolor-color-int = '1'.
          APPEND ls_cellcolor TO gt_listado-color_celdas.
        ENDIF.

        PERFORM md_convert_material_unit USING gt_listado-matnr
                                               gt_listado-eisbe_uv
                                               gt_listado-eisbe_umb.

        MODIFY gt_listado INDEX ls_mod_cells-row_id.



      WHEN 'MABST_UV'.
        CALL METHOD rr_data_changed->get_cell_value
          EXPORTING
            i_row_id    = ls_mod_cells-row_id
            i_fieldname = ls_mod_cells-fieldname
          IMPORTING
            e_value     = lf_mabst_uv.

        gt_listado-mabst_uv = lf_mabst_uv.

        DELETE gt_listado-color_celdas
        WHERE fname = ls_mod_cells-fieldname.
        IF ls_zvbrk_mex-mabst_uv <> gt_listado-mabst_uv.
          CLEAR ls_cellcolor.
          ls_cellcolor-fname     = ls_mod_cells-fieldname.
          ls_cellcolor-color-col = '7' .
          ls_cellcolor-color-int = '1'.
          APPEND ls_cellcolor TO gt_listado-color_celdas.
        ENDIF.

        PERFORM md_convert_material_unit USING gt_listado-matnr
                                               gt_listado-mabst_uv
                                               gt_listado-mabst_umb.

        MODIFY gt_listado INDEX ls_mod_cells-row_id.

    ENDCASE.

  ENDLOOP.


  CALL METHOD go_grid_listado->set_selected_rows
    EXPORTING
      it_index_rows = lf_et_index_rows
      it_row_no     = lf_et_row_no.



ENDFORM.                    " data_changed

*---------------------------------------------------------------------*
*       MODULE PBO OUTPUT                                             *
*---------------------------------------------------------------------*
MODULE pbo OUTPUT.
  PERFORM pbo_output.
ENDMODULE.                    "pbo OUTPUT

*---------------------------------------------------------------------*
*       MODULE PAI INPUT                                              *
*---------------------------------------------------------------------*
MODULE pai INPUT.
  PERFORM pai_input.
ENDMODULE.                    "pai INPUT



*&---------------------------------------------------------------------*
*&      Form  pbo_output
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM pbo_output.


  DATA: lo_event_receiver     TYPE REF TO lcl_event_receiver.

  DATA: lt_it_toolbar_excluding
                              TYPE ui_functions.

  SET PF-STATUS 'MAIN100'.
  SET TITLEBAR 'T9001_1'.

  IF go_custom_container IS INITIAL.
    CREATE OBJECT go_custom_container
      EXPORTING
        container_name = g_container_listado.

    CREATE OBJECT go_grid_listado
      EXPORTING
        i_parent = go_custom_container.

    CREATE OBJECT lo_event_receiver.
    SET HANDLER lo_event_receiver->handle_data_changed
                 FOR go_grid_listado.

    SET HANDLER lo_event_receiver->handle_data_changed_finished
                 FOR go_grid_listado.


    SET HANDLER lo_event_receiver->handle_user_command
                    FOR go_grid_listado.
    SET HANDLER lo_event_receiver->handle_toolbar FOR go_grid_listado.


    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-grid_title

    gs_layout-ctab_fname = 'COLOR_CELDAS'.
    gs_layout-no_rowmark = 'X'.

    gs_variant-report    = 'ZALV_OO_SENCILLO'.

    PERFORM excluir_ok_codigos TABLES lt_it_toolbar_excluding.



    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
        it_toolbar_excluding = lt_it_toolbar_excluding
      CHANGING
        it_fieldcatalog      = gt_fieldcat
        it_sort              = gt_sort
        it_outtab            = gt_listado[].

  ENDIF.

ENDFORM.                    " pbo_output

*&---------------------------------------------------------------------*
*&      Form  pai_input
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM pai_input.

  CASE gf_okcode.
    WHEN 'EXIT'.
      SET SCREEN 0.
      LEAVE SCREEN.
  ENDCASE.
  CLEAR gf_okcode.

ENDFORM.                    " pai_input

*&---------------------------------------------------------------------*
*&      Form  excluir_ok_codigos
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM excluir_ok_codigos  TABLES   pt_it_toolbar_excluding.

  DATA: lf_ui_func            TYPE ui_func.


  lf_ui_func = go_grid_listado->mc_fc_loc_append_row.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.

  lf_ui_func = go_grid_listado->mc_fc_loc_copy.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_copy_row.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.


  lf_ui_func = go_grid_listado->mc_fc_loc_cut.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_delete_row.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_insert_row.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_move_row.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_paste.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_paste_new_row.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.
  lf_ui_func = go_grid_listado->mc_fc_loc_undo.
  APPEND lf_ui_func TO pt_it_toolbar_excluding.

ENDFORM.                    " excluir_ok_codigos

*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM user_command USING pf_e_ucomm TYPE syucomm.

  DATA: ls_is_stable          TYPE lvc_s_stbl.


  CASE pf_e_ucomm.
    WHEN 'OK_SAVE'.

      LOOP AT gt_listado.  " WHERE marca = 'X'.
        CLEAR marc.
        SELECT SINGLE * FROM marc
                WHERE matnr = gt_listado-matnr
                  AND werks = gt_listado-werks.

        IF gt_listado-eisbe_uv <> marc-eisbe.
          MOVE gt_listado-eisbe_uv TO marc-eisbe.
          MODIFY marc.
        ENDIF.

        IF gt_listado-mabst_uv <> marc-mabst.
          MOVE gt_listado-mabst_uv TO marc-mabst.
          MODIFY marc.
        ENDIF.
      ENDLOOP.

      IF sy-subrc <> 0.
*------ No se han seleccionado registros
        MESSAGE s324(zy).
      ELSE.
*------ Se han actualizado los datos
        MESSAGE s411(zy).

        ls_is_stable-row = 'X'.
        ls_is_stable-col = 'X'.

        CALL METHOD go_grid_listado->refresh_table_display
          EXPORTING
            is_stable = ls_is_stable.

      ENDIF.


  ENDCASE.

ENDFORM.                    " user_command

*&---------------------------------------------------------------------*
*&      Form  eliminar_o_fijar_campo_clave
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM eliminar_o_fijar_campo_clave USING pf_fieldname
                                        pf_valor.

  READ TABLE gt_fieldcat WITH KEY fieldname = pf_fieldname
     ASSIGNING <fieldcat>.
  IF sy-subrc EQ 0.
    <fieldcat>-key = pf_valor.
  ENDIF.

ENDFORM.                    " eliminar_o_fijar_campo_clave

*&---------------------------------------------------------------------*
*&      Form  data_changed_finished
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM data_changed_finished  USING  e_modified
                                   et_good_cells TYPE lvc_t_modi.

  DATA: ls_is_stable          TYPE lvc_s_stbl.


  IF NOT e_modified IS INITIAL.

    ls_is_stable-row = 'X'.
    ls_is_stable-col = 'X'.

    CALL METHOD go_grid_listado->refresh_table_display
      EXPORTING
        is_stable = ls_is_stable.

  ENDIF.

ENDFORM.                    " data_changed_finished

*&---------------------------------------------------------------------*
*&      Form  cambio_descripcion
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM cambio_descripcion USING pf_fieldname
                              pf_scrtext_l
                              pf_scrtext_m
                              pf_scrtext_s
                              pf_coltext.

  READ TABLE gt_fieldcat WITH KEY fieldname = pf_fieldname
     ASSIGNING <fieldcat>.
  IF sy-subrc EQ 0.
    <fieldcat>-scrtext_l    = pf_scrtext_l.
    <fieldcat>-scrtext_m    = pf_scrtext_m.
    <fieldcat>-scrtext_s    = pf_scrtext_s.
    <fieldcat>-coltext      = pf_coltext.
  ENDIF.


ENDFORM.                    " cambio_descripcion
*&---------------------------------------------------------------------*
*&      Form  md_convert_material_unit
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_LISTADO_MATNR  text
*      -->P_GT_LISTADO_EISBE_UV  text
*      -->P_GT_LISTADO_EISBE_UMB  text
*----------------------------------------------------------------------*
FORM md_convert_material_unit  USING    p_matnr
                                        p_in_uv
                                        p_out_umb.

  DATA: aux_unit_in  LIKE ekpo-menge,
        aux_unit_out LIKE ekpo-menge,
        lf_meins     LIKE mara-meins.

  SELECT SINGLE meins INTO lf_meins FROM mara
          WHERE matnr = p_matnr.

  aux_unit_in  = p_in_uv.

  CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
    EXPORTING
      i_matnr              = p_matnr
      i_in_me              = 'UV'
      i_out_me             = lf_meins
      i_menge              = aux_unit_in
    IMPORTING
      e_menge              = aux_unit_out
    EXCEPTIONS
      error_in_application = 1
      error                = 2
      OTHERS               = 3.

  p_out_umb = aux_unit_out.


ENDFORM.                    " md_convert_material_unit



En el MODULE.

PROCESS BEFORE OUTPUT.
  MODULE pbo.

PROCESS AFTER INPUT.
  MODULE pai.



Espero que te sirva de algo.

Un Saludo.