segunda-feira, 19 de janeiro de 2026

CL_SALV_TABLE - Edição de campos / habilitar desabilitar / validação de valores

 

























=============================================

CLASS lcl_canhoto DEFINITION.

  PUBLIC SECTION.

    TYPES: BEGIN OF ty_param,
             range_docnum     TYPE RANGE OF j_1bdocnum,
             range_nfenum     TYPE RANGE OF j_1bnfnum9,
             range_lifnr      TYPE RANGE OF lifnr,
             range_dtrecm     TYPE RANGE OF datum,
             canhoto_recebido TYPE RANGE OF abap_bool,
             miro_criada      TYPE RANGE OF abap_bool,
             fob              TYPE RANGE OF abap_bool,
           END OF ty_param.

    TYPES: BEGIN OF ty_alv.
             INCLUDE TYPE zi_canhotodados.
    TYPES:   style TYPE lvc_t_styl,
             updkz TYPE updkz_d,
           END OF ty_alv,

           tty_alv TYPE STANDARD TABLE OF ty_alv WITH DEFAULT KEY.

    TYPES: tty_dados TYPE STANDARD TABLE OF zi_canhotodados WITH DEFAULT KEY.

    DATA _s_param TYPE ty_param.

    DATA: _t_dados TYPE tty_dados,
          _t_alv   TYPE tty_alv.

    DATA: _o_alv_container TYPE REF TO cl_gui_custom_container,
          _o_alv           TYPE REF TO cl_salv_table,
          _o_alv_edit      TYPE REF TO if_salv_gui_om_edit_restricted.

    DATA: _o_listener TYPE REF TO lcl_listener.

    METHODS:

      add_button,

      check_data_modified RETURNING VALUE(rv_exit) TYPE abap_bool,

      constructor IMPORTING is_param TYPE ty_param,

      display_list,

      get_data,

      run,

      set_columns.

    METHODS:
      on_user_command FOR EVENT added_function OF cl_salv_events
        IMPORTING e_salv_function.


ENDCLASS.

CLASS lcl_listener DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_salv_gui_om_edit_strct_lstr.
ENDCLASS.



