Mostrando postagens com marcador Classes. Mostrar todas as postagens
Mostrando postagens com marcador Classes. Mostrar todas as postagens

segunda-feira, 25 de outubro de 2021

Roubando alv's Standard para o nosso programa

*  Fala pessoal, hoje vou mostrar uma dica que pode facilitar muito seu
* desenvolvimento ou no minimo diminir o tempo para entregar....
*  Sabe quando o funcional te chama falando que está afim de fazer um relatorio
* muito parecido com o um relatorio standard mas cheio de 'Fru Fru',
* neste momento você já começa a pensar que terá que 'debugar' o standard
* pra saber como chegar nos dados principais do relatorio antes mesmo de
* incluir as 'Melhorias', pois seus problemas acabaram.... rs ( Sempre quis
* falar isso). Com esse post podemos processar o relatorio standard e pegar
* os dados que seriam exibidos na tela, e depois disso, com todos os dados
* base, podemos fazer os adicionais sem problema nenhum. Bora pro codigo.

*  Abaixo temos um exemplo, aonde o funcional me pediu para trazer os dados
* referente a documentos financeiros usando apenas o 'Conta Razão', 'Empresa'
* e 'Data de lançamento'... Conversamos sobre os acessos na tabela e
* mostrei que não tinhamos esse Indice na tabela e que talvez sofreriamos
* com a performance do programa, teriamos que ter mais parametros para
* conseguir acessar as tabelas com as chaves e assim entregar conforme
* esperado, o funcional insastifeito depois de ter feito uma documentação
* da demanda tudo baseada nessa seleção sem chaves faz o seguinte comentario,
* - Ahhhhh, mas no standard funciona rápido quando eu coloco somente essas
* informações !!!
* Eu em choque, sem entender, pergunto. - Rápido ?!! Standard ?!!
* Depois disso o funcional complementa. - Sim, quando rodo a FBL3N
* ( Relatorio de partidas individuais - Contas do razão ) me mostra um
* relatorio no final que aparece relativamente rapido.
*  Com essas informações lembrei que conversando com um amigo do trabalho,
* o mesmo me falou sobre uma classe que deixa o retorno do processo em
* memoria e assim podemos buscar essa informação e depois tratar como
* quiser.
* Segue codigo comentado abaixo como exemplo.

REPORT  zrtts.
*--------------------------------------------------------------------*

TABLES :
  bkpfbseg.

TYPES :
  BEGIN OF ty_bkpf,
    bukrs TYPE bkpf-bukrs,
    belnr TYPE bkpf-belnr,
    gjahr TYPE bkpf-gjahr,
    budat TYPE bkpf-budat,
  END OF ty_bkpf.

DATA :
  t_bkpf TYPE TABLE OF ty_bkpf,
  s_bkpf TYPE ty_bkpf.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
SELECT-OPTIONS :
  r_saknr FOR bseg-saknr,
  r_bukrs FOR bseg-bukrs,
  r_budat FOR bkpf-budat.

SELECTION-SCREEN END OF BLOCK   b1.

* Definir para não mostrar ALV, Metadata
cl_salv_bs_runtime_info=>set(
  EXPORTING display  abap_false
            metadata abap_false
            data     abap_true ).

* Chamado do programa do FBL3N e passando os parametros de tela.
SUBMIT rfitemgl
  WITH sd_saknr IN r_saknr
  WITH sd_bukrs IN r_bukrs
  WITH so_budat IN r_budat

  WITH x_opsel  EQ abap_false
  WITH x_clsel  EQ abap_false
  WITH x_aisel  EQ abap_true

  WITH x_norm   EQ abap_true
*  WITH pa_vari  EQ '/OES_EXT'
  AND RETURN.


TRY.
    DATA ol_pay_data TYPE REF TO data.
    FIELD-SYMBOLS<fs_pay_data> TYPE ANY TABLE,
                   <pay_data> TYPE ANY.

* Busca tabela do ALV em processamento do Submit
    cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING r_data ol_pay_data ).

* Atribui para tabela dinâmica
    ASSIGN ol_pay_data->TO <fs_pay_data>.

  CATCH cx_salv_bs_sc_runtime_info.
*        #ec no_handler
ENDTRY.

* Limpa runtime
cl_salv_bs_runtime_info=>clear_all).

*--------------------------------------------------------------------*
* No ambiente atual que estou não consigo usar comando 'Inline' mas
* segue abaixo eu pegando o retorno e colocando na minha tabela interna.

FIELD-SYMBOLS :
  <bukrs> TYPE bkpf-bukrs,
  <belnr> TYPE bkpf-belnr,
  <gjahr> TYPE bkpf-gjahr,
  <budat> TYPE bkpf-budat.


LOOP AT <fs_pay_data> ASSIGNING <pay_data>.
  ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <pay_data> TO <bukrs>.
  ASSIGN COMPONENT 'BELNR' OF STRUCTURE <pay_data> TO <belnr>.
  ASSIGN COMPONENT 'GJAHR' OF STRUCTURE <pay_data> TO <gjahr>.
  ASSIGN COMPONENT 'BUDAT' OF STRUCTURE <pay_data> TO <budat>.

  s_bkpf-bukrs <bukrs>.
  s_bkpf-belnr <belnr>.
  s_bkpf-gjahr <gjahr>.
  s_bkpf-budat <budat>.

  APPEND s_bkpf TO t_bkpf.
  CLEAR s_bkpf.
ENDLOOP.

*--------------------------------------------------------------------*
* Gostaria que vocês percebecem que mesmo colocando layout no relatorio
* standard quando darmos o 'Get' dos dados, ele vira toda a tabela de
* saida que seria usada no ALV da transação Standard.
*  Espero ter ajudado e qualquer coisa tamo aeeeee. Vlw.

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.