quarta-feira, 29 de abril de 2026

REPLACE 2.0 - Trocando velhos hábitos (ABAP 7.4+)

 *&---------------------------------------------------------------------*

* Eai galerinhaaa, voltando para trazer um post importante para aqueles
* que estão precisando fazer aquela substituição precisa de final de copa.
* o replace veio com o abap 7.40+ para nos ajudar a acelerar na alteração
* de caracteres com facilidade e praticidade.

REPORT Z_TROCANDO_OS_PÉS.

* Antes de trazer o comando e o uso deixa eu explicar algumas coisinhas
* a função replace é utilizada da seguinte forma e com os parametros de forma
* opcional:
*
*DATA(resultado) = replace (
*                            val  = texto
*                            sub  = 'A'
*                            with = 'E'
*                            occ  = 0
*                            case = true
*                            regex = '^E-'
*                         ).

* Então descrevendo cada parametro:
*
* VAL -> Obrigatório! Será o texto/variavel original a ser substituido.
* SUB -> Obrigatório! Será o valor a ser trocado exemplo letra ou numero.
* WITH -> Obrigatório! Será o valor de substituição.
* OCC  -> Opcional! Será a ocorrencia que deve ser trocada e caso seja 0 será
* executado todas as vezes que aparecer o valor a ser trocado.
* CASE -> Opcional! determina se é case sensitive para não trocar letras em
* caso de maiúscula e minúscula.
* REGEX -> o regex é aquele treco complexo que remove caracteres diferenciados haha

* Beleza agora que ficou mais claro, vamos para a pratica!!

* Supondo que estamos com um problema, eu tenho um problema no meu programa
* que exige que eu substitua sempre a letra F por G por uma limitação, como
* fazer isso da melhor forma sem ter o replace antigão.


* Classico criando variaveis de texto.
DATA(texto|Fato|.

BREAK-POINT"Esse break é para entedendermos o valor do texto

DATA(animalreplaceval  texto
                        sub  'F'
                        with 'G' ).

BREAK-POINT."Esse é para vermos o valor da variável animal e ver o que houve

Continue Lendo...

quarta-feira, 15 de abril de 2026

TRANSLATE 2.0 - Traduzindo velhos hábitos (ABAP 7.4+)

*&---------------------------------------------------------------------*
* Eaiii pessoal tudo bão ? Seguinte hoje eu vim renovar um post antigo do
* Mauro(Mestre ABAPssauro) do nosso coração, e o respectivo post é o do
* translate upper/ to lower case. A gente gosta de coisa vintage mas não da
* para ficar usando velharia em código moderno meus jovens, bora fazer
* aquela moral com o Senior e colocar as nossas queridas built-in functions
* na jogada !!

* Então vamo lá a premissa é a mesma, "Felipão estou controlando um parametro
* de entrada direto por uma variavel porém se ela não for maíuscula/minúscula
* vou ter vários problemas para cair nos meus CASES/WHEN/SWITCHS, o que
* fazer ? " Não temas, como o Mauro ja nos ensinou no passado, temos os
* comandos do TRANSLATE, se quiser saber mais da uma olhada nesse link
* abaixo:

TRANSLATE ... TO LOWER / UPPER CASE e USING

* Porem chegou a hora de modernizar a parada e trazer uma cara mais atual
* ao seu código abap.

REPORT ZFELIPE_UPPER_TO_LOWER_V2.


* Primeiro vamos criar uma variavel de texto digamos que ela será usada para
* controlar uma maquina de refrigerante. E meus cases utilizam tudo em Upper
* Case.
DATA(saboor_refrigerante|laranja|.

* Agora preciso convertela para upper case de forma rápida.Criarei mais uma
* variável para manter um fluxo mais visível para que voce possa visualizar
* depois.
DATA(saboor_maisculoto_uppersaboor_refrigerante ).

WRITEsaboor_maisculo.
* Viu só nem doeu, "Aaaa Felipe o outro tambem era só uma linha pra que vou
* usar assim ? " Agora que te explico jovem, esse carinha você pode usar
* de maneira mais dinâmica e durante execuções de outros comandos.

* Exemplo:

* vou criar uma tabela simples apenas para demonstrar e claro vamos deixar
* nossa sintaxe cada vez mais moderna.

data(tabela_de_saboresVALUE string_table|uva| )
                                              |cola|    )
                                              |limao|   ).

* Caso não esteja acostumado a criar tabelas assim, elas vieram com abap
* 7.5+ voce passa o VALUE e o tipo da tabela/estrutura e dentro
* dela preencherá as colunas e linhas com o que deseja, faremos um post
* mais detalhado logo logo , mas ja falo isso salva muito tempo em teste
* hahah.

LOOP AT tabela_de_sabores INTO DATA(sabor).

  WRITE/to_uppersabor )"Lembre de respeitar o espaço dentro dos
                               "parenteses.
ENDLOOP.

* viu ? não precisei colocar o translate, criar uma variável e por fim
* escrever o valor na tela, aqui fazemos tudo ao vivo e a cores

