Buenas, estoy haciendo un ALV y necesito comparar el contenido de dos campos. Puesto que solamente puede estar informado uno de los dos campos.
*------------------------------------------------------------------
* CLASS lcl_event_hadler DEFINITION
*------------------------------------------------------------------
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_handler DEFINITION
*------------------------------------------------------------------
* CLASS lcl_event_handler IMPLEMENTATION
*------------------------------------------------------------------
CLASS lcl_event_handler IMPLEMENTATION.
*------------------------------------------------------------------
* METHOD handle_data_changed
*------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------
* Form HANDLE_DATA_CHANGED
*---------------------------------------------------------------------
* text
*----------------------------------------------------------------------
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------
FORM handle_data_changed USING ir_data_changed
TYPE REF TO
cl_alv_changed_data_protocol.
DATA: ls_mod_cell TYPE lvc_s_modi,
lv_value TYPE lvc_value,
lv_value1 TYPE lvc_value.
* SORT ir_data_changed->mt_mod_cells." BY row_id.
LOOP AT ir_data_changed->mt_mod_cells
INTO ls_mod_cell
WHERE fieldname = 'CAMPO2'.
CALL METHOD ir_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = 'CAMPO2'
IMPORTING
e_value = lv_value1.
ENDLOOP.
LOOP AT ir_data_changed->mt_mod_cells
INTO ls_mod_cell
WHERE fieldname = 'CAMPO1'.
IF it_prueba-clase IS INITIAL.
CALL METHOD ir_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ls_mod_cell-fieldname
i_value = campo_prueba.
ENDIF.
CALL METHOD ir_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = 'CAMPO1'
IMPORTING
e_value = lv_value.
IF lv_value = lv_value1.
CALL METHOD ir_data_changed->add_protocol_entry
EXPORTING
i_msgid = 'SU'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = 'Solo un campo informado '
i_fieldname = ls_mod_cell-fieldname
i_row_id = ls_mod_cell-row_id.
ENDIF.
ENDLOOP.
ENDFORM. " HANDLE_DATA_CHANGED
************************************************** *****
Con este codigo he coseguido que me chequee el campo una vez, y solo cuando el que informo es el campo 1 o 2. Si borro el campo 2, pulso intro y vuelvo a rellenar el campo no entra en la parte del codigo para recuperar el campo 2.
Hay alguna otra manera de hacerlo?
Gracias por a delantado!
*------------------------------------------------------------------
* CLASS lcl_event_hadler DEFINITION
*------------------------------------------------------------------
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_handler DEFINITION
*------------------------------------------------------------------
* CLASS lcl_event_handler IMPLEMENTATION
*------------------------------------------------------------------
CLASS lcl_event_handler IMPLEMENTATION.
*------------------------------------------------------------------
* METHOD handle_data_changed
*------------------------------------------------------------------
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------
* Form HANDLE_DATA_CHANGED
*---------------------------------------------------------------------
* text
*----------------------------------------------------------------------
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------
FORM handle_data_changed USING ir_data_changed
TYPE REF TO
cl_alv_changed_data_protocol.
DATA: ls_mod_cell TYPE lvc_s_modi,
lv_value TYPE lvc_value,
lv_value1 TYPE lvc_value.
* SORT ir_data_changed->mt_mod_cells." BY row_id.
LOOP AT ir_data_changed->mt_mod_cells
INTO ls_mod_cell
WHERE fieldname = 'CAMPO2'.
CALL METHOD ir_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = 'CAMPO2'
IMPORTING
e_value = lv_value1.
ENDLOOP.
LOOP AT ir_data_changed->mt_mod_cells
INTO ls_mod_cell
WHERE fieldname = 'CAMPO1'.
IF it_prueba-clase IS INITIAL.
CALL METHOD ir_data_changed->modify_cell
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = ls_mod_cell-fieldname
i_value = campo_prueba.
ENDIF.
CALL METHOD ir_data_changed->get_cell_value
EXPORTING
i_row_id = ls_mod_cell-row_id
i_fieldname = 'CAMPO1'
IMPORTING
e_value = lv_value.
IF lv_value = lv_value1.
CALL METHOD ir_data_changed->add_protocol_entry
EXPORTING
i_msgid = 'SU'
i_msgno = '000'
i_msgty = 'E'
i_msgv1 = 'Solo un campo informado '
i_fieldname = ls_mod_cell-fieldname
i_row_id = ls_mod_cell-row_id.
ENDIF.
ENDLOOP.
ENDFORM. " HANDLE_DATA_CHANGED
************************************************** *****
Con este codigo he coseguido que me chequee el campo una vez, y solo cuando el que informo es el campo 1 o 2. Si borro el campo 2, pulso intro y vuelvo a rellenar el campo no entra en la parte del codigo para recuperar el campo 2.
Hay alguna otra manera de hacerlo?
Gracias por a delantado!
Comentario