quinta-feira, 22 de janeiro de 2026

CDS - Verificar se existe somente caractere em campo de texto

No meu caso no campo de texto do cabeçalho do doc. de material vou splitar o campo para pegar a data e hora mas tem casos q pode ter texto então primeiro uso o REPLACE_REGEXPR para verificar se existe caracter no texto.

o identificador '\D' significa algum caracter e preencho com "X" caso encontre, retorno somente 1 ocorrência, logo abaixo eu testo o ISCHAR se for "X" tem caracter se não é só número

       replace_regexpr( pcre => '\\D',

                 value => $projection.HeaderTxt,

                 with => 'X' ,

                 result_length => 1 )                             as isChar,

 




quarta-feira, 21 de janeiro de 2026

RAP - Passando valor default da entidade principal para CDS Abstract

 


Campo na entidade principal













Declaração na CDS Abstract

@UI.defaultValue: #('ELEMENT_OF_REFERENCED_ENTITY: NumberOfCopies'  )



segunda-feira, 19 de janeiro de 2026

TM - Método para Atualização de status do transporte manual

  METHOD tm_shipping_event.
    DATA: lt_stop TYPE /scmtms/t_tor_stop_k.
    CLEAR rs_return.
    DATA(lo_srv_mgr) = /bobf/cl_tra_serv_mgr_factory=>get_service_manager( /scmtms/if_tor_c=>sc_bo_key ).
    DATA(lv_bo_name) = /scmtms/if_tor_c=>sc_bo_name.
    DATA(lv_attname) =  /scmtms/if_tor_c=>sc_query_attribute-root-planning_attributes-tor_id.
*"Selection Parameters
    DATA(lt_selpar) = VALUE /bobf/t_frw_query_selparam( ( attribute_name = lv_attname
                                                          sign = 'I'
                                                          option = 'EQ'
                                                          low = iv_freight_order ) ).
    DATA lt_key TYPE /bobf/t_frw_key.
    DATA lt_docref TYPE /scmtms/t_tor_root_k.
    "Execução da query
    lo_srv_mgr->query( EXPORTING iv_query_key = /scmtms/if_tor_c=>sc_query-root-planning_attributes
                                 it_selection_parameters = lt_selpar
                                 iv_fill_data = abap_true
                       IMPORTING "eo_message = DATA(lo_message)
                          et_key = lt_key
                          et_data = lt_docref
                          ).
    IF lt_key[] IS INITIAL.
      rs_return = VALUE #( id = 'ZJLTM' type = 'E' number = '002' message_v1 = iv_freight_order
                           message = cl_bs_soa_message_container=>get_msg_text( is_applmsg = VALUE #( type = 'E'
                                                                                                     id    = 'ZJLTM'
                                                                                                     number = '002'
                                                                                                     message_v1 = iv_freight_order
                                                                                               ) ) ) .
      RETURN.
    ENDIF.
    "get first location
    lo_srv_mgr->retrieve_by_association(
      EXPORTING
            iv_node_key             = /scmtms/if_tor_c=>sc_node-root
            it_key                  = lt_key
            iv_fill_data            = abap_true
            iv_association          = /scmtms/if_tor_c=>sc_association-root-stop_first
      IMPORTING
            eo_message              = DATA(lo_message)
            et_data                 = lt_stop
            et_failed_key           = DATA(lt_failed_key) ).

    rs_return = get_tm_message( lo_message ).
    CHECK rs_return IS INITIAL.
    DATA(lt_stop_key) = VALUE  /bobf/t_frw_key_link( FOR ls_stop IN lt_stop
                                                       ( target_key = ls_stop-key
                                                         source_key = ls_stop-root_key )
                                                      ).
    IF lt_docref[ 1 ]-execution =  c_tm_exec_status.
      rs_return = tm_call_report_event(
                                            EXPORTING
                                              iv_event    = c_tm_events-ready
                                              iv_eventdate = iv_eventdate
                                              it_root_key = lt_key
                                              it_stop     = lt_stop_key  ).
      CHECK rs_return IS INITIAL.
    ENDIF.
    rs_return = tm_call_report_event(
                                          EXPORTING
                                            iv_event    = iv_event
                                            iv_eventdate = iv_eventdate
                                            it_root_key = lt_key
                                            it_stop     = lt_stop_key ).
    IF rs_return IS INITIAL.
      rs_return = VALUE #( id = 'ZJLTM' type = 'S' number = '003' ) .
    ENDIF.
  ENDMETHOD.

 

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.





