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

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

segunda-feira, 29 de março de 2021

Tradução de Catálogos/Tiles do Fiori

    Faaaaaaaaaaaala pessoal!! Eu volteeeeeeeeei!!

    Hoje eu vou mostrar para vocês como que fazemos as traduções de objetos de Catálogos e Tiles do Fiori!

    Para isso tomei como base o link da própria SAP (https://help.sap.com/viewer/a7b390faab1140c087b8926571e942b7/201809.002/en-US/d6c587a7c973479a8bcb7024406fae8e.html), mas percebi que estava com um furo no processo e então resolvi trazer para vocês como eu aconselho que isso seja feito.

    Primeiro vamos acessar a transação /UI2/FLT e colocar o nome do catálogo no qual se encontra os objetos que serão traduzidos. 



    Para traduzir o nome do Catálogo pegamos o código da coluna "Main WD Config Key" e acessamos a transação SE63. Esse código (assim como o próximo que vai ser utilizado) também pode ser obtido pela /UI2/FLC.



    Na SE63 vamos em Translation > ABAP Objects > Transport Object


    Agora colocamos o código do objeto que representa o título do nosso Catálogo que pegamos anteriormente, preenchemos os campos restantes com R3TR e WDCC e vamos em Edit.



    Assim podemos traduzir os textos normalmente!



    Para traduzir os Tiles precisamos ver se ele possui algum Catálogo como referência e a partir dai vemos dois casos:


1. Ele não possui:

        Fazemos da mesma forma que fizemos com o Catálogo porém com a coluna "Property WD Config Key".


2. Ele possui:

        Nesse caso precisamos ir na coluna "Catalog Reference Id" e pegar o código dos objetos a partir desse Catálogo. Com ele em mãos, executamos novamente a transação, pegamos o "Property WD Config Key" e fazemos o processo da mesma forma que já foi feito.


    Depois de traduzidos só não pode esquecer de colocar os objetos diretamente dentro de uma request.


    E é isso pessoal!! Tudo Feito!! 
    Me desculpem pela sumida e fiquem no aguardo para o próximo post!

quinta-feira, 12 de novembro de 2020

Como enviar e-mail via SAP (CL_BCS)

 *  Eae Pessoal, hoje vou mostrar como é facil enviar e-mail pelo sistema

* para qualquer e-mail cadastrado, abaixo fiz um programa que uso sempre
* como base quando pedem para enviar e-mail para alguem após algum processo
* somente informativo.
*  Nesse nosso exemplo estaremos definindo o destinatario e o remetente
* cadastrados da TVARVC, mas não impede que durante os testes vocês troquem
* colocando fixo ( não recomendo ) ou usando os dados baseado no ID do
* Parceiro ( aih sim heimmm ), outra coisa que está disponivel
* mas nós não estamos usando é a possibilidade de inclusão de anexo no
* formato PDF, para fazer isso o metodo aguarda uma tabela OTF para converter
* e anexar, essa tabela OTF, caso não saibam é o retorno quando você chama
* um Smartforms, num proximo post eu coloco esse exemplo e como anexar outros
* tipos de documentos também, incluindo objetos 'SAP' como item de WorkFlow.
*  Codigo abaixo como sempre todo comentado, os nomes dos metodos estão 
intuitivos também.
*  Um brinde nesse post é que está codificado de forma 'INLINE', outro post que
* está sendo montado e em breve vamos compartilhar.
*  Bons estudos e valeoooo.

REPORT ztrigger_email_interno.

CLASS cl_main DEFINITION.
  PUBLIC SECTION.
    DATA:
        gx_bcs_exception  TYPE REF TO cx_bcs.
    METHODS:
      seleciona_dados
        EXPORTING
          ev_out TYPE boolean,
      sender_email
        RETURNING VALUE(rv_senderTYPE ad_smtpadr,
      recipient_email
        RETURNING VALUE(rv_recipientTYPE ad_smtpadr,
      subject_email
        RETURNING VALUE(rv_subjectTYPE so_obj_des,
      body_email
        RETURNING VALUE(rt_bodyTYPE soli_tab,
      envia_email
        IMPORTING
          iv_sender_email    TYPE ad_smtpadr
          iv_subject         TYPE so_obj_des
          iv_recipient_mail  TYPE ad_smtpadr
          it_body            TYPE soli_tab OPTIONAL
          iv_attachment_name TYPE sood-objdes OPTIONAL
          it_otf             TYPE tsfotf OPTIONAL
        EXPORTING
          ev_sent            TYPE boolean.
ENDCLASS.

CLASS cl_main IMPLEMENTATION.
  METHOD envia_email.
    TRY .
* Criação do objeto e-mail para envio
        DATA(ol_send_requestcl_bcs=>create_persistent).



* E-mail remetente
        DATA(ol_sender=
          cl_cam_address_bcs=>create_internet_addressiv_sender_email ).
        ol_send_request->set_senderi_sender ol_sender ).

* E-mail de destino
        DATA(ol_recipient=
          cl_cam_address_bcs=>create_internet_addressiv_recipient_mail ).
        ol_send_request->add_recipient(
          EXPORTING
            i_recipient ol_recipient
            i_express   abap_true
        ).

* Corpo do e-mail
        DATA(ol_document=
          cl_document_bcs=>create_document(
            i_type    'HTM'
            i_text    it_body
            i_length  '90'
            i_subject iv_subject ).

* Anexo do e-mail
        IF it_otf[] IS NOT INITIAL.
          DATA :
            tl_itcoo    TYPE STANDARD TABLE OF itcoo,
            tl_pdf      TYPE STANDARD TABLE OF tline,
            vl_len_in   TYPE sood-objlen,
            vl_bin_file TYPE xstring.

          tl_itcoo[] it_otf[].

          CALL FUNCTION 'CONVERT_OTF'
            EXPORTING
              format                'PDF'
              max_linewidth         123
            IMPORTING
              bin_filesize          vl_len_in
              bin_file              vl_bin_file
            TABLES
              otf                   tl_itcoo
              lines                 tl_pdf
            EXCEPTIONS
              err_max_linewidth     1
              err_format            2
              err_conv_not_possible 3
              err_bad_otf           4
              OTHERS                5.

          DATA(tl_attachment_hex=
            cl_bcs_convert=>xstring_to_solixvl_bin_file ).
          ol_document->add_attachment(
            EXPORTING
              i_attachment_type    'PDF'
              i_attachment_subject iv_attachment_name
              i_att_content_hex    tl_attachment_hex
          ).
        ENDIF.

* Adiciona o Anexo no e-mail
        ol_send_request->set_documentol_document ).



* Dispara o envio do e-mail
        ev_sent ol_send_request->sendi_with_error_screen abap_true ).

        IF ev_sent IS NOT INITIAL.
* Realiza o envio do e-mail.
          COMMIT WORK.

        ENDIF.


      CATCH cx_bcs INTO me->gx_bcs_exception.

    ENDTRY.

  ENDMETHOD.

  METHOD seleciona_dados.

    BREAK-POINT.

*  Dentro desse metodo você pode usar a regra que quiser e assim preencher
* o parametro para que dispare o e-mail.

    ev_out abap_true.

  ENDMETHOD.

  METHOD sender_email.
    SELECT SINGLE low FROM tvarvc INTO rv_sender
      WHERE name 'Z_GRC_PC_SENDER'.
  ENDMETHOD.

  METHOD recipient_email.
    SELECT SINGLE low FROM tvarvc INTO rv_recipient
      WHERE name 'Z_GRC_PC_RECIPIENT'.
  ENDMETHOD.

  METHOD subject_email.
    rv_subject 'Titulo do email de testes - ABAPJuniores'.
  ENDMETHOD.

  METHOD body_email.

    DATA :
      lt_lines TYPE TABLE OF tline.

    CALL FUNCTION 'READ_TEXT'
      EXPORTING
        client                  sy-mandt
        id                      'ST'
        language                'P'
        name                    'Z_BODY_DO_EMAIL'
        object                  'TEXT'
      TABLES
        lines                   lt_lines[]
      EXCEPTIONS
        id                      1
        language                2
        name                    3
        not_found               4
        object                  5
        reference_check         6
        wrong_access_to_archive 7
        OTHERS                  8.

    IF lt_lines[] IS NOT INITIAL.
      LOOP AT lt_lines ASSIGNING FIELD-SYMBOL(<lines>).
        APPEND INITIAL LINE TO rt_body ASSIGNING FIELD-SYMBOL(<body>).
        CASE <lines>-tdformat.
          WHEN '*'.
            <body>-line <lines>-tdline && space.
          WHEN '*/'.
          WHEN OTHERS.
        ENDCASE.
      ENDLOOP.
    ENDIF.

* Tratativa especial de testes
    IF rt_body[] IS INITIAL.
      APPEND INITIAL LINE TO rt_body ASSIGNING <body>.
      <body>-line 'Corpo do email teste.'.
    ENDIF.


  ENDMETHOD.

ENDCLASS.

DATA
 o_main TYPE REF TO cl_main.

START-OF-SELECTION.

  CREATE OBJECT o_main.
  o_main->seleciona_dados(
    IMPORTING
      ev_out DATA(lv_out).

  IF lv_out IS NOT INITIAL.
    BREAK-POINT.
    o_main->envia_email(
      EXPORTING
        iv_sender_email   o_main->sender_email)
        iv_subject        o_main->subject_email)
        iv_recipient_mail o_main->recipient_email)
        it_body           o_main->body_email)
    ).
  ENDIF.