CLASS lcl_canhoto IMPLEMENTATION.

  METHOD run.

    me->get_data( ).

    IF me->_t_dados[] IS NOT INITIAL.
      CALL SCREEN 9000.
    ENDIF.


  ENDMETHOD.

  METHOD constructor.

    _s_param = is_param.

  ENDMETHOD.

  METHOD get_data.

    SELECT *
      FROM zi_canhoto
     WHERE carrier IN @_s_param-range_lifnr
       AND nfdocument IN @_s_param-range_docnum
       AND nfenum IN @_s_param-range_nfenum
       AND issuedate IN @_s_param-range_dtrecm
       AND fob IN @_s_param-fob
       AND miro IN @_s_param-miro_criada
       AND canhoto IN @_s_param-canhoto_recebido
       ORDER BY transportationorder, nfdocument
       INTO TABLE @me->_t_dados.


    IF sy-subrc <> 0.
      MESSAGE 'Nenhum registro foi selecionado.' TYPE 'I'.
      LEAVE LIST-PROCESSING.
    ENDIF.

  ENDMETHOD.

  METHOD display_list.

    CHECK _o_alv_container IS NOT BOUND.

    me->_o_alv_container = NEW cl_gui_custom_container( container_name = 'CONTAINER' ).

    me->_t_alv = CORRESPONDING #( me->_t_dados ).

    TRY.

        cl_salv_table=>factory(
          EXPORTING
            r_container    = me->_o_alv_container
*         container_name =
          IMPORTING
            r_salv_table   = me->_o_alv
          CHANGING
            t_table        = me->_t_alv
        ).

        me->_o_alv->get_functions( )->set_all( if_salv_c_bool_sap=>true ).
        me->_o_alv->get_layout( )->set_key( VALUE #( report = sy-repid handle = 'Lista' ) ).
        me->_o_alv->get_layout( )->set_save_restriction( if_salv_c_layout=>restrict_none ).

        me->_o_alv->get_columns( )->set_optimize( abap_true ).
        me->_o_alv->get_display_settings( )->set_striped_pattern( abap_true ).

        me->_o_alv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>multiple ).

        me->set_columns( ).

        me->add_button( ).

        DATA(lo_events) = me->_o_alv->get_event( ).

        SET HANDLER me->on_user_command FOR lo_events.

        me->_o_alv->display( ).

      CATCH cx_salv_msg INTO DATA(lx_salv_msg).

    ENDTRY.

  ENDMETHOD.

  METHOD set_columns.

    DATA lo_column TYPE REF TO cl_salv_column.

    TRY.

        DEFINE lm_column.
          lo_column = me->_o_alv->get_columns( )->get_column( &1 ).
          lo_column->set_short_text( CONV scrtext_s( &2 ) ).
          lo_column->set_medium_text( CONV scrtext_m( &3 ) ).
          lo_column->set_long_text( &3 ).
        END-OF-DEFINITION.

        lm_column 'NFDOCUMENT' 'DocNF' TEXT-t01.
        lm_column 'NFSERIES' TEXT-t02 TEXT-t02.
        lm_column 'NFENUM' TEXT-t03 TEXT-t03.
        lm_column 'ISSUEDATE' 'DtEmiNF' TEXT-t04.
        lm_column 'NFPARTNER' TEXT-t05 TEXT-t05.
        lm_column 'NFPARTNERNAME' 'Nome' TEXT-t06.
        lm_column 'FODELIVERYDOCUMENT' 'Remessa' TEXT-t07.
        lm_column 'PURCHASEORDERDOCUMENT' 'PedFrete' TEXT-t08.
        lm_column 'TRANSPORTATIONORDER' 'OrdFrete' TEXT-t09.
        lm_column 'CARRIER' TEXT-t10 TEXT-t10.
        lm_column 'CARRIERNAME' 'NomeForn' TEXT-t11.
        lm_column 'INCOTERMS' TEXT-t12 TEXT-t12.
        lm_column 'SUPPLIERINVOICE' TEXT-t13 TEXT-t13.
        lm_column 'DATA_RECEBIMENTO' 'DtReceb' TEXT-t15.
        lm_column 'USUARIO_RECEBIMENTO' 'Usuário' TEXT-t16.
        lm_column 'NETVALUE' 'ValorLiq' TEXT-t17.
        lm_column 'CANHOTO' 'Canhoto' TEXT-t14.
        DATA(lo_col) = CAST cl_salv_column_table( lo_column ).
        lo_col->set_cell_type( if_salv_c_cell_type=>checkbox ).

        me->_o_alv->get_columns( )->get_column( 'MIRO' )->set_technical( abap_true ).
        me->_o_alv->get_columns( )->get_column( 'FOB' )->set_technical( abap_true ).
        me->_o_alv->get_columns( )->get_column( 'PAYBLOCKREASON' )->set_technical( abap_true ).

        DATA(lo_api) = me->_o_alv->extended_grid_api( ).
        _o_alv_edit = lo_api->editable_restricted( ).

        LOOP AT me->_t_alv REFERENCE INTO DATA(lr_alv).
          IF ( lr_alv->miro IS INITIAL ) OR
             ( lr_alv->miro IS NOT INITIAL AND lr_alv->canhoto IS NOT INITIAL ).
            lr_alv->style = VALUE #( ( fieldname = 'CANHOTO' style = cl_gui_alv_grid=>mc_style_disabled ) ).
          ELSE.
            lr_alv->style = VALUE #( ( fieldname = 'CANHOTO' style = cl_gui_alv_grid=>mc_style_enabled ) ).
          ENDIF.
        ENDLOOP.

        _o_alv_edit->set_t_celltab_columnname( 'STYLE' ).

        _o_alv_edit->set_attributes_for_columnname( columnname = 'CANHOTO' all_cells_input_enabled = abap_true ).

        _o_listener = NEW lcl_listener( ).
        _o_alv_edit->set_listener( _o_listener ).

      CATCH cx_salv_not_found INTO DATA(lx_alv_error).


    ENDTRY.


  ENDMETHOD.

  METHOD add_button.

    TRY.


