segunda-feira, 1 de julho de 2019

Enviar anexo email - Texto OU PDF (smartforms)

*&---------------------------------------------------------------------*
*&      Form  ENVIA_EMAIL
*&---------------------------------------------------------------------*
FORM envia_email .

  DATA: cl_send_request       TYPE REF TO cl_bcs,
        cl_document           TYPE REF TO cl_document_bcs,
        cl_sender             TYPE REF TO cl_sapuser_bcs,
        cl_recipient          TYPE REF TO if_recipient_bcs,
        cl_bcs_exception      TYPE REF TO cx_bcs.

  DATA: li_text               TYPE bcsy_text,
        li_bin_cont           TYPE solix_tab.

  DATA: lv_sent_to_all        TYPE os_boolean,
        lv_filename  TYPE string,
        lv_texto     TYPE string,
        lv_texto_aux TYPE string,
        lv_length    TYPE sood-objlen,
        lv_size      TYPE so_obj_len,
        lv_title     TYPE sood-objdes.

  CHECK p_email = 'X'.

  TRY.
*     -------- create persistent send request ------------------------
      cl_send_request = cl_bcs=>create_persistent( ).

      lv_title = text-005.
*     -------- create and set document -------------------------------
      APPEND text-006 TO li_text.
      lv_length = STRLEN( text-006 ).
      cl_document = cl_document_bcs=>create_document(
                      i_type    = 'RAW'
                      i_text    = li_text
                      i_length  = lv_length
                      i_subject = lv_title ).

      LOOP AT it_files INTO wa_files.

        REFRESH li_text.

        CLEAR: lv_length, li_bin_cont, lv_texto.

        OPEN DATASET wa_files-fullname FOR INPUT
                     IN TEXT MODE ENCODING NON-UNICODE.

        DO.

          READ DATASET wa_files-fullname INTO lv_texto_aux.
          IF sy-subrc = 0.
            IF lv_texto IS INITIAL.
              CONCATENATE lv_texto_aux cl_bcs_convert=>gc_crlf INTO lv_texto.
            ELSE.
              CONCATENATE lv_texto lv_texto_aux cl_bcs_convert=>gc_crlf
                          INTO lv_texto.
            ENDIF.
          ELSE.
            EXIT.
          ENDIF.

        ENDDO.

        CLOSE DATASET wa_files-fullname.

        TRY.
            cl_bcs_convert=>string_to_solix(
              EXPORTING
                iv_string   = lv_texto
                iv_codepage = '4103'  "suitable for MS Excel, leave empty
                iv_add_bom  = 'X'     "for other doc types
              IMPORTING
                et_solix  = li_bin_cont
                ev_size   = lv_length ).

          CATCH cx_bcs.
            MESSAGE e445(so).
        ENDTRY.



        lv_title = wa_files-filename.

        CALL METHOD cl_document->add_attachment
          EXPORTING
            i_attachment_type    = 'CSV'
            i_attachment_subject = lv_title
            i_attachment_size    = lv_length
            i_att_content_hex    = li_bin_cont.

      ENDLOOP.

      CALL METHOD cl_send_request->set_document( cl_document ).
*     --------- set sender -------------------------------------------
*     note: this is necessary only if you want to set the sender
*           different from actual user (SY-UNAME). Otherwise sender is
*           set automatically with actual user.

      cl_sender = cl_sapuser_bcs=>create( sy-uname ).
      CALL METHOD cl_send_request->set_sender
        EXPORTING
          i_sender = cl_sender.

*     --------- add recipient (e-mail address) -----------------------
*     create recipient - please replace e-mail address !!!

      DATA: lv_email TYPE ad_smtpadr.

      LOOP AT s_email.

        lv_email =  s_email-low.

        cl_recipient = cl_cam_address_bcs=>create_internet_address(
                                          lv_email ).

*     add recipient with its respective attributes to send request
        CALL METHOD cl_send_request->add_recipient
          EXPORTING
            i_recipient = cl_recipient
            i_express   = 'X'.

      ENDLOOP.

      cl_send_request->send_request->set_link_to_outbox( 'X' ).

