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.

terça-feira, 23 de fevereiro de 2016

Convertendo Spool em PDF - RSTXPDFT4


*  Fala Galera, ultimamente precisei criar um arquivo PDF baseada no
* no Spool gerada pelo Smartforms e mandar por email, procurando algo
* que me ajudasse na internet, encontrei um programa que transforma 
* o Número do Spool em um arquivo .PDF dentro do diretório que escolher.
*  Esse programa não resolvia meu problema mas me ajudou muito pois 
* usei as funções que foram usadas nesse programa.
*  Primeiramente irei mostrar um passo a passo de como processar esse 
* programa e mais tarde num próximo post mostrar como fazer um arquivo 
* .pdf pelo Spool e enviar para um email.

*  O programa que estou falando é o 'RSTXPDFT4', vá na transação SE38
* coloque RSTXPDFT4 e execute.


* O primeiro parametro é o numero do Spool, para pegar essa informação
* vá na transação SP02 e copia o Spool desejado para conversão.



segunda-feira, 8 de fevereiro de 2016

Função - RKD_WORD_WRAP

REPORT rkd_word_wrap.

*  Eae Galera, atualmente estou trabalhando com SAPScript e tenho que
* tratar os textos e tamanho da linha conforme layout do Formulário,
* ai aprendi a usar a função abaixo que faz a quebra do texto conforme
* tamanho que desejar, essa função é legal porque além de fazer a quebra
* de texto você tambem pode fazer Split de string usando o parametro de
* exportação 'DELIMITER'.

* Estruturas e tabelas Internas
DATA :
  lt_lines  TYPE TABLE OF char30,
  lst_lines LIKE LINE OF lt_lines.

* Tela de seleção
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
* Parametros da tela de seleção
PARAMETERS :
  p_string TYPE char100 DEFAULT
  '1234567 123456 4857948655458745  87778+ 784541251 1 1254 1112121212',
  p_output TYPE i DEFAULT '10'.
SELECTION-SCREEN END OF BLOCK   b1.

BREAK-POINT.
*  Essa função é muito prática para tratar textos que você queira quebrar
* antes de gravar num Objeto de texto, ou num campos que você queira ver
* somente partes pré definidas de uma string.
CALL FUNCTION 'RKD_WORD_WRAP'
  EXPORTING
    textline            = p_string
*   DELIMITER           = ' '
    outputlen           = p_output
* IMPORTING
*   OUT_LINE1           =
*   OUT_LINE2           =
*   OUT_LINE3           =
  TABLES
    out_lines           = lt_lines
  EXCEPTIONS
    outputlen_too_large = 1
    OTHERS              = 2.

BREAK-POINT.

* Exibição dos dados da tabela de retorno conforme regra determinada
LOOP AT lt_lines INTO lst_lines.
  WRITE : / lst_lines.
ENDLOOP.

* Valeo... Segue as imagens do processo.





quarta-feira, 27 de janeiro de 2016

Trabalhando com Caixa de Texto - CL_GUI_TEXTEDIT

REPORT z_caixa_de_texto.

*  Opa pessoal, quando vamos montar telas para os nossos queridos User
* colocamos sempre os campos da tabela que estamos trabalhando e na maioria
* das vezes só os campos mais importantes, só que as vezes esses mesmos
* users querem uma caixa de texto lateral ou abaixo das informações para
* principais para que seja possível incluir observações sobre o processo,
* documento ou qualquer outra coisa que esteja fazendo... Até aí sem problema.
*  O problema começa quando o objeto de caixa de texto não é existe na caixa
* de ferramentas da edição da screen, nesse momento vamos descobrir a usar
* a classe CL_GUI_TEXTEDIT.
*  No final contem os prints de tela.
*  Caso não lembre como ver os dados gravados em um Objeto de texto.
*  Como em todos os posts estarei fazendo os comentários no meio do código,
* bons estudos =).
DATA :
  o_docking 
TYPE REF TO cl_gui_docking_container,
  o_editor  
TYPE REF TO cl_gui_textedit.

* Tela Principal
CALL SCREEN 9000.

*&---------------------------------------------------------------------*
*&      Module  INIT  OUTPUT
*&---------------------------------------------------------------------*
MODULE init OUTPUT.

  
CREATE OBJECT o_docking
    
EXPORTING
      repid 
= sy-repid    " Report to Which This Docking Control is Linked
      dynnr 
