segunda-feira, 14 de março de 2016

Mandando Spool para Emails


FUNCTION zf_send_email.
*"----------------------------------------------------------------------
*"*"Interface local:
*"  IMPORTING
*"     VALUE(IM_SPOOL) TYPE  RSPOID OPTIONAL
*"     VALUE(IM_EMAIL) TYPE  AD_SMTPADR OPTIONAL
*"----------------------------------------------------------------------

*  Bom dia Abapers, conforme prometido hoje vou mostrar uma função prática
* que envia o Spool em anexo para o email informado, os parametros de
* importação estão informadas acima, qualquer dúvida comentem e vamos
* aprendendo juntos, coloquei alguns Breaks no código para visualizarem
* o processo.

* A transação para saber o Spool é a SP01 / SP02.

  
DATA :
    lt_lines        
TYPE TABLE OF tline,
    lst_lines       
LIKE LINE OF lt_lines,
    l_rspoid        
TYPE rspoid,
    lst_tsp01       
TYPE tsp01,
    l_objtype       
TYPE rststype-type,
    l_pdf_bytecount 
TYPE i,
    l_pdf_spoolid   
TYPE tsp01-rqident,
    l_btc_jobname   
TYPE tbtcjob-jobname,
    l_btc_jobcount  
TYPE tbtcjob-jobcount,
    l_xstring       
TYPE xstring,
    lt_soli_tab     
TYPE TABLE OF soli,      " soli_tab
    lt_solix_tab    
TYPE TABLE OF solix,      " solix_tab,
    l_size          
TYPE sood-objlen,
    lt_text         
TYPE TABLE OF solisti1,
    lst_text        
LIKE LINE OF lt_text,
    li_emails       
TYPE TABLE OF ad_smtpadr,
    lst_email       
TYPE ad_smtpadr,
    l_subject       
TYPE so_obj_des
    
.

  
DATA :
    lo_document  
TYPE REF TO cl_document_bcs,
    lo_bcs       
TYPE REF TO cl_bcs,
    lo_recipient 
TYPE REF TO if_recipient_bcs,
    lo_ex_bcs    
TYPE REF TO cx_bcs.

  
BREAK-POINT.

* Seleção para get dos detalhes do Spool Informado.
  
SELECT SINGLE * FROM tsp01 INTO lst_tsp01 WHERE rqident = im_spool.

  
IF sy-subrc IS INITIAL.
* Função para get dos atributos do Spool,
    
CALL FUNCTION 'RSTS_GET_ATTRIBUTES'
      
EXPORTING
*       AUTHORITY     = ' '
        
client        = lst_tsp01-rqclient
        name          
= lst_tsp01-rqo1name
      
IMPORTING
        objtype       
= l_objtype
      
EXCEPTIONS
        fb_error      
= 1
        fb_rsts_other 
= 2
        no_object     
= 3
        no_permission 
= 4
        
OTHERS        = 5.

    
IF sy-subrc IS INITIAL.
* Inicio - Conversão SPOOL -> PDF
      
IF l_objtype(3) = 'OTF'.
        
CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
          
EXPORTING
            src_spoolid              
= lst_tsp01-rqident
            no_dialog                
= space
          
IMPORTING
            pdf_bytecount            
= l_pdf_bytecount
            pdf_spoolid              
= l_pdf_spoolid
            btc_jobname              
= l_btc_jobname
            btc_jobcount             
= l_btc_jobcount
          
TABLES
            pdf                      
= lt_lines[]
          
EXCEPTIONS
            err_no_otf_spooljob      
= 1
            err_no_spooljob          
= 2
            err_no_permission        
= 3
            err_conv_not_possible    
= 4
            err_bad_dstdevice        
= 5
            user_cancelled           
= 6
            err_spoolerror           
= 7
            err_temseerror           
= 8
            err_btcjob_open_failed   
= 9
            err_btcjob_submit_failed 
= 10
            err_btcjob_close_failed  
= 11
            
OTHERS                   = 12.

      
ELSE.
        
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
          
EXPORTING
            src_spoolid              
= lst_tsp01-rqident
            no_dialog                
= space
          
IMPORTING
            pdf_bytecount            
= l_pdf_bytecount
            pdf_spoolid              
= l_pdf_spoolid
            btc_jobname              
= l_btc_jobname
            btc_jobcount             
= l_btc_jobcount
          
TABLES
            pdf                      
= lt_lines[]
          
EXCEPTIONS
            err_no_abap_spooljob     
= 1
            err_no_spooljob          
