*&---------------------------------------------------------------------*
* 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_maisculo) = to_upper( saboor_refrigerante ).
WRITE: saboor_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_sabores) = VALUE 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_upper( sabor ). "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_upper) = VALUE string_table( ( |GUARANA| )
( |ABACAXI| )
( |FRAMBOESA| ) ).
LOOP AT tabela_de_sabores INTO DATA(saboor).
WRITE: / , to_lower( saboor ). "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_certa) = replace( val = linha_toda_errada "origem
sub = |e| " valor a ser substituído
with = |a| " valor a ser inserido
occ = 0 ). " 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.
ABAP Junior
quarta-feira, 15 de abril de 2026
TRANSLATE 2.0 - Traduzindo velhos hábitos (ABAP 7.4+)
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_invertida) = reverse( uma_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_final) = strlen( uma_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 )
* 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 !!!!!
* 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.
* 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.
quinta-feira, 23 de novembro de 2023
BPA - Criando o primeiro Projeto do zero - Passo 2
Fala
pessoal, agora que você já mexeu nessa nova ferramenta ( se não mexeu segue o
link de como fazer o primeiro projeto aqui à https://abapjuniores.blogspot.com/2023/11/bpa-criando-o-primeiro-projeto-do-zero.html.
Agora vamos
melhorar um pouco mais esse projeto, acredito que vocês tenham percebido que se
outro Usuário tentar executar o seu projeto ele não vai funcionar por falta de
configurações no aplicativo pois os ‘Critérios de reconhecimento’ não deixam
outra pessoa acesso, para mudar isso entre no aplicativo e selecione a tela
inicial do SAP.
E nos critérios
de reconhecimento mude para a imagem abaixo, Aplique e agora você generalizou o
acesso.
terça-feira, 14 de novembro de 2023
BPA - Criando o primeiro Projeto do zero
Fala pessoal, espero que vocês já tenham os
acessos necessarios para começar a brincar de BPA com a gente, se tem bora
fazer nosso primeiro projeto e executar ele via Cloud vendo o projeto acontecer
no modo ‘Aberto’, no proximo post vou monstrar como atribuir o projeto criado num
trigger e executar esse projeto usando o APP Desktop Agent como se fossemos um
usuário e depois vamos conversar sobre possibilidades de processamento que a
ferramenta possui.
Primeiramente vamos entrar no serviço.
Essa vai
ser a carinho dele. Lembrando que estamos conversando agora e que muito
possivelmente o layout disso mude também pois tem sempre uma novidade a cada
duas semanas e porisso decidi iniciar logo esses posts pra que toda vez que
tivermos uma atualização consideravel vou fazer um post pra conversarmos sobre.
Vamos clicar em ‘Criar’ e inicialmente vamos
trabalhar com ‘Processo automatizado’, não sei se vocês fazem isso mas quando
eu não conheço a ferramenta eu sempre clico nos icones de ‘Help’ ou ‘Saiba Mais’,
sobre ferramentas SAP sempre tem o Help.sap.com ( https://help.sap.com/docs/build-process-automation/sap-build-process-automation/what-is-sap-build-process-automation ), esse link acima vai mostrar tudo
sobre BPA, acho que vale a pena dar uma olhada.
quinta-feira, 2 de novembro de 2023
BPA - Build Process Automation - pra que serve ?
O que é BPA? Vamos fazer uma serie de posts sobre esse assunto e espero que consigamos entender melhor esse assunto que promete muito pela SAP e responder a essa pergunta de forma mais rápida.
BPA, “Build process Automation”,
acho que o pessoal da SAP tem metas pra criação de siglas pois pouco tempo antes
o nome era RPA, “Robotic Process Automation” e depois iRPA, Inteligence Robotic
Process Automation, mas no iremos chamar de BPA.
Essa ferramenta vem com um proposito
inovador, com um conceito de facilitar o desenvolvimento de automações de
processos que podem ser considerados repetitivos dentro do SAP, uma das grandes
vantagens seria que essa ferramenta é Low Code possibilitando a criação e
desenvolvimento por um usuário ou analista, não necessariamente por um técnico,
engenheiro de Software ou arquiteto de soluções, otimizando o tempo de entrega de
uma solução já que o próprio analista desenharia e faria o RPA, sem necessidade
de transferencia de conhecimento sobre o problema.
Quero ressaltar que de essa
ferramenta é bem nova no mundo SAP e estou dando minha opnião conforme minha
experiencia ao desenvolver e solucionar casos, deixo aberto a comentarios nesse
post e tomara que consigamos tirar proveito dessa ferramenta juntos.
A ideia desse post é fazer uma
introdução sobre o que é, e quando podemos usar, com o tempo vou lançando novos
posts com caso e depois que entendermos mais sobre tentativas de novos projetos
usando novidades do BPA como desafio mesmo.
O Objetivo dessa ferramenta é
facilitar o desenvolvimento de projetos que resolvam problemas sistemáticos de
forma automática
Sabe quando temos um processo que
mensalmente temos que entrar em alguma transação e pedir pra executar um
programa pra atualizar algo, ou coisa robóticas como todo o dia as 8 da manhã o
usuário precisa verificar quantos documentos foram criados em um intervalo e
mandar um e-mail pra alguém ou usar essa informação para atualizar algo, isso
as vezes toma um tempo desnecessário e tem a possibilidade ainda de algum esquecimento
por parte do usuário e se esse processo for importante pode ter alguma consequência não muito positiva.
A grande vantagem de usar essa
ferramenta é automatizar passos de algum processo ou até mesmo o processo inteiro,
economizando tempo e diminuindo a possibilidade de erros ou esquecimentos por parte
do usuário, acredito que se você nunca trabalhou com BPA a melhor forma de
começar é criando um projeto para automatizar algo simples como mandar uma
Mensagem pra alguém num horário especifico ou atualizar alguma coisa pessoal
com alguma informação de outra fonte. Uma grande vantagem que essa ferramenta
SAP nos permite é automatizar e deixar pré-definido o momento de iniciar,
podemos criar não somente uma criação para SAP mas também Non-SAP como mandar
uma Mensagem no Teams, enviar um e-mail para alguém, ou entrar num Excel e
executar alguma macro, todo o desenvolvimento e teste disso pode ser feito via
BTP ( Cloud Plataform ), mas uma desvantagem seria que para a execução do
projeto de BPA para o usuário final seria necessário a instalação de um App (
link abaixo ) para executar o projeto.
Se vocês, depois de lerem
consideram que possa usar essa ferramenta SAP pra automatizar algum processo da
sua empresa ou até mesmo algum processo seu, recomendo conversar com o pessoal
que gerencia seu acesso na Cloud e acessar esse serviço.
App link à https://tools.hana.ondemand.com/#cloud
Procure por Desktop Agent e
pronto.
No próximo post já com tudo
instalado e funcionando iremos fazer uma automação simples, passo a passo e
aprender juntos a criar, fazer o trigger, atribuir e executar no app.
Espero que esse post tenha pelomenos
acendido a curiosidade de vocês sobre essa ferramenta que promete muito e como é
low-code acredito que geral vai estar usando.
Vlw e qualquer coisa tamo junto. Fuii.
segunda-feira, 25 de outubro de 2021
Roubando alv's Standard para o nosso programa
* Sabe quando o funcional te chama falando que está afim de fazer um relatorio
* muito parecido com o um relatorio standard mas cheio de 'Fru Fru',
* neste momento você já começa a pensar que terá que 'debugar' o standard
* pra saber como chegar nos dados principais do relatorio antes mesmo de
* incluir as 'Melhorias', pois seus problemas acabaram.... rs ( Sempre quis
* falar isso). Com esse post podemos processar o relatorio standard e pegar
* os dados que seriam exibidos na tela, e depois disso, com todos os dados
* base, podemos fazer os adicionais sem problema nenhum. Bora pro codigo.
* Abaixo temos um exemplo, aonde o funcional me pediu para trazer os dados
* referente a documentos financeiros usando apenas o 'Conta Razão', 'Empresa'
* e 'Data de lançamento'... Conversamos sobre os acessos na tabela e
* mostrei que não tinhamos esse Indice na tabela e que talvez sofreriamos
* com a performance do programa, teriamos que ter mais parametros para
* conseguir acessar as tabelas com as chaves e assim entregar conforme
* esperado, o funcional insastifeito depois de ter feito uma documentação
* da demanda tudo baseada nessa seleção sem chaves faz o seguinte comentario,
* - Ahhhhh, mas no standard funciona rápido quando eu coloco somente essas
* informações !!!
* Eu em choque, sem entender, pergunto. - Rápido ?!! Standard ?!!
* Depois disso o funcional complementa. - Sim, quando rodo a FBL3N
* ( Relatorio de partidas individuais - Contas do razão ) me mostra um
* relatorio no final que aparece relativamente rapido.
* Com essas informações lembrei que conversando com um amigo do trabalho,
* o mesmo me falou sobre uma classe que deixa o retorno do processo em
* memoria e assim podemos buscar essa informação e depois tratar como
* quiser.
* Segue codigo comentado abaixo como exemplo.
REPORT zrtts.
*--------------------------------------------------------------------*
TABLES :
bkpf, bseg.
TYPES :
BEGIN OF ty_bkpf,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
budat TYPE bkpf-budat,
END OF ty_bkpf.
DATA :
t_bkpf TYPE TABLE OF ty_bkpf,
s_bkpf TYPE ty_bkpf.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECT-OPTIONS :
r_saknr FOR bseg-saknr,
r_bukrs FOR bseg-bukrs,
r_budat FOR bkpf-budat.
SELECTION-SCREEN END OF BLOCK b1.
* Definir para não mostrar ALV, Metadata
cl_salv_bs_runtime_info=>set(
EXPORTING display = abap_false
metadata = abap_false
data = abap_true ).
* Chamado do programa do FBL3N e passando os parametros de tela.
SUBMIT rfitemgl
WITH sd_saknr IN r_saknr
WITH sd_bukrs IN r_bukrs
WITH so_budat IN r_budat
WITH x_opsel EQ abap_false
WITH x_clsel EQ abap_false
WITH x_aisel EQ abap_true
WITH x_norm EQ abap_true
* WITH pa_vari EQ '/OES_EXT'
AND RETURN.
TRY.
DATA ol_pay_data TYPE REF TO data.
FIELD-SYMBOLS: <fs_pay_data> TYPE ANY TABLE,
<pay_data> TYPE ANY.
* Busca tabela do ALV em processamento do Submit
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = ol_pay_data ).
* Atribui para tabela dinâmica
ASSIGN ol_pay_data->* TO <fs_pay_data>.
CATCH cx_salv_bs_sc_runtime_info.
* #ec no_handler
ENDTRY.
* Limpa runtime
cl_salv_bs_runtime_info=>clear_all( ).
*--------------------------------------------------------------------*
* No ambiente atual que estou não consigo usar comando 'Inline' mas
* segue abaixo eu pegando o retorno e colocando na minha tabela interna.
FIELD-SYMBOLS :
<bukrs> TYPE bkpf-bukrs,
<belnr> TYPE bkpf-belnr,
<gjahr> TYPE bkpf-gjahr,
<budat> TYPE bkpf-budat.
LOOP AT <fs_pay_data> ASSIGNING <pay_data>.
ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <pay_data> TO <bukrs>.
ASSIGN COMPONENT 'BELNR' OF STRUCTURE <pay_data> TO <belnr>.
ASSIGN COMPONENT 'GJAHR' OF STRUCTURE <pay_data> TO <gjahr>.
ASSIGN COMPONENT 'BUDAT' OF STRUCTURE <pay_data> TO <budat>.
s_bkpf-bukrs = <bukrs>.
s_bkpf-belnr = <belnr>.
s_bkpf-gjahr = <gjahr>.
s_bkpf-budat = <budat>.
APPEND s_bkpf TO t_bkpf.
CLEAR s_bkpf.
ENDLOOP.
*--------------------------------------------------------------------*
* Gostaria que vocês percebecem que mesmo colocando layout no relatorio
* standard quando darmos o 'Get' dos dados, ele vira toda a tabela de
* saida que seria usada no ALV da transação Standard.
* Espero ter ajudado e qualquer coisa tamo aeeeee. Vlw.