= '9000'.        " Screen to Which This Docking Control is Linked

  
IF o_editor IS NOT BOUND.
* Limite do docking que conterá o textedit
    o_docking
->set_extension( 400 ).
*  Criação do objeto da caixa de texto com limitações de quantidade total e
* quantidade total por linha.
    
CREATE OBJECT o_editor
      
EXPORTING
        max_number_chars           
= 100
        parent                     
= o_docking
        wordwrap_mode         
= cl_gui_textedit=>wordwrap_at_fixed_position
        wordwrap_position          
= 25
        wordwrap_to_linebreak_mode 
= cl_gui_textedit=>true.


*  Abaixo eu criei um perform para dar get e set na caixa de texto pois
* o mesmo usaria as mesmas variaveis no read_text e save_text, sendo o
* o primeiro parametro ( que nesse caso é o 'SET' como chave para o processo
* READ_TEXT -> SET_TEXT_AS_R3TABLE
    
PERFORM f_get_set_text_to_editor USING 'SET' o_editor.

  
ENDIF.

ENDMODULE.                 " INIT  OUTPUT

terça-feira, 19 de janeiro de 2016

Mudando o Layout por campo do ALV - LVC_T_STYL

REPORT z_cell_style.
*  Opa Pessoal, estou devolta pra mostrar como mudar o estilo por celula,
* o modo normal hoje para deixar zebrado ou as medidas da coluna conforme
* os valores nela contido usamos a estrutura LVC_S_LAYO mas esse layout
* é para todo o relatório, mas para trabalhar por celula conforme valor,
* ou deixar aberto um campo especifico dentro do alv usando regra de negocio,
*  isso queiremos fazer hoje, como sempre o código está simples para que
* consigam focar nas diferenças de um ALV normal.

*  Aqui, logo de começo já tem uma das diferenças que é a inclusão do campos
* 'CELLTAB' dentro da tabela ´de saída que será exibida, clicando duas vezes
* no tipo do campo 'LVC_T_LAYO' vamos perceber que ele na verdade é uma tabela,
* nesse campo que é uma tabela ira conter todos os layouts referente ao registro.
* Tipos
TYPES :
  
BEGIN OF ty_sflight.
        
INCLUDE STRUCTURE sflight.
TYPES :
  celltab 
TYPE lvc_t_styl,
  
END OF ty_sflight.

* Objetos
DATA :
  o_alv     
TYPE REF TO cl_gui_alv_grid,
  o_docking 
TYPE REF TO cl_gui_docking_container.

* Tabelas Internas
DATA :
  it_fieldcat 
TYPE TABLE OF lvc_s_fcat,
  it_sflight  
TYPE TABLE OF ty_sflight.

* Parametros
PARAMETERS :
  p_seats 
TYPE sflight-seatsocc,
  p_seatm 
TYPE sflight-seatsmax_b.

* Tela Principal com o ALV
CALL SCREEN 9000.

*&---------------------------------------------------------------------*
*&      Module  INITIALIZATION  OUTPUT
*&---------------------------------------------------------------------*
MODULE initialization OUTPUT.


  
BREAK-POINT.
*  Aqui estamos criando a estrutura que ira conter as informações referente
* ao layout do ALV, a unica coisa que vamos fazer nessa estrutura e informar
* no campo 'STYLEFNAME' o nome do campo/tabela que ira conter as informações
* de layout especifico para cada campo do registro atual.
  
DATA: lst_layout TYPE lvc_s_layo.
  lst_layout
-no_toolbar = abap_true.
  
lst_layout-stylefname = 'CELLTAB'.

  
PERFORM  :
* criação do catalogo de campos
  f_fieldcat
,
* Seleção dos dados do Vôo
  f_selection_sflight
,
* Criação dos layouts para cada celula conforme regra
  f_style_celltab
.

  
IF o_docking IS INITIAL.

    
CREATE OBJECT o_docking
      
EXPORTING
        repid     
= sy-repid    
        dynnr     
= '9000'        
        extension 
= 9999.       " Control Extension

    
CREATE OBJECT o_alv
      
EXPORTING
        i_parent 
= o_docking.

    o_alv
->set_table_for_first_display(
      
EXPORTING
        is_layout                     
= lst_layout
      
CHANGING
        it_outtab                     
= it_sflight
        it_fieldcatalog               
= it_fieldcat
    
).

    o_alv
->set_ready_for_input( EXPORTING i_ready_for_input = 1 ).

  
ENDIF.

ENDMODULE.                 " INITIALIZATION  OUTPUT