*     ---------- send document ---------------------------------------
      CALL METHOD cl_send_request->send(
        EXPORTING
          i_with_error_screen = 'X'
        RECEIVING
          result              = lv_sent_to_all ).
      IF lv_sent_to_all = 'X'.
        WRITE text-009.

        "Elimino arquivo do diretório se foi enviado corretamente
        DELETE DATASET wa_files-fullname.

      ENDIF.

      COMMIT WORK.

* -----------------------------------------------------------
* *                     exception handling
* -----------------------------------------------------------
* * replace this very rudimentary exception handling
* * with your own one !!!
* -----------------------------------------------------------
    CATCH cx_bcs INTO cl_bcs_exception.
      WRITE: text-007.
      WRITE: text-008, cl_bcs_exception->error_type.
      EXIT.

  ENDTRY.

ENDFORM.                    " ENVIA_EMAIL


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      ENVIADO PDF POR SMARTFORMS
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


DATAlw_output_info    TYPE ssfcrescl.

DATAlw_output_options     TYPE  ssfcompop,
      lw_control_parameters TYPE  ssfctrlop.

lw_control_parameters VALUE #(
"DEVICE = 'LOCL'
no_dialog abap_true
preview abap_false
GETOTF ABAP_TRUE
"LANGU
).

lw_output_options VALUE #tddest 'LOCL' ).

BREAK-POINT.

CALL FUNCTION '/1BCDWB/SF00000019'
  EXPORTING
*   ARCHIVE_INDEX      =
*   ARCHIVE_INDEX_TAB  =
*   ARCHIVE_PARAMETERS =
    control_parameters lw_control_parameters
*   MAIL_APPL_OBJ      =
*   MAIL_RECIPIENT     =
*   MAIL_SENDER        =
    output_options     lw_output_options
    user_settings      ''
    it_romaneio        lt_romaneio_print
    iw_info_transp     ztbsd_roma03
    I_TIPO_IMP '1'
  IMPORTING
*   DOCUMENT_OUTPUT_INFO       =
    job_output_info    lw_output_info
*   JOB_OUTPUT_OPTIONS =
  EXCEPTIONS
    formatting_error   1
    internal_error     2
    send_error         3
    user_canceled      4
    OTHERS             5.

IF sy-subrc <> 0.
  EXIT.
* Implement suitable error handling here
ENDIF.

BREAK-POINT.

CHECK lw_output_info-otfdata IS NOT INITIAL.

DATAlt_lines    TYPE TABLE OF tline.

DATAlv_bin_filesize TYPE so_obj_len,
      lv_bin_file     TYPE  xstring.

DATAlt_text     TYPE bcsy_text,
      lt_bin_cont TYPE solix_tab.

DATAlv_sent_to_all TYPE os_boolean,
      lv_filename    TYPE string,
      lv_texto       TYPE string,
      lv_texto_aux   TYPE string,
      lv_length      TYPE sood-objlen,
      lv_size        TYPE so_obj_len,
      lv_title       TYPE sood-objdes.

CALL FUNCTION 'CONVERT_OTF'
  EXPORTING
    format                'PDF'
  IMPORTING
    bin_filesize          lv_bin_filesize
    bin_file              lv_bin_file
  TABLES
    otf                   lw_output_info-otfdata
    lines                 lt_lines
  EXCEPTIONS
    err_max_linewidth     1
    err_format            2
    err_conv_not_possible 3
    err_bad_otf           4
    OTHERS                5.

DATAlt_binary_content TYPE solix_tab.

***Xstring to binary
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer     lv_bin_file
  TABLES
    binary_tab lt_binary_content.

*  CHECK p_email = 'X'.

TRY.
*     -------- create persistent send request ------------------------
    DATA(lo_send_requestcl_bcs=>create_persistent).

    lv_title TEXT-005.
