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.

terça-feira, 27 de outubro de 2020

Gerenciando Catálogos e Grupos no Fiori

 

    Faaaaaaaala pessoal, voltei como prometido para mais um post de Fiori!!

    No post anterior mostrei para vocês como cria uma app no Fiori Lauchpad a partir de uma transação do S4. Hoje vou mostrar como você gerencia quem pode (ou não) ver esse app de acordo com o usuário do ambiente do Fiori. Faremos isso a partir de um exemplo que vai explicar todo o processo desde a criação do Catálogo e seu Grupo.

    Uma coisa que faltou deixar claro no post anterior é que, dependendo de qual foi a arquitetura escolhida na fase de projeto, podemos ter o ambiente do Fiori separado do ambiente do S4. Dessa forma os usuários não são os mesmos apesar de poderem ter o mesmo nome. Resolvi voltar um pouco nisso pois todas as configurações a seguir são referentes ao usuário do ambiente do Fiori.

    Mãos na massa!! Primeiro vamos criar o catálogo acessando a transação /UI2/FLPD_CUST:

 

terça-feira, 13 de outubro de 2020

App Fiori Baseado em Qualquer Transação

 

    Faaaaaaala pessoal do mundo ABAP!!! Sangue novo na área!!

    Meu nome é João Carlos Keusseyan Fernandes, mas se já quiser ser meu chegado pode me chamar  de filho do Mauro (brinks!!).

    E já que eu estou chegando para ficar já vou fazer aquele postada dourada de um assunto que pouca gente domina. Bora falar de Fiori!!

    Hoje vou ensinar vocês a colocar qualquer transação do S4 para rodar no front-end do Fiori.

    Para quem não está nem um pouco familiarizado, o Fiori “é uma coleção de apps que representam uma parte de um novo paradigma de experiência do usuário” (típica explicação chata de material de prova). Basicamente ele fornece um conjunto de aplicativos que são usados da mesma forma que as transações que nós conhecemos só que de forma mais inteligente, eficiente, com umas paradas gráficas bem legais e umas outras funcionalidades (pessoal sênior em Fiori quer me matar agora).

    No Fiori as aplicações são exibidas para o usuário com o formato de tiles. Estes tiles são criados dentro de um catálogo que pertencem a um grupo de catálogos através de uma dualidade tile/link (confuso pra caramba não é mesmo?!). Estes grupos/catálogos sempre precisam estar presentes na configuração do usuário, se não o carinha nunca vai poder visualizar a aplicação. Não esquentem com toda essa parte teórica, pois farei uma outra postagem explicando como configura tudo isso.

    Primeiramente precisamos criar uma parada que se chama Objeto Semântico. Esse carinha é usado para fazermos o Target Mapping que é justamente a comunicação do nosso tile com a nossa transação do S4.

    Para criar o Semantic Object acessamos o tcode /UI2/SEMOBJ (sempre com o /n antes) e adicionamos uma linha conforme segue:




    Com isso podemos acessar o Lauchpad Design (que é onde gerenciamos os tiles, catálogos e grupos) pela transação /UI2/FLPD_CUST.

quinta-feira, 25 de abril de 2019

Business Transaction Events ( BTE ) - FIBF

*  Bom dia pessoal, iremos falar hoje sobre uma negocio que é usado no
* modulo de FI, a não muito famosa BTE ( Business Transaction Events ).
*  BTE são funções pré definidas e chamadas pelo standard, são pré definidas
* para que saibamos a assinatura ( parametros de importação e Expostação ),
*  Bom.... Vamos colocando a mão na massa e durante as ações eu vou
* tentando explicar, lembrando que o comentario de vocês ajuda muito
* a melhorar o Post caso necessario.

*  Primeiro passo, como tudo na vida, antes de implementar a BTE temos que
* saber o que vamos fazer que será necessario uma BTE, faremos uma coisa
* bem simples, iremos atualizar um campo da linha de documento contabil (BSEG)
* no momento da gravação. Agora sabendo o que vamos fazer, vamos para a
* transação 'FIBF' e entramos no Menu 'Ambiente / Sistemas Info ( Processos ).




*  Vamos colocar o 'Tipo de atributo' igual a 'A' ( Componente de aplicação )



*  Vamos trabalhar com '00001430 MODIFICAR DOCUMENTO:substit.campo cab./linha'
* clicando na Botão 'Interface' conseguimos ver a assinatura e clicando no
* botão 'Modulo de função modelo'... você pode não acreditar, mas irá
* mostrar uma função que podemos usar como modelo ( rsrs ).




quinta-feira, 3 de janeiro de 2019

Como disponibilizar / preencher novos campos para tabela de determinação de conta SD

Fala galera, belezinha ? Hoje vou mostrar como incluir campos nas tabelas de determinação de preço / conta de SD; as vezes o funcional precisa de mais campos com uma regra de calculo para
definir o valor, no standard não tem a opção 'tipo de decumento de vendas' o famoso AUART, estaremos disponibilizando esse campo para o funcional continuar com o seu trabalho, vamos lá.

Primeiramente precisamos definir se o campo que desejamos disponibilizar é uma informação a nivel de Header( KOMKCZ ) ou Item( KOMPCZ ) e assim definir a tabela a qual será colocada um APPEND, no nosso exemplo eu coloquei dois campos a nivel de header ( AUART e FKART ) e um campo a nivel de item ( PSTYV ).

Header :



Item :



Abaixo mostrando os campos adicionais no catalogo de campos para a criação da determinação.