Campo obligatorio en ALV OO

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • melerogalan
    Senior Member
    • nov
    • 142

    #1

    Campo obligatorio en ALV OO

    Hola:
    Tengo un ALV OO, en el hay un campo editable, quiero que ese campo sea obligatorio, que el usuario no pueda salir del alv si no rellena este campo. El problema que el alv tiene muchos eventos.

    Alguien ha echo algo parecido.

    Gracias de antemano.
    Cada vez que un programador hace una hora extra, Dios mata a un gatito...tenlo en cuenta
  • ibecerra

    #2
    utiliza el metodo siguiente.

    class lcl_event_receiver definition.
    public section.
    METHODS handle_toolbar
    FOR EVENT toolbar OF cl_gui_alv_grid
    IMPORTING e_object e_interactive.
    .
    .
    .
    methods handle_data_changed "metodo para saber si has hecho una entrada al " alv
    for event data_changed of cl_gui_alv_grid
    endclass.
    class lcl_event_receiver implementation.
    METHOD handle_toolbar.
    PERFORM handle_toolbar CHANGING e_object.
    ENDMETHOD. "handle_toolbar
    method handle_data_changed.
    perform data_changed using er_data_changed.
    ENDMETHOD.
    endclass. "lcl_event_receiver IMPLEMENTATION
    ****
    FORM data_changed USING p_data_changed
    TYPE REF TO cl_alv_changed_data_protocol.
    DATA: d_mod_cells TYPE lvc_s_modi.
    DATA: w_buenas TYPE i.
    DATA: w_modif TYPE i.
    DATA: NRCONST LIKE ZTFCONSTDET-NRCONST.
    data: d_stable like lvc_s_stbl.
    DATA:
    S_ROW TYPE LVC_S_ROW,
    S_COL TYPE LVC_S_COL,
    S_ROI TYPE LVC_S_ROID,
    T_ROW TYPE LVC_T_ROW,
    T_ROID TYPE LVC_T_ROID,
    CELL TYPE LVC_T_CELL.
    S_ROW = 3.
    *------verifica si habido algun cambio en las celdad
    * Clear: L_NRCE, L_FCER , L_IMRT, L_DMBTR.
    LOOP AT p_data_changed->mt_mod_cells INTO d_mod_cells
    WHERE NOT value IS INITIAL.
    EXIT.
    ENDLOOP.
    **
    CHECK sy-subrc EQ 0.
    *--identifica el campo q ha recibido una entrada
    CASE d_mod_cells-fieldname.
    WHEN 'NRCONST'.
    *----se evalua el valor del campo ingresado
    CALL METHOD p_data_changed->get_cell_value
    EXPORTING
    i_row_id = d_mod_cells-row_id
    i_fieldname = d_mod_cells-fieldname
    IMPORTING
    e_value = NRCONST.
    IF NRCONST IS INITIAL OR NRCONST = 0. .
    CALL METHOD p_data_changed->add_protocol_entry
    EXPORTING
    i_msgid = '0K'
    i_msgno = '000'
    i_msgty = 'E'
    i_msgv1 = text-m01
    i_fieldname = d_mod_cells-fieldname
    i_row_id = d_mod_cells-row_id.
    ELSE.
    READ TABLE TI_ZTFACTRET INDEX
    d_mod_cells-row_id.
    IF SY-SUBRC EQ 0.
    CONCATENATE 'CD|' NRCONST '/'
    p_fecde+6(2) '.' p_fecde+4(2) '.'
    p_fecde(4)
    INTO TI_ZTFACTRET-BKTXT.
    replace '|' WITH ' ' INTO TI_ZTFACTRET-BKTXT.
    TI_ZTFACTRET-ICON = ICON_GREEN_LIGHT.
    MODIFY TI_ZTFACTRET
    INDEX d_mod_cells-row_id.

    * Inicio IBF02 31.08.2007
    d_stable-row = 'X'.
    d_stable-col = 'X'.
    CALL METHOD grid1->refresh_table_display
    EXPORTING
    is_stable = d_stable
    i_soft_refresh = 'X'.
    ENDIF.
    ERROR = 0.
    LOOP AT TI_ZTFACTRET ASSIGNING <ZTFACTRET>.
    IF <ZTFACTRET>-BKTXT = ''.
    ERROR = 1.
    ENDIF.
    ENDLOOP.
    ENDIF.
    ENDCASE.
    ENDFORM. "data_changed

    Comentario

    • melerogalan
      Senior Member
      • nov
      • 142

      #3
      CALL METHOD p_data_changed->get_cell_value
      EXPORTING
      i_row_id = d_mod_cells-row_id
      i_fieldname = d_mod_cells-fieldname
      IMPORTING
      e_value = NRCONST.

      ?¿? Esto que significa que el campo no esta relleno
      IF NRCONST IS INITIAL OR NRCONST = 0. .
      ?¿?
      !!!
      Este método te muestra un error, y el campo en un cuadro rojo, pero te deja continuar haciendo otros eventos, yo quiero que se me que de pillado hasta que lo rellene. L oque es un campo obligatorio.
      !!!

      CALL METHOD p_data_changed->add_protocol_entry
      EXPORTING
      i_msgid = '0K'
      i_msgno = '000'
      i_msgty = 'E'
      i_msgv1 = text-m01
      i_fieldname = d_mod_cells-fieldname
      i_row_id = d_mod_cells-row_id.

      ?¿?¿? Si el campo esta relleno, que es lo que hace aquí(podrías explicarlo), podrías poner la declaración de la variables que se utiliza
      ELSE.
      ¿?¿??¡

      READ TABLE TI_ZTFACTRET INDEX
      d_mod_cells-row_id.
      IF SY-SUBRC EQ 0.
      CONCATENATE 'CD|' NRCONST '/'
      p_fecde+6(2) '.' p_fecde+4(2) '.'
      p_fecde(4)
      INTO TI_ZTFACTRET-BKTXT.
      replace '|' WITH ' ' INTO TI_ZTFACTRET-BKTXT.
      TI_ZTFACTRET-ICON = ICON_GREEN_LIGHT.
      MODIFY TI_ZTFACTRET
      INDEX d_mod_cells-row_id.

      * Inicio IBF02 31.08.2007
      d_stable-row = 'X'.
      d_stable-col = 'X'.
      CALL METHOD grid1->refresh_table_display
      EXPORTING
      is_stable = d_stable
      i_soft_refresh = 'X'.
      ENDIF.
      ERROR = 0.
      LOOP AT TI_ZTFACTRET ASSIGNING <ZTFACTRET>.
      IF <ZTFACTRET>-BKTXT = ''.
      ERROR = 1.
      ENDIF.
      ENDLOOP.
      ENDIF.
      ENDCASE.
      ENDFORM. "data_changed


      Muchas gracias por todos
      Cada vez que un programador hace una hora extra, Dios mata a un gatito...tenlo en cuenta

      Comentario

      • ibecerra

        #4
        esto es un ejmplo no significa que lo debes hacer igual.
        NRCONST es una varible x que he declarado.

        ¿? Esto que significa que el campo no esta relleno
        IF NRCONST IS INITIAL OR NRCONST = 0. .
        *--> asi significa que la variable no esta llena
        *-- y si no esta llena mandas un mensaje de error y punto

        Saludos

        Comentario

        Trabajando...