= 2
            err_no_permission        
= 3
            err_conv_not_possible    
= 4
            err_bad_destdevice       
= 5
            user_cancelled           
= 6
            err_spoolerror           
= 7
            err_temseerror           
= 8
            err_btcjob_open_failed   
= 9
            err_btcjob_submit_failed 
= 10
            err_btcjob_close_failed  
= 11
            
OTHERS                   = 12.

      
ENDIF.


      
CALL FUNCTION 'SX_TABLE_LINE_WIDTH_CHANGE'
        
TABLES
          content_in                  
= lt_lines[]
          content_out                 
= lt_soli_tab[]
        
EXCEPTIONS
          err_line_width_src_too_long 
= 1
          err_line_width_dst_too_long 
= 2
          err_conv_failed             
= 3
          
OTHERS                      = 4.

      
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        
EXPORTING
          input_length 
= l_pdf_bytecount
        
IMPORTING
          
buffer       = l_xstring
        
TABLES
          binary_tab   
= lt_soli_tab[]
        
EXCEPTIONS
          failed       
= 1
          
OTHERS       = 2.

      
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
        
EXPORTING
          
buffer     = l_xstring
        
TABLES
          binary_tab 
= lt_solix_tab.

      
DESCRIBE TABLE lt_solix_tab LINES l_size.
      l_size 
= l_size * 255.
* Fim - Conversão Spool PDF.


      
BREAK-POINT.

* Coloque dentro do TRY para não dar DUMP durante o processo.
      
TRY.
          
IF im_email IS NOT INITIAL.
            
SPLIT im_email AT ';' INTO TABLE li_emails.

* Titulo do email
            l_subject 
= 'ABAP Juniores'.

* Conteudo do email
            lst_text
-line        = 'Prezado,'.
            
APPEND lst_text TO lt_text.
            
CLEAR lst_text.
            
APPEND lst_text TO lt_text.
            lst_text
-line        = 'Segue anexo o Spool conforme o Blog '.
            
APPEND lst_text TO lt_text.
            lst_text
-line        = 'falou que iria funcionar'.
            
APPEND lst_text TO lt_text.
            lst_text
-line        = 'Espero que tenha funcionado, senão'.
            
APPEND lst_text TO lt_text.
            lst_text
-line        = 'confirme na transação ''SOST'' '.
            
APPEND lst_text TO lt_text.
            
lst_text-line        = 'e check sua autorização com o BASIS!'.
            
APPEND lst_text TO lt_text.
            
CLEAR lst_text.
            
APPEND lst_text TO lt_text.

*  Criação do tipo de documento que será referenciado para envio
* pela classe de comunicação ( CL_BCS ).
            lo_document 
= cl_document_bcs=>create_document(
              i_type 
= 'HTM' i_subject = l_subject i_text = lt_text ).
            lo_bcs      
= cl_bcs=>create_persistent( ).
            lo_bcs
->set_document( lo_document ).

*  Set dos emails informados no parametro de entrada da função a ser
* enviados.
            
LOOP AT li_emails INTO lst_email.
              
CONDENSE lst_email.
              lo_recipient 
= cl_cam_address_bcs=>create_internet_address(
                lst_email 
).
              
lo_bcs->add_recipient(
                i_recipient 
= lo_recipient i_express = 'X' i_copy = space ).
            
ENDLOOP.
* Informa quem está está enviando o email.
            
lo_bcs->set_sender( cl_sapuser_bcs=>create( sy-uname ) ).
            lo_bcs
->set_send_immediately( 'X' ).

* Adiciona o anexo do Email
            
IF lt_solix_tab IS NOT INITIAL.
              lo_document
->add_attachment(
                i_attachment_type    
= 'PDF'
                i_attachment_subject 
= 'SPOOL'
                i_attachment_size    
= l_size
                i_att_content_hex    
= lt_solix_tab
                
).
            
ENDIF.

* Envia....
            lo_bcs
->send( ).
            
COMMIT WORK.

* &1 foi enviado com êxito
            
MESSAGE s169(qm) WITH 'Email'.
          
ENDIF.

        
CATCH cx_send_req_bcs.
        
CATCH cx_bcs INTO lo_ex_bcs.
      
ENDTRY.
    
ENDIF.
  
ENDIF.


*  Depois de finalizado entre na transação SOST e veja o Status do seu 
* envio de email.
*  Valeoooo.

ENDFUNCTION.



Comentários
0 Comentários

Nenhum comentário:

Postar um comentário