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.
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.
Ó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…
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.
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,
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.
Bom, muito bom!
Fantástico
muito bom esse post, me ajudou muito
Parabéns ABAP101