*     -------- create and set document -------------------------------
    APPEND 'teste' TO lt_text.
    lv_length strlen|teste| ).
    DATA(lo_documentcl_document_bcs=>create_document(
                                        i_type    'RAW'
                                        i_text    lt_text
                                        i_length  lv_length
                                        i_subject lv_title ).

    TRY.
        cl_bcs_convert=>string_to_solix(
          EXPORTING
            iv_string   lv_texto
            iv_codepage '4103'  "suitable for MS Excel, leave empty
            iv_add_bom  'X'     "for other doc types
          IMPORTING
            et_solix  lt_bin_cont
            ev_size   lv_length ).

      CATCH cx_bcs.
        MESSAGE e445(so).
    ENDTRY.

    lv_title 'teste'.


    CALL METHOD lo_document->add_attachment
      EXPORTING
        i_attachment_type    'PDF'
        i_attachment_subject lv_title
        i_attachment_size    lv_bin_filesize
        i_att_content_hex    lt_binary_content.

    CALL METHOD lo_send_request->set_documentlo_document ).
*     --------- set sender -------------------------------------------
*     note: this is necessary only if you want to set the sender
*           different from actual user (SY-UNAME). Otherwise sender is
*           set automatically with actual user.

    DATA(lo_sendercl_sapuser_bcs=>createsy-uname ).
    CALL METHOD lo_send_request->set_sender
      EXPORTING
        i_sender lo_sender.

*     --------- add recipient (e-mail address) -----------------------
*     create recipient - please replace e-mail address !!!

    DATAlv_email TYPE ad_smtpadr.

    lv_email 'ednszk@hotmail.com'.

    DATA(lo_recipientcl_cam_address_bcs=>create_internet_address(
                                      lv_email ).

*     add recipient with its respective attributes to send request
    CALL METHOD lo_send_request->add_recipient
      EXPORTING
        i_recipient lo_recipient
        i_express   'X'.

    lo_send_request->send_request->set_link_to_outbox'X' ).

*     ---------- send document ---------------------------------------
    CALL METHOD lo_send_request->send(
      EXPORTING
        i_with_error_screen 'X'
      RECEIVING
        result              lv_sent_to_all ).
    IF lv_sent_to_all 'X'.
      WRITE TEXT-009.

    ENDIF.

    COMMIT WORK.

* -----------------------------------------------------------
* *                     exception handling
* -----------------------------------------------------------
* * replace this very rudimentary exception handling
* * with your own one !!!
* -----------------------------------------------------------
  CATCH cx_bcs INTO DATA(lo_bcs_exception).
*      WRITE: TEXT-007.
*      WRITE: TEXT-008, lo_bcs_exception->error_type.
    EXIT.

ENDTRY.






quarta-feira, 19 de junho de 2019

Só ALV

Somente para informações sobre ALV.

Usando mesmo event_handler para vários ALVs no mesmo programa

Nos eventos tem o parâmetro oculto sender para todos os eventos, utilizá-lo para definir qual objeto ALV está sendo utilizado para um evento compartilhado.

Ex.:

      handle_alv_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
        IMPORTING
            e_row_id
            e_column_id
            es_row_no
            sender,




O SENDER define o objeto ALV sendo executadoo naquele momento.

Para conseguir saber qual está sendo executado existem várias maneiras, eu fazia lendo qual container estava sendo utilizado, mas achei uma maneira mais fácil de um exemplo no SDN.

Primeiro define um nome para o objeto ALV utilizando o metodo SET_NAME.

Ex: go_alv_adi_nf->set_name('ADI_NF').

Quanto é executado dentro do evento, utilizar o método para pegar o nome do ALV definido.

Ex.: 
FORM handle_alv_hotspot_click USING iv_row_id    TYPE lvc_s_row
                                    is_column_id TYPE  lvc_s_col
                                    is_row_no    TYPE lvc_s_roid
                                    io_sender TYPE REF TO cl_gui_alv_grid.

  DATA lv_name TYPE string.

  CALL METHOD io_sender->get_name
    RECEIVING
      name lv_name.

  IF lv_name 'ADI_NF'.

 ELSE.
 ENDIF.


========================================================================



segunda-feira, 3 de junho de 2019

ES_J_1BNF_ADD_DATA - NF WRITER

Opa.. essa ADD_DATA não tava passando quando é uma NF writer. Tem uma nota que explica como funciona, mas pelo blog abaixo fica mais fácil de entender.

Outro detalhe.. nessa caso ele tem um método especifico para J1B1N

ADD_DATA_J1B1N


https://blogs.sap.com/2016/09/08/badi-nova-chamada-automaticamente-na-nf-writer-j1b1nj1b2n/