Mostrando postagens com marcador Diquinha do Dia. Mostrar todas as postagens
Mostrando postagens com marcador Diquinha do Dia. Mostrar todas as postagens

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...

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.

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.

segunda-feira, 25 de outubro de 2021

Roubando alv's Standard para o nosso programa

*  Fala pessoal, hoje vou mostrar uma dica que pode facilitar muito seu
* desenvolvimento ou no minimo diminir o tempo para entregar....
*  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 :
  bkpfbseg.

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.