* "Tabeleza Felipão agora vi que da para usar o upper mas e o lower ? Mesma
* lógica rapaziada, apenas o nome muda usaremos o to_lower( ).

DATA(tabela_de_sabores_em_upperVALUE string_table|GUARANA| )
                                                       |ABACAXI| )
                                                       |FRAMBOESA| ).

LOOP AT tabela_de_sabores INTO DATA(saboor).

  WRITEto_lowersaboor )"Lembre de respeitar o espaço dentro dos
                                 "parenteses e as piadas.
ENDLOOP.

* "OKAYYY mas e o translate using que substituia as parada?" Então pessoal
* esse carinha não tem um substituto 1:1 mas a função não morreu calma,
* vamos usar um cara que vou apresentar aqui e focar mais em outro post.

* Esse cara é o replace( ) na tradução clara ja diz ele vai subtituir o valor
* por outro, e como usar ele é bem simples.

DATA(linha_toda_errada|betete|.

DATA(linha_certareplaceval  linha_toda_errada "origem
                             sub  |e|  " valor a ser substituído
                             with |a|  " valor a ser inserido
                             occ  )" occ é a ocorrencia

WRITE/linha_certa.

* Seguinte galera essa é versão 2.0 do uso do translate e ai ? o que acharam
* nos digam ai nos comentários, digam se faz sentido essa "inovação" da SAP
* e quais outros exemplos de uso existem para esses caras
*
* Um abraço pessoal, bebam água e comam frutas !! tmj.

quinta-feira, 2 de abril de 2026

Introdução a Built-In Functions REVERSE - Here it comees a new Challeengeerrr

*--------------------------------------------------------------------*
*  Fala galera!!O Mauro(Membro raiz do Clã) foi lá na minha casa me chamar
* para ajudar com os posts aqui no blog, Prazer a todos meu nome é Felipe
* estou no ABAP a cerca de 4 anos e um dos meus hobbies favoritos é
* quebrar os programinhas Z dos colegas. Brincadeiras a parte, adoro
* ensinar e ajudar as pessoas por isso devo estar participando de
* posts futuros !Vamo junto nessa jornada.

*  OBS: Gosto de animes e games então quaisquer referência é apenas
* coincidência.

*  Galera alguma vez você ja se encontrou na situação de fazer achar uma
* posição de um delimitador, letra ou caractere porem ele se repete várias
* vezes e voce só quer a ultima vez que ele da as caras ?
* então com a versão 7.4+ o abap trouxe algo muito popular em outras
* linguagens que é BUILT-IN functions

*  Felipão, nunca toquei em outra linguagem o que é uma built-in function ?"
* Então as built-in's functions
* são a salvação dos DEV's pois elas agilizam o que antes tinha classes,
* plugins ou funções que precisavam
* de pacotes ou serviços especificos mas que foram imbutidas diretamente
* na linguagem.

* Hoje vamos usar a funcionalidade REVERSE.

*--------------------------------------------------------------------*

REPORT zfelipe_domi_reverse.

DATA(uma_string|Laranja;Maca;Banana;Tomate;Picles|.
*  Se voce ainda não se acostumou com string templates relaxa pois elas
* são bem simples os 'PIPES' ou barras verticais dão inicio tudo que fica
* dentro delas serão strings."e claro a declaração inline é algo que já
* devemos começar a introduzir no dia a dia

DATA(uma_string_invertidareverseuma_string ).
* Não esquece dos espaços porque o reverse é como um metodo

BREAK-POINT.
*  Nesse momento da uma olhada na variavel string invertida e
* repare que ela literalmente inverte no melhor estilo Stranger Things.

*  Vamos agora encontrar o OFFSET "Felipão, o que é OFFSET?" - É a posição de
* index ou seja a posição colunar exata do caractere na string

FIND ';' IN uma_string_invertida MATCH OFFSET
DATA(ultima_aparicao_do_cara).
BREAK-POINT.
*  Repare que eu crio o OFFSET inline para trazer as boas práticas e claro
* facilitar minha vida. - Da um duplo clique nesse cara.Voce vai notar
* que o numero 6 é exatamente a posição do ultimo ";"
*  Mas Felipão para que eu uso isso ? - Muitas coisas vocepode garantir que
* o ultimo cara seja deletado ou o ponto de partida.
* Exemplo vou usar ele para deletar o que vem depois para
* isso vou fazer um calculo simples

DATA(delimitador_finalstrlenuma_string ultima_aparicao_do_cara.
BREAK-POINT.
*  Usei o string length outra built-in para calcular o
* tamanho da string, da um duplo clique voce vai ver que ele é um INT e
* se eu subtrair o valor que eu achei no reverse vou deletar o que vem
* depois

 write uma_string(delimitador_final).
*  Essa variavel é um INT então posso jogar ele aqui.

*  Legal Ne ? isso pode ser útil quando voce não quer fazer um contador
* com um loop de while = true. Por favor deem sugestões de uso para esse
* recurso e claro deixem os comentários de dúvidas e dicas.
*  Valeu Galera até a proxima.