quarta-feira, 7 de janeiro de 2026

Adicionar MESES, DIAS ou ANOS - classe xco_cp_time

DATA(lv_start_date) = xco_cp_time=>date( iv_year = is_xml_values-data_concl_germ(4)

iv_month = is_xml_values-data_concl_germ+4(2)

iv_day = is_xml_values-data_concl_germ+6(2) ).


DATA(lv_new_date_obj) = lv_start_date->add( iv_month = CONV i( ls_cultura-meses_venc ) io_calculation = xco_cp_time=>date_calculation->ultimo ).

DATA(lv_new_date) = replace( val = lv_new_date_obj->as( xco_cp_time=>format->iso_8601_extended )->value pcre = '\-' with = ' ' occ = 0 ).

AMDP - Chamada de método sem criar CDS

 CLASS zcl_bloqueio_miro_tm DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .
  PUBLIC SECTION.

    TYPES: BEGIN OF ty_services,
             srvpos TYPE esll-srvpos,
           END OF ty_services.
    TYPES: tty_services TYPE STANDARD TABLE OF ty_services WITH DEFAULT KEY.

    INTERFACES if_amdp_marker_hdb.

    CLASS-METHODS check_bloqueio IMPORTING iv_sheet_service TYPE essr-lblni
                                 CHANGING  cs_invfo         TYPE invfo
                                           cs_bseg          TYPE bseg.
    CLASS-METHODS get_service IMPORTING VALUE(iv_sheet_service) TYPE essr-lblni
                              EXPORTING VALUE(et_service_nr)    TYPE tty_services.

  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.


CLASS zcl_bloqueio_miro_tm IMPLEMENTATION.

  METHOD check_bloqueio.
    TRY.
        get_service( EXPORTING
                        iv_sheet_service = iv_sheet_service
                      IMPORTING
                        et_service_nr    = DATA(lt_services) ).
      CATCH cx_amdp_error INTO DATA(lx_error).
    ENDTRY.
    CHECK lt_services[] IS NOT INITIAL.
    SELECT sign, opti, lpad( low, 18, '0' ) AS low  , lpad( high, 18, '0' ) AS high
      FROM tvarvc
     WHERE name = 'ZTM_TIPOSERVICO_BLOQUEIO'
     INTO TABLE @DATA(lt_tipo_servico).
    CHECK sy-subrc = 0 AND lt_tipo_servico[] IS NOT INITIAL.
    CHECK lt_services[ 1 ]-srvpos IN lt_tipo_servico.
    cs_invfo-zlspr = 'Y'.
    cs_bseg-zlspr = 'Y'.
  ENDMETHOD.

  METHOD get_service BY DATABASE PROCEDURE FOR HDB LANGUAGE SQLSCRIPT OPTIONS
             READ-ONLY USING essr esll.
    DECLARE lv_sub_packno "$ABAP.type( PACKNO )";
    lt_sub_packno = SELECT DISTINCT SUB_PACKNO
                     FROM essr
                          INNER JOIN esll
                          on esll.packno = essr.packno
                     WHERE lblni = :iv_sheet_service;
    IF record_count( :lt_sub_packno ) > 0 then
        lv_sub_packno = :lt_sub_packno.SUB_PACKNO[ 1 ];
        et_service_nr = SELECT DISTINCT srvpos
                          from esll
                         where esll.packno = :lv_sub_packno ;
    end if;
  ENDMETHOD.

ENDCLASS.