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.

quarta-feira, 28 de janeiro de 2026

BPA - Trabalhando com BAPI ( Action Group )


*  Eae galerinha, vamos voltar a conversar sobre um assunto muito interessante,
* BPA é uma das ferramentas que o pessoal da SAP mais fala, juntamente com
* Inteligencia artificial e DataSphere. Automatização de processos usando
* uma ferramenta low / no code pode ser usados para equipes não técnicas também
* e isso entregaria valor em um tempo mais curto para o negocio, sendo que
* o próprio analista pode desenvolver algo e entregar algo, que as vezes
* pode representar uma boa porcentagem do tempo do time, assim sobrando
* tempo para fazer outras coisas, não só a SAP como o mercado espera isso.

*  Já tínhamos conversado sobre BPA anteriormente fazendo um projeto simples
* em dois passos.

https://abapjuniores.blogspot.com/2023/11/bpa-criando-o-primeiro-projeto-do-zero.html
https://abapjuniores.blogspot.com/2023/11/bpa-criando-o-primeiro-projeto-do-zero_01276228367.html

*  Hoje vou mostrar a aplicabilidade do BPA para processos massivos, acredito
* que saibam que SHDB não é mais suportado pela SAP e durante a migração de
* dados de um ambiente ECC para S/4 Hana tivemos que fazer vários projetos
* migrando todos os SHDB ( O business usava pra varias coisas ) para
* projetos em BPA, migramos todos para o processo que eu passei aqui, igual
* aos dos links acima, fazendo mapping de telas, cliques, ações, com o SAP
* aberto e reservando a maquina para processar a massa.
*  Resolvemos a migração e centralizamos todos os processos em massa no BPA,
* mas acabou gerando outros problemas, erros não previstos nas telas de load,
* reposicionamento de certos campos conforme telas anteriores, timeout,
* sem contar os problemas procedurais pois o usuário tinha que reservar a
* sua própria maquina para executar as massas, e não conseguiam trabalhar em
* assunto pois a maquina estava rdando o BPA, execuções que acabaram depois
* de um tempo ficando bem maiores conforme a confiabilidade na ferramenta
* ia crescendo.

*  Percebendo esses problemas foi considerado o inicio de uma nova versão do
* do produto, além de usar a tela aberta, migramos para a execução de BAPI's
* da massa de dados.

*  Nesse post vamos aprender a criar a conexão do nosso projeto do BPA com
* o ambiente SAP que vocês querem acessar, vamos criar nosso primeiro
* 'Action Group', relacionar uma BAPI. Depois faremos mais post sobre como
* testar e relacionar ele no seu projeto em massa.

* Então bora lá, primeiramente vamos criar um projeto novo.






*  Depois de ter criado o projeto já vamos direto criar um 'Action Group'
* isso permitirá criar uma conexão com o ambiente que vai rodar a BAPI




*  Para alimentar os parâmetros listados abaixo é necessário entrar no
* SAPGui e clicar em 'Variable Logon' selecionar o ambiente que você
* gostaria de acessar e replicar os dados nos parâmetros do Pop-up do
* 'Action Group' usando o 'Next' do Logon do SAPgui para ver todos os
* valores necessários.




*  Ficando dessa forma, se tiver com algum problema sobre isso chama o
* pessoal de Basis pra ajudar vocês.

terça-feira, 20 de janeiro de 2026

ABAP juniores Voltou !!!!!


*  Eae galera, quanto tempo heimmm!?? Nesse meio tempo aconteceu muita coisa,
* virei Pai, mudei de emprego, mudei de cidade, novas rotinas e no meio
* dessa mudança toda eu não estava conseguindo conciliar o Blog, mas os temas
* de posts ainda continuavam sendo listados, sem muito tempo pra fazer algo
* ainda, mas agora estamos passando por reformulações e uma equipe 
* qualificada estará nos ajudando, não vou apresentar eles aqui pois eles
* mesmos irão fazer isso nos respectivos posts futuros.

*  Esse post é mais para informar que voltamos com tudo, muitos planos,
* ideia e vontade de mostrar as coisas novas que estão acontecendo sem 
* esquecer o ABAP Raiz que somos rsrs.

*  Além dos time ter aumentado agora também estamos com novos parceiros
* para entrega de currículo e indicação, portanto estão querendo trocar de
* emprego ou estão procurando algo, nosso time irá ajudar vocês nesse processo
* também.
*  Continuamos usando o mesmo E-mail para receber esses Currículos mas em um
* futuro próximo estaremos centralizando essas informações em outro e-mail 
* para facilitar a todos.

*  Contamos com a colaboração e engajamento nas conversas do post e 
* pontos a serem conversados que possivelmente podem virar um Post.

*  Como eu disse antes, estamos voltando com tudo mas a equipe tem muita 
* coisa pra alinhar, mas o mais importante, estamos preparando e alinhando
* muitas novidades para o Blog.

*  Voltamos e contamos com todos, iremos criar posts periódicos igual 
* fazíamos anteriormente.

*  Valeo Pessoal e bora aprender, juntos.