"
Apoiado por

Protocolo de erros da ALV Grid

A lei do menor esforço, esse grande axioma da Humanidade, tem, no mundo da programação, a particularidade de, em muitos casos, acabar por ser simplesmente a lei do esforço adiado. Porque é muito provável que algo que tenha sido desenvolvido de acordo com esta lei venha mais tarde a precisar de um grande esforço extra. Seja dos utilizadores que vão utilizar esse algo ou dos programadores que mais tarde terão de o manter.

Atire a primeira pedra aquele que não se deixou guiar por esta lei ao desenvolver este ou aquele programas.

Eu não atiro.

Não atiro porque durante muito tempo, quando usava ALV Grids editáveis, quando queria dar um erro de validação dos dados, usava o MESSAGE ou uma popup.

Ao que parece, a lei do menor esforço impediu-me de explorar melhor as funcionalidade da ALV Grid e descobrir que ela tem já nela um protocolo de gestão de erros.

Funciona assim:

1. Quando criares a ALV associa-lhe um método HANDLE_DATA_CHANGED registado como “handler” do evento DATA_CHANGED. Além disso tens de chamar o método REGISTER_EDIT_EVENT da ALV Grid para lhe pedir para lançar este evento sempre que se carrega em ENTER:


  SET HANDLER handle_data_changed FOR go_grid.
  go_grid->register_edit_event( cl_gui_alv_grid=>mc_evt_enter ).

2. É no método HANDLE_DATA_CHANGED que vais validar os dados e actualizar o protocolo de erros da ALV Grid:


METHOD handle_data_changed.

  DATA: amount TYPE wrbtr,
        dummy.

  FIELD-SYMBOLS: <s_mod_cell> LIKE LINE OF er_data_changed->mt_mod_cells.

  LOOP AT er_data_changed->mt_mod_cells 
    ASSIGNING <s_mod_cell> 
    WHERE fieldname = ‘WRBTR’.

    er_data_changed->get_cell_value(
      EXPORTING
        i_row_id    = <s_mod_cell>-row_id
        i_fieldname = ‘WRBTR'
      IMPORTING 
        e_value     = amount ).

    IF amount > 100.
      MESSAGE e003(ZMSG) INTO dummy.
      er_data_changed->add_protocol_entry(
        EXPORTING
          i_msgid     = SY-MSGID
          i_msgty     = SY-MSGTY
          i_msgno     = SY-MSGNO
          i_fieldname = ‘WRBTR'
          i_row_id    = <s_mod_cell>-row_id ).
    ENDIF.

  ENDLOOP.

ENDMETHOD.

3. Verifica se está tudo bem
Quando quiseres saber se há algum erro na ALV Grid (tipicamente farás isto algures dentro do método USER_COMMAND), basta chamares o seguinte método:


go_grid->check_changed_data( IMPORTING e_valid = valid ).
IF valid.
  SAVE() “ grava dados / save data  
ENDIF.

Se alguma coisa estiver mal, a própria ALV Grid mostra uma janela modal com uma lista dos erros, tanto os internos (formatos de data inválidos, etc.) como os que foram adicionados por nós através do método ADD_PROTOCOL_ENTRY().

A partir de agora já vou passar a reportar de forma decente os erros de uma ALV Grid.

Aprendi nestas duas discussões nos fóruns da SAP:
https://archive.sap.com/discussions/thread/1509379
https://archive.sap.com/discussions/thread/1629201

A imagem do gajo que ilustra este artigo não tem nada a ver. Mas decidi escolhê-la para o Abapinho não ser o único site da Internet sem imagens de gatos. Talvez isto chame novos leitores.

O Abapinho saúda-vos.

2 comentários a “Protocolo de erros da ALV Grid”

  1. Ruthiel Diz:

    Olá Nuno!
    Agradeço imenso estas fantásticas dicas de ABAP!

    Tenho aprendido imenso com este teu projecto!

    Neste caso desconhecia completamente esta funcionalidade!

    Até nem usava muito a ALV Grid e sim a classe SALV_Table! Mas acho que talvez seja melhor repensar em usar ALV Grid =)

    Muito grato!

  2. Nuno Godinho Diz:

    Obrigado! O objectivo é aprender ao tentar ensaiar. Ainda bem que as duas coisas estão a resultar! Abraço

Deixe um comentário


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).