domingo, 26 de julho de 2026

RAP - Side effect

 o side effect é muito útil para dar um refresh na tela quando é actionado alguma action ou campo dentro do seu app, basicamente basta definir o campo q vai ser o trigger para dar o refresh e qual o campo terá seu comportamento alterado.

No meu caso é um app simples que cadastra parâmetros de valores como uma TVARV, e eu quis fazer um esquema para quando a opção for EQ bloquear o campo HIGH do meu app e se selecionar o BT habilitar novamente.

No meu caso é um app com header e item e criei uma instance feature para o meu campo q vai ficar bloqueado ou não









Uma sacada muito importante é q não pode esquecer de declarar o side effect no behavior da projection, essa parte eu tenho q dar crédito ao TECHNOMANIAC que descobri vendo o vídeo dele.













No meu caso pedi para IA criar tbm um detemination para limpar o campo HIGH caso estivesse preenchido e mudasse a opção para EQ.
no caso a detemination CLEARVALHIGH

Esse é o meu app e onde o side effect foi colocado





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

    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'  )