*        me->_o_alv->get_functions( )->add_function( EXPORTING name       = 'SELECT_ALL'
*                                                              icon       = CONV #( icon_select_all )
*                                                              text       = 'Selecionar Tudo'
*                                                              tooltip    = 'Selecionar Tudo'
*                                                              position   = if_salv_c_function_position=>right_of_salv_functions
*                                                                       ).
*
*
*        me->_o_alv->get_functions( )->add_function( EXPORTING name       = 'DESELECT_ALL'
*                                                              icon       = CONV #( icon_deselect_all )
*                                                              text       = 'Desmarcar Tudo'
*                                                              tooltip    = 'Desmarcar Tudo'
*                                                              position   = if_salv_c_function_position=>right_of_salv_functions
*                                                                       ).

        me->_o_alv->get_functions( )->add_function( EXPORTING name       = 'SAVE_ALL'
                                                              icon       = CONV #( icon_system_save )
                                                              text       = 'Salvar Modificações'
                                                              tooltip    = 'Salvar Modificações'
                                                              position   = if_salv_c_function_position=>right_of_salv_functions
                                                                       ).


        me->_o_alv->get_functions( )->add_function( EXPORTING name       = 'DESMARCAR_RECEB'
                                                              icon       = CONV #( icon_delete )
                                                              text       = 'Eliminar Canhoto Recebido'
                                                              tooltip    = 'Eliminar Canhoto Recebido'
                                                              position   = if_salv_c_function_position=>right_of_salv_functions
                                                                       ).

      CATCH cx_salv_existing.
      CATCH cx_salv_wrong_call.

    ENDTRY.


  ENDMETHOD.

  METHOD on_user_command.

    CASE e_salv_function.
      WHEN  'SAVE_ALL'.

        LOOP AT me->_t_dados REFERENCE INTO DATA(lr_dados).

          DATA(lr_alv) = REF #( me->_t_alv[ nfdocument = lr_dados->nfdocument
                                              transportationorder = lr_dados->transportationorder
                                              purchaseorderdocument = lr_dados->purchaseorderdocument ] OPTIONAL ).
          "Se teve modificação e não foi salvo
          CHECK lr_alv IS BOUND AND
                lr_alv->canhoto <> lr_dados->canhoto.

          IF lr_alv->canhoto IS INITIAL AND lr_alv->miro IS INITIAL.
            CONTINUE.
          ENDIF.

          DATA(ls_canhoto_tab) = CORRESPONDING ztajltm_canhoto( lr_alv->* MAPPING nf_document = nfdocument purchase_order = purchaseorderdocument ).

          IF ls_canhoto_tab-canhoto IS NOT INITIAL.
            ls_canhoto_tab-data_recebimento = sy-datum.
            ls_canhoto_tab-usuario_recebimento = sy-uname.
          ELSE.
            CLEAR: ls_canhoto_tab-data_recebimento, ls_canhoto_tab-usuario_recebimento.
          ENDIF.

          MODIFY ztajltm_canhoto FROM ls_canhoto_tab.

          COMMIT WORK AND WAIT.

          lr_dados->canhoto = lr_alv->canhoto.

          IF lr_alv->canhoto IS NOT INITIAL.
            lr_alv->style = VALUE #( ( fieldname = 'CANHOTO' style = cl_gui_alv_grid=>mc_style_disabled ) ).
          ELSE.
            lr_alv->style = VALUE #( ( fieldname = 'CANHOTO' style = cl_gui_alv_grid=>mc_style_enabled ) ).
          ENDIF.

        ENDLOOP.

        IF sy-subrc = 0.
          MESSAGE 'MOdificações gravados com sucesso.' TYPE 'I'.
        ENDIF.

        _o_alv->refresh( EXPORTING s_stable = VALUE #( row = abap_true col = abap_true ) ).

      WHEN 'SELECT_ALL'.

      WHEN 'DESELECT_ALL'.

      WHEN 'DESMARCAR_RECEB'.

        DATA(lt_rows) = _o_alv->get_selections( )->get_selected_rows( ).
        IF lt_rows[] IS INITIAL.
          MESSAGE 'Nenhum registro foi selecionado.' TYPE 'I'.
        ELSE.

          LOOP AT lt_rows INTO DATA(ls_rows).

            lr_alv = REF #( me->_t_alv[ ls_rows ] OPTIONAL ).
            CHECK lr_alv IS BOUND.

            IF lr_alv->payblockreason IS INITIAL.
              MESSAGE |Faturamento :{ lr_alv->supplierinvoice }, já foi liberado para pagamento.| TYPE 'I'.
              CONTINUE.
            ENDIF.

            lr_alv->canhoto = abap_false.

          ENDLOOP.

        ENDIF.

        _o_alv->refresh( EXPORTING s_stable = VALUE #( row = abap_true col = abap_true ) ).

    ENDCASE.

  ENDMETHOD.

  METHOD check_data_modified.

    DATA: lv_bool   TYPE abap_bool VALUE 'X',
          lv_answer TYPE char1.

    rv_exit = abap_true.

    CHECK _o_alv_edit IS BOUND.

    _o_alv_edit->validate_changed_data( IMPORTING is_input_data_valid = lv_bool
                                        CHANGING x_data_refresh      = lv_bool  ).

    DATA(lv_modificado) = abap_false.
    LOOP AT me->_t_dados REFERENCE INTO DATA(lr_dados).

      DATA(ls_alv) = VALUE #( me->_t_alv[ nfdocument = lr_dados->nfdocument
                                          transportationorder = lr_dados->transportationorder
                                          purchaseorderdocument = lr_dados->purchaseorderdocument ] OPTIONAL ).
      "Se teve modificação e não foi salvo
      CHECK ls_alv IS NOT INITIAL AND
            ls_alv-canhoto <> lr_dados->canhoto.

      lv_modificado = abap_true.

      EXIT.

    ENDLOOP.

    IF lv_modificado = abap_true.

      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          titlebar              = 'Sair da Transação'
          text_question         = 'Existem alterações não gravados, deseja sair sem salvar ?'
          display_cancel_button = abap_false
        IMPORTING
          answer                = lv_answer
        EXCEPTIONS
          text_not_found        = 1
          OTHERS                = 2.

      IF sy-subrc = 0 AND lv_answer = '2'.
        CLEAR rv_exit.
      ENDIF.

    ENDIF.

  ENDMETHOD.

ENDCLASS.


CLASS lcl_listener IMPLEMENTATION.

  METHOD if_salv_gui_om_edit_strct_lstr~on_f4_request.
  ENDMETHOD.

  METHOD if_salv_gui_om_edit_strct_lstr~on_check_changed_data.

    o_ui_data_modify->get_ui_changes( IMPORTING t_modified_cells = DATA(lt_modified) ).

    DATA: canhoto TYPE char1.

    LOOP AT lt_modified ASSIGNING FIELD-SYMBOL(<data>)
                  GROUP BY ( value = <data>-row_id ) INTO DATA(lt_group).

      LOOP AT  GROUP lt_group ASSIGNING FIELD-SYMBOL(<row_id>).
        o_ui_data_modify->get_cell_value( EXPORTING row_id     = <row_id>-row_id
                                                    fieldname  = 'CANHOTO'
                                          IMPORTING cell_value = canhoto ).

      ENDLOOP.

    ENDLOOP.

  ENDMETHOD.

ENDCLASS.





Nenhum comentário:

Postar um comentário