sábado, 30 de maio de 2026

REGEX - pegando somente o nome do arquivo de um caminho sem extensão

Solução gerado pelo GEMINI


====== Arquivo local

DATA lv_file TYPE string.
lv_file = 'c:\temp\programa\teste.txt'.

" We use [^\\]+ to ensure it only captures characters that are NOT backslashes
DATA(lv_filename) = replace( val   = lv_file
                             regex = `.*\\([^\\]+)\.[^.]+$`
                             with  = `$1` ).

WRITE: / 'Extracted Name:', lv_filename. " Output: teste



====== Arquivo servidor

DATA lv_file TYPE string.
lv_file = '/sap/usr/files/teste.txt'.

" This regex works for BOTH 'c:\temp\teste.txt' and '/sap/usr/teste.txt'
DATA(lv_filename) = replace( val   = lv_file
                             regex = `.*[/\\]([^/\\]+)\.[^.]+$`
                             with  = `$1` ).

WRITE: / 'Extracted Name:', lv_filename. " Output: teste


  • .*\\ : Eats up everything until a backslash.

  • ([^\\]+) : Capture Group 1. Captures 1 or more characters that are NOT a backslash (teste). Because it refuses to capture backslashes, it is forced to only look at the very last part of the path.

  • \.[^.]+$ : Matches the literal dot and the extension at the end of the string.

  • sábado, 16 de maio de 2026

    Workflow - Funções/classes para debug do trigger para execução

     SAP_WAPI_CREATE_EVENT

    SWE_EVENT_CREATE

    SAP_WAPI_START_WORKFLOW

    SAP_WAPI_CREATE_EVENT

    CL_SWF_EVT_EVENT

    terça-feira, 24 de março de 2026

    CALL FUNCTION STARTING NEW TASK - CALLING

    - FUNÇÃO


    FUNCTION ZFM_TESTE_INVOICE_CREATE

    IMPORTING

    VALUE(is_header) TYPE bapi_incinv_create_header

    VALUE(it_tm) TYPE tb_bapi_incinv_create_tm_item

    VALUE(it_item) TYPE tab_bapi_incinv_create_item

    EXPORTING

    VALUE(ev_invoicenumber) TYPE rbkp-belnr

    VALUE(ev_fiscalyear) TYPE rbkp-gjahr

    VALUE(et_return) TYPE bapiret2_t.




    CLEAR: ev_invoicenumber, ev_fiscalyear.

    CLEAR et_return.


    CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE1'

    EXPORTING

    headerdata = is_header

    IMPORTING

    invoicedocnumber = ev_invoicenumber

    fiscalyear = ev_fiscalyear

    TABLES

    itemdata = it_item

    return = et_return

    tm_itemdata = it_tm.



    IF ev_invoicenumber IS NOT INITIAL.


    et_return = VALUE #( ( type = 'S' id = 'ZMM_DRC' number = '000' message_v1 = 'Faturamento criado com sucesso.' ) ).


    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

    EXPORTING

    wait = abap_true.


    ELSE.


    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.


    ENDIF.


    ENDFUNCTION.

    ==== Chamada da função

    CALL FUNCTION 'ZFM_TESTE_INVOICE_CREATE' STARTING NEW TASK 'Z_TESTE_INV'

    CALLING zcl_teste_inv=>get_bapi_return ON END OF TASK

    EXPORTING

    is_header = ls_header

    it_tm = lt_tm

    it_item = lt_item.



    WAIT FOR ASYNCHRONOUS TASKS UNTIL gt_return[] is not initial.



    ==== Método CALL BACK


    CLASS-METHOD: get_bapi_return IMPORTING VALUE(p_task) TYPE clike,


    METHOD get_bapi_return.


    RECEIVE RESULTS FROM FUNCTION 'ZFM_TESTE_INVOICE_CREATE'

    IMPORTING

    et_return = gt_return

    ev_invoicenumber = gs_bapi_miro_ret-invoicedocnumber

    ev_fiscalyear = gs_bapi_miro_ret-fiscalyear

    EXCEPTIONS

    communication_failure = 1

    system_failure = 2.


    ENDMETHOD.




    terça-feira, 17 de março de 2026

    RAP - Fixando tamanho de colunas by annotation

    Dentro da annotation UI.lineitem existe a propriedade cssDefault.width definir o tamanho com a unidade  "rem" 


    {

    @UI.hidden : true

    key LogHandle : balloghndl;

    @UI.hidden : true

    key ExternalId : balnrext;

    @UI.lineItem: [{ position: 30 }]

    key logdate : aldate;

    @UI.lineItem: [{ position: 40 }]

    key logtime : altime;

    @UI.lineItem: [{ position: 50, criticality: 'criticality', criticalityRepresentation: #ONLY_ICON }]

    key MessageType : symsgty;

    @UI.lineItem: [{ position: 60 , cssDefault.width: '40rem' }]

    @EndUserText.label: 'Log Message'

    key MessageText : bapi_msg;

    @UI.hidden: true

    criticality : abap.char(1);

    }

    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.