Módulo de função para enviar e-mail

Fábio Pagoti: Hoje o post é de uma pessoa nova aqui no blog. Um tempo atrás uma leitora entrou em contato com o blog para tirar algumas dúvidas e depois de um tempo resolveu escrever seu próprio post. Estou falando da Aline Cristina, ABAPeira de Minas Gerais e que apesar de trabalhar com ABAP relativamente a pouco tempo, fez um post com alto nível técnico. O assunto é de interesse de todos, pois refere-se a um módulo de função para enviar e-mails dentro de uma aplicação ABAP.

enviar e-mail

Parabéns pelo post Aline! Que seja o primeiro de muitos. Em seguida, o post na íntegra.

Precisei fazer uma rotina onde, um e-mail seria enviado em uma Exit. Recebi instruções de que não devemos usar commit work dentro de Exit, uma vez que: o commit work atualiza o banco de dados, as exits são pontos em programas Standard onde podemos incluir códigos Z, ao executar o comando em uma exit, o restante do código do programa Standard pode não ter sido concluído, o comando não faz distinção do que será atualizado. Veja um conceito:

“A declaração COMMIT WORK é executada no banco de dados e, assim, completa uma unidade lógica de trabalho (LUW – Database Logical Unit of Work). Isto significa que todas as atualizações do banco de dados são feitas em caráter irrevogável e não pode ser revertida com ROLLBACK WORK e todos os bloqueios de banco de dados são liberados.

Sendo assim a função SO_OBJECT_SEND que já havia utilizado em outra demanda, não seria a melhor opção pois nela adicionamos o COMMIT WORK após a sua execução.

Pesquisei se havia uma outra função que pudesse ser utilizada dentro exit que fazia o COMMIT WORK de alguma forma.

Encontrei a função SO_NEW_DOCUMENT_SEND_API1 que usada com o IN UPDATE TASK é executada em paralelo ao programa principal, esta função tem o COMMIT WORK com o parâmetro commit_work = ‘X’, assim ele é executado dentro da função e não após a sua execução como na função SO_OBJECT_SEND.

Veja um exemplo de sua utilização:

* Dados para o envio do email. 
DATA: ti_text TYPE TABLE OF soli WITH HEADER LINE, 
 ti_receivers TYPE TABLE OF somlreci1 WITH HEADER LINE, 
 object_hd LIKE sodocchgi1, "#EC NEEDED 
 objhead TYPE TABLE OF soli WITH HEADER LINE, 
 objpara TYPE TABLE OF selc WITH HEADER LINE, 
 objparb TYPE TABLE OF soop1 WITH HEADER LINE. 

ti_text-line = 'Corpo do e-mail.'.
APPEND ti_text. 
* Endereço do destinatário. 
vl_email = 'teste@teste.com.br' 
* Assunto do e-mail. 
vl_assunto = 'ASSUNTO'.

* Definindo os dados de controle do envio de mensagem
object_hd-obj_name = 'MENSAGEM'. " Fixo: Tipo de objeto
object_hd-obj_descr = vl_assunto. 
object_hd-obj_langu = sy-langu. 
object_hd-sensitivty = 'F'." Fixo: Sensibilidade (P-Confidencial F-Funcional O-Standard G-Comercial E-Pessoal)

* Compõe endereço destino de e-mail e SAPOffice para Responsável 
CLEAR ti_receivers. 
ti_receivers-receiver = vl_email. 
ti_receivers-rec_type = 'U'. 
ti_receivers-rxpress = 'X'. " Envia como expresso 

APPEND ti_receivers.

CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1' IN UPDATE TASK 
 EXPORTING 
 document_data = object_hd 
 document_type = 'RAW' 
 commit_work = 'X' 
 TABLES 
 object_content = ti_text 
 object_para = objpara 
 object_parb = objparb 
 receivers = ti_receivers 
 EXCEPTIONS 
 too_many_receivers = 1 
 document_not_sent = 2 
 document_type_not_exist = 3 
 operation_no_authorization = 4 
 parameter_error = 5 
 x_error = 6 
 enqueue_error = 7 
 OTHERS = 8. 
 IF sy-subrc <> 0. 
* Implement suitable error handling here 
 ENDIF.

 

Aline Cristina

Formada em Sistemas de Informação pelo Centro Universitário do Leste De Minas Gerais – Unileste-MG. Comecei com PHP, passei pelo C# e atualmente atuo como consultora ABAP, na equipe de desenvolvimento de sistemas de uma grande indústria no leste de MG.

Você pode gostar...

7 Resultados

  1. Haroldo disse:

    Ótimo post Aline.

    A pergunta pode ser “tola”, mas…
    Se criar uma função e colocar essa sua rotina, usando a SO_OBJECT_SEND com o COMMIT WORK, e na exit chamar a função, o COMMIT WORK terá o mesmo comportamento ?

    Abraços…

    • Aline Cristina disse:

      Olá Haroldo,

      Obrigada!

      Nesse caso vai acredito que vai depender se o seu módulo de função é chamado com o IN UPDATE TASK, o ponto chave é esse, executar o commit_work para o envio do email, sem afetar o código da Exit.

  2. Ola Aline,

    Parabens pelo primeiro post.

    Tudo muito bom, tudo muito bem, mas por que nao utilizar as classes cl_bcs* ao inves dos FM?

    Abraco,

    • Aline Cristina disse:

      Obrigada Costodio!

      Pra ser sincera.. porque não conheço ainda! rsrs
      Essa foi uma solução que encontrei na SCN…
      Mas obrigada pela dica… mais um item para estudar!

      Abraço.

  3. Alexandre Alves disse:

    Bom, muito bom!

  4. Rodrigo Batista disse:

    Fantástico
    muito bom esse post, me ajudou muito
    Parabéns ABAP101

  1. junho 9, 2014

    […] Pagoti: Olá pessoal, depois de escrever o excelente post Módulo de função para enviar e-mail que ficou na home do ABAP101.com por bastante tempo, a Aline (nossa mais nova autora) escreveu mais […]