Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Sending email attachment as pdf file.

Former Member
0 Kudos

Hi,

I changed 'SO_DOCUMENT_SEND_API1' to 'SO_NEW_DOCUMENT_ATT_SEND_API1'. With 'SO_DOCUMENT_SEND_API1' it was sending email with XLS attachment. Now after changing the function it is not sending email. Before I wrote the code for XLS file, now I want to change it to PDF file. Where should I change it. Any suggestions on how to do it. please look at my code.

Thanks

Veni.

FORM EMAIL_DATA.

  • Populate details for .xls file

PERFORM build_xls_data_table.

  • Populate message body

PERFORM populate_email_message_body.

  • Send file by email as .xls speadsheet

PERFORM send_file_as_email_attachment

TABLES i_message

i_attach

USING p_email

'Commercial Invoice'

'XLS'

'COMMERCIAL_INVOICE'

' '

' '

' '

CHANGING g_error

g_reciever.

  • Instructs mail send program for SAPCONNECT to send email(rsconn01)

PERFORM initiate_mail_execute_program.

ENDFORM. " EMAIL_DATA

&----


*& Form build_xls_data_table

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM build_xls_data_table .

  • CONSTANTS:

  • con_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,

  • con_cret TYPE c VALUE cl_abap_char_utilities=>cr_lf.

i_attach-line = 'AMERICA, INC.'.

APPEND i_attach.

i_attach-line = 'Commercial Invoice Details., INC.'.

APPEND i_attach.

i_attach-line = 'Details of Commercial Invoice:'.

APPEND i_attach.

LOOP AT FTAB.

i_attach-line = FTAB-VBELN.

APPEND i_attach.

CONCATENATE 'MATERIAL' 'NET PRICE' INTO i_attach

SEPARATED BY space.

  • CONCATENATE con_cret i_attach INTO i_attach.

APPEND i_attach.

LOOP AT ITAB_VBRP INTO wa_data.

CONCATENATE wa_data-MATNR

wa_data-NETWR INTO i_attach

SEPARATED BY space. "con_tab.

  • CONCATENATE con_cret i_attach INTO i_attach.

APPEND i_attach.

ENDLOOP.

ENDLOOP.

ENDFORM. " build_xls_data_table

&----


*& Form populate_email_message_body

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM populate_email_message_body .

DATA: l_buffer(250).

REFRESH i_message.

l_buffer = 'COMMERCIAL INVOICE DATA DOWNLOAD. '.

SKIP 2.

CONCATENATE l_buffer 'You will find an attachment in this message.'

INTO l_buffer.

i_message = l_buffer.

APPEND i_message.

ENDFORM. " populate_email_message_body

&----


*& Form SEND_FILE_AS_EMAIL_ATTACHMENT

&----


  • Send email

----


FORM send_file_as_email_attachment TABLES p_i_message

p_i_attach

USING p_email1

p_mtitle

p_format

p_filename

p_attdescription

p_sender_address

p_sender_addres_type

CHANGING p_error

p_receiver.

DATA: l_error TYPE sy-subrc,

l_receiver TYPE sy-subrc,

l_email LIKE somlreci1-receiver,

l_mtitle LIKE sodocchgi1-obj_descr,

l_format TYPE so_obj_tp,

l_attfilename TYPE so_obj_des ,

l_attdescription TYPE so_obj_nam ,

l_sender_address LIKE soextreci1-receiver,

l_sender_address_type LIKE soextreci1-adr_typ.

l_email = p_email1.

l_mtitle = p_mtitle.

l_format = p_format.

l_attfilename = p_filename.

l_attdescription = p_attdescription.

l_sender_address = p_sender_address.

l_sender_address_type = p_sender_addres_type.

  • Fill the document data.

w_doc_data-doc_size = 1.

  • Populate the subject/generic message attributes

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = l_mtitle .

w_doc_data-sensitivty = 'F'.

  • Fill the document data and get size of attachment

CLEAR w_doc_data.

READ TABLE i_attach INDEX w_cnt.

w_doc_data-doc_size =

( w_cnt - 1 ) * 255 + STRLEN( i_attach ).

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = l_mtitle.

w_doc_data-sensitivty = 'F'.

CLEAR i_attachment.

REFRESH i_attachment.

i_attachment[] = p_i_attach[].

  • Describe the body of the message

CLEAR i_packing_list.

REFRESH i_packing_list.

i_packing_list-transf_bin = space.

i_packing_list-head_start = 1.

i_packing_list-head_num = 0.

i_packing_list-body_start = 1.

DESCRIBE TABLE i_message LINES i_packing_list-body_num.

i_packing_list-doc_type = 'RAW'.

APPEND i_packing_list.

  • Create attachment notification

i_packing_list-transf_bin = 'X'.

i_packing_list-head_start = 1.

i_packing_list-head_num = 1.

i_packing_list-body_start = 1.

DESCRIBE TABLE i_attachment LINES i_packing_list-body_num.

i_packing_list-doc_type = l_format.

i_packing_list-obj_descr = l_attdescription.

i_packing_list-obj_name = l_attfilename.

i_packing_list-doc_size = i_packing_list-body_num * 255.

APPEND i_packing_list.

  • Add the recipients email address

CLEAR i_receivers.

REFRESH i_receivers.

i_receivers-receiver = l_email.

i_receivers-rec_type = 'U'.

i_receivers-com_type = 'INT'.

i_receivers-notif_del = 'X'.

i_receivers-notif_ndel = 'X'.

APPEND i_receivers.

  • i_receivers-receiver = l_email.

  • i_receivers-rec_type = 'B'.

  • i_receivers-com_type = ''.

  • i_receivers-notif_del = 'X'.

  • i_receivers-notif_ndel = 'X'.

  • APPEND i_receivers.

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

DOCUMENT_DATA = w_doc_data

PUT_IN_OUTBOX = 'X'

  • IMPORTING

SENT_TO_ALL = w_sent_all

  • NEW_OBJECT_ID =

TABLES

PACKING_LIST = i_packing_list

  • OBJECT_HEADER =

CONTENTS_BIN = i_attachment

CONTENTS_TXT = i_message

  • CONTENTS_HEX =

  • OBJECT_PARA =

  • OBJECT_PARB =

RECEIVERS = i_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.

  • MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  • WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

  • CALL FUNCTION 'SO_DOCUMENT_SEND_API1'

  • EXPORTING

  • document_data = w_doc_data

  • put_in_outbox = 'X'

  • sender_address = l_sender_address

  • sender_address_type = l_sender_address_type

  • commit_work = 'X'

  • IMPORTING

  • sent_to_all = w_sent_all

  • TABLES

  • packing_list = i_packing_list

  • contents_bin = i_attachment

  • contents_txt = i_message

  • receivers = i_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.

  • Populate zerror return code

l_error = sy-subrc.

  • Populate zreceiver return code

LOOP AT i_receivers.

l_receiver = i_receivers-retrn_code.

ENDLOOP.

ENDFORM. "send_file_as_email_attachment

&----


*& Form INITIATE_MAIL_EXECUTE_PROGRAM

&----


  • Instructs mail send program for SAPCONNECT to send email.

----


FORM initiate_mail_execute_program.

WAIT UP TO 2 SECONDS.

SUBMIT rsconn01 WITH mode = 'INT'

WITH output = ''

AND RETURN.

ENDFORM. "

9 REPLIES 9

Former Member
0 Kudos

Hi Veni Reddy,

You can refer to my program, and change accordingly in your program where necessary.

*****

REPORT ZTEST_MAIL2 .

DATA: OBJPACK LIKE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE.

DATA: OBJHEAD LIKE SOLISTI1 OCCURS 1 WITH HEADER LINE.

DATA: OBJBIN LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.

DATA: OBJTXT LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.

DATA: RECLIST LIKE SOMLRECI1 OCCURS 5 WITH HEADER LINE.

DATA: DOC_CHNG LIKE SODOCCHGI1.

DATA: TAB_LINES LIKE SY-TABIX.

  • Creation of the document to be sent

DOC_CHNG-OBJ_NAME = 'Padmakar'.

DOC_CHNG-OBJ_DESCR = 'Composite Report'.

OBJTXT = 'Contents of mail'.

APPEND OBJTXT.

OBJTXT = 'BMS'.

APPEND OBJTXT.

OBJTXT = 'BMSHR'.

APPEND OBJTXT.

DESCRIBE TABLE OBJTXT LINES TAB_LINES.

READ TABLE OBJTXT INDEX TAB_LINES.

DOC_CHNG-DOC_SIZE = ( TAB_LINES - 1 ) * 255 + STRLEN( OBJTXT ).

  • Creation of the entry for the compressed document

CLEAR OBJPACK-TRANSF_BIN.

OBJPACK-HEAD_START = 1.

OBJPACK-HEAD_NUM = 0.

OBJPACK-BODY_START = 1.

OBJPACK-BODY_NUM = TAB_LINES.

OBJPACK-DOC_TYPE = 'RAW'.

APPEND OBJPACK.

  • Creation of the document attachment

  • (Assume that the data in OBJBIN is in BMP format)

OBJBIN-LINE = ' Padmakar '. APPEND OBJBIN.

OBJBIN-LINE = ' padmakar '. APPEND OBJBIN.

OBJBIN-LINE = ' PaDmAkAr '. APPEND OBJBIN.

DESCRIBE TABLE OBJBIN LINES TAB_LINES.

OBJHEAD = 'TEST.PDF'. APPEND OBJHEAD.

  • Creation of the entry for the compressed attachment

OBJPACK-TRANSF_BIN = 'X'.

OBJPACK-HEAD_START = 1.

OBJPACK-HEAD_NUM = 1.

OBJPACK-BODY_START = 1.

OBJPACK-BODY_NUM = TAB_LINES.

OBJPACK-DOC_TYPE = 'DOC'.

OBJPACK-OBJ_NAME = 'BMS'.

OBJPACK-OBJ_DESCR = 'BMS Master'.

OBJPACK-DOC_SIZE = TAB_LINES * 255.

APPEND OBJPACK.

  • Completing the recipient list

RECLIST-RECEIVER = 'raj@hotmail.com'.

RECLIST-REC_TYPE = 'U'.

APPEND RECLIST.

  • * Sending the document

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

DOCUMENT_DATA = DOC_CHNG

PUT_IN_OUTBOX = 'X'

TABLES

PACKING_LIST = OBJPACK

OBJECT_HEADER = OBJHEAD

CONTENTS_BIN = OBJBIN

CONTENTS_TXT = OBJTXT

RECEIVERS = RECLIST

EXCEPTIONS

TOO_MANY_RECEIVERS = 1

DOCUMENT_NOT_SENT = 2

OPERATION_NO_AUTHORIZATION = 4

OTHERS = 99.

IF SY-SUBRC = 0.

WRITE 😕 'SENT MAIL'.

ENDIF.

*****

Regards,

raj

Former Member
0 Kudos

Hi

Do a Commit Work after the FM call or pass parameter COMMIT_WORK = 'X' to the FM.

Regards

Kalpana

Message was edited by: Kalpana Tyagi

former_member188685
Active Contributor
0 Kudos
REPORT ZMAILOUTPUT
    MESSAGE-ID ZZ.
 
*----------------------------------------------------------------------*
*  CONSTANTS                                                           *
*----------------------------------------------------------------------*
 
CONSTANTS : C_X(1)      TYPE C VALUE 'X',      " For constant value
            C_OTF(3)    TYPE C VALUE 'OTF',    " For format
            C_U(1)      TYPE C VALUE 'U'.      " Mail Option
 
*----------------------------------------------------------------------*
*  VARIABLES                                                           *
*----------------------------------------------------------------------*
 
DATA : V_RQIDENT  TYPE TSP01-RQIDENT,  " For Spool Number
       V_RQCLIENT TYPE TSP01-RQCLIENT, " For Client
       V_RQO1NAME TYPE TSP01-RQO1NAME, " For Object name
       V_SPOOL    TYPE TSP01-RQIDENT,  " For Spool Number
       V_SPOOL1   TYPE TSP01-RQIDENT.  " For Spool Number
 
*----------------------------------------------------------------------*
*  FLAGS                                                               *
*----------------------------------------------------------------------*
 
DATA : F_SPOOL TYPE C.
 
*----------------------------------------------------------------------*
*   INTERNAL TABLES                                                    *
*----------------------------------------------------------------------*
 
* Internal table for sending mails
DATA: IT_PDF          LIKE TLINE      OCCURS 10 WITH HEADER LINE,
      IT_XI_PDF       LIKE TLINE      OCCURS 0  WITH HEADER LINE,
      IT_HTML         LIKE SOLISTI1   OCCURS 0  WITH HEADER LINE,
      IT_XI_TEMP      LIKE BAPIQCMIME OCCURS 0  WITH HEADER LINE,
      IT_XI_MIME(255) TYPE C          OCCURS 0  WITH HEADER LINE.
 
* For sending mail
DATA: IT_OBJPACK LIKE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE.
 
* Internal table for Single List with Column Length 255
DATA : IT_OBJBIN LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.
 
* Internal table for Single List with Column Length 255
DATA : IT_OBJTXT LIKE SOLISTI1 OCCURS 10 WITH HEADER LINE.
 
* Internal table for Structure of the API Recipient List
DATA : IT_RECLIST LIKE SOMLRECI1 OCCURS 5 WITH HEADER LINE.
 
* Structure of the API Recipient List
DATA: X_DOC_CHNG LIKE SODOCCHGI1.
 
* Internal table for storing the variants
DATA : BEGIN OF IT_VARIANT1 OCCURS 0,
        VARIANT LIKE VARID-VARIANT,
       END   OF IT_VARIANT1.
 
* Internal table to store variants for the programs
DATA: IT_VARIANT2 LIKE IT_VARIANT1 OCCURS 0 WITH HEADER LINE.
 
* Internal table for storing the selected values
DATA IT_RETURN TYPE DDSHRETVAL OCCURS 0 WITH HEADER LINE.
 
* Internal table for storing the mail-ids
DATA : BEGIN OF IT_MAILID OCCURS 0,
        KOKRS LIKE CSKS-KOKRS,
        KOSTL LIKE CSKS-KOSTL,
        DATBI LIKE CSKS-DATBI,
        TELX1 LIKE CSKS-TELX1,
       END   OF IT_MAILID.
 
* Internal table for storing the mail-ids
DATA : IT_MAILID1 LIKE IT_MAILID OCCURS 0 WITH HEADER LINE.
 
*----------------------------------------------------------------------*
*   SELECTION SCREEN                                                   *
*----------------------------------------------------------------------*
DATA : V_CHAR TYPE CHAR50.
 
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: S_EMAIL FOR V_CHAR  NO INTERVALS
                LOWER CASE
                NO-DISPLAY.
SELECT-OPTIONS: S_EMAIL1 FOR V_CHAR  NO INTERVALS
                LOWER CASE
                NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK B1.
 
SELECTION-SCREEN BEGIN OF BLOCK A1 WITH FRAME TITLE TEXT-028.
 
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS : P_C1 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(66) TEXT-026 FOR FIELD P_C1.
SELECTION-SCREEN END OF LINE.
PARAMETERS : P_SET LIKE TSP1D-PAPART MATCHCODE OBJECT ZH_TSP1D.
SELECTION-SCREEN SKIP 1.
 
PARAMETERS : P_VARA1 TYPE RS38M-SELSET.
SELECTION-SCREEN END OF BLOCK A1.
 
SELECTION-SCREEN BEGIN OF BLOCK A2 WITH FRAME TITLE TEXT-029.
 
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS : P_C2 AS CHECKBOX.
SELECTION-SCREEN COMMENT 3(56) TEXT-027 FOR FIELD P_C1.
SELECTION-SCREEN END OF LINE.
PARAMETERS : P_SET1 LIKE TSP1D-PAPART MATCHCODE OBJECT ZH_TSP1D.
SELECTION-SCREEN SKIP 1.
 
PARAMETERS : P_VARA2 TYPE RS38M-SELSET.
SELECTION-SCREEN END OF BLOCK A2.
 
*---------------------------------------------------------------------*
* AT SELECTION SCREEN ON VALUE REQUEST
*---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_VARA1.
 
* For fetching the variants available for the program
  PERFORM FETCH_VARIANTS.
 
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_VARA2.
 
* For fetching the variants available for the program
  PERFORM FETCH_VARIANTS1.
 
*---------------------------------------------------------------------*
* AT SELECTION SCREEN
*---------------------------------------------------------------------*
AT SELECTION-SCREEN.
 
* For Validation
  PERFORM VALIDATION.
 
*----------------------------------------------------------------------*
*  START OF SELECTION                                                  *
*----------------------------------------------------------------------*
START-OF-SELECTION.
 
* To get the output data and mail
  PERFORM FETCH_DATA.
 
*----------------------------------------------------------------------*
*  END OF SELECTION                                                    *
*----------------------------------------------------------------------*
END-OF-SELECTION.
 
  IF F_SPOOL = C_X.
    MESSAGE E000 WITH 'Spool Not Generated'(060).
  ENDIF.
 
*&---------------------------------------------------------------------*
*&      Form  fetch_data
*&---------------------------------------------------------------------*
*       To get the output data and mail
*----------------------------------------------------------------------*
FORM FETCH_DATA .
 
* To send the output to spool
  PERFORM GENERATE_SPOOL.
 
ENDFORM.                    " fetch_data
 
*&---------------------------------------------------------------------*
*&      Form  generate_spool
*&---------------------------------------------------------------------*
*       To send the output to spool
*----------------------------------------------------------------------*
FORM GENERATE_SPOOL .
 
  DATA: L_PARAMS LIKE PRI_PARAMS,
        L_DAYS(1)  TYPE N VALUE 2,
        L_COUNT(3) TYPE N VALUE 1,
        L_VALID    TYPE C,
        L_VALID1   TYPE C,
        L_PARAMS1  LIKE PRI_PARAMS.
 
  DATA: L_DEVICE TYPE USR01-SPLD.
 
*Get the printer name for the user
  SELECT SINGLE SPLD INTO L_DEVICE FROM USR01 WHERE BNAME = SY-UNAME.
  IF L_DEVICE IS INITIAL.
    L_DEVICE = 'LOCL'.
  ENDIF.
 
* For report-1
  IF P_C1 = 'X'.
 
* Setting the print parameters
 
    CALL FUNCTION 'GET_PRINT_PARAMETERS'
      EXPORTING
        DESTINATION    = L_DEVICE
        COPIES         = L_COUNT
        LIST_NAME      = SY-UNAME
        LIST_TEXT      = 'SUBMIT ... TO SAP-SPOOL'(008)
        RELEASE        = C_X
        NEW_LIST_ID    = C_X
        EXPIRATION     = L_DAYS
*        LINE_SIZE      = 255
*        LINE_COUNT     = 65
        LAYOUT         = p_set
        SAP_COVER_PAGE = SPACE
        COVER_PAGE     = SPACE
        RECEIVER       = 'SAP*'(010)
        DEPARTMENT     = 'System'(011)
        NO_DIALOG      = C_X
      IMPORTING
        OUT_PARAMETERS = L_PARAMS
        VALID          = L_VALID.
 
    IF L_VALID <> SPACE.
 
      CLEAR V_SPOOL.
* Fetch the spool number b4 submit
      PERFORM FETCH_RECENT_SPOOL USING V_SPOOL.
 
* Submitting the program to spool
      SUBMIT RKAEP000 TO SAP-SPOOL
        USING SELECTION-SET P_VARA1
        SPOOL PARAMETERS L_PARAMS
        WITHOUT SPOOL DYNPRO
        AND RETURN.
 
      CLEAR V_SPOOL1.
* Fetch the spool number after submit
      PERFORM FETCH_RECENT_SPOOL USING V_SPOOL1.
 
      IF V_SPOOL = V_SPOOL1.
        F_SPOOL = C_X.
        IF P_C2 IS INITIAL.
          STOP.
        ENDIF.
      ELSE.
* Checking the format ( ABAP/OTF)
        PERFORM FORMAT_CHECK TABLES S_EMAIL.
      ENDIF.
 
 
    ELSE.
      MESSAGE E000 WITH 'Problem in print settings'(003).
      STOP.
    ENDIF.
  ENDIF.
 
* For Report-2
  IF P_C2 = 'X'.
 
* Setting the print parameters
 
    CALL FUNCTION 'GET_PRINT_PARAMETERS'
      EXPORTING
        DESTINATION    = L_DEVICE
        COPIES         = L_COUNT
        LIST_NAME      = SY-UNAME
        LIST_TEXT      = 'SUBMIT ... TO SAP-SPOOL'(008)
        RELEASE        = C_X
        NEW_LIST_ID    = C_X
        EXPIRATION     = L_DAYS
*        LINE_SIZE      = 200
*        LINE_COUNT     = 65
        LAYOUT         = p_set1
        SAP_COVER_PAGE = SPACE
        COVER_PAGE     = SPACE
        RECEIVER       = 'SAP*'(010)
        DEPARTMENT     = 'System'(011)
        NO_DIALOG      = C_X
      IMPORTING
        OUT_PARAMETERS = L_PARAMS1
        VALID          = L_VALID1.
 
    IF L_VALID1 <> SPACE.
 
      CLEAR V_SPOOL.
* Fetch the spool number b4 submit
      PERFORM FETCH_RECENT_SPOOL USING V_SPOOL.
 
* Submitting the program to spool
      SUBMIT GP3DIEHXY88SNFJ0391V7KF9EK7050 TO SAP-SPOOL
        USING SELECTION-SET P_VARA2
        SPOOL PARAMETERS L_PARAMS1
        WITHOUT SPOOL DYNPRO
        AND RETURN.
 
      CLEAR V_SPOOL1.
* Fetch the spool number after submit
      PERFORM FETCH_RECENT_SPOOL USING V_SPOOL1.
 
      IF V_SPOOL = V_SPOOL1.
        MESSAGE E000 WITH 'Spool Not Generated'(060).
        STOP.
      ENDIF.
 
* Checking the format ( ABAP/OTF)
      PERFORM FORMAT_CHECK TABLES S_EMAIL1.
 
    ELSE.
      MESSAGE E000 WITH 'Problem in print settings'(003).
      STOP.
    ENDIF.
  ENDIF.
 
ENDFORM.                    " generate_spool
*&---------------------------------------------------------------------*
*&      Form  fetch_recent_spool
*&---------------------------------------------------------------------*
*       Fetch the recent spool number generated
*----------------------------------------------------------------------*
FORM FETCH_RECENT_SPOOL USING P_V_SPOOL TYPE TSP01-RQIDENT .
 
  DATA:  L_USER LIKE TSP01-RQ2NAME.
 
  CLEAR : V_RQIDENT,
          V_RQCLIENT,
          V_RQO1NAME.
 
  L_USER = SY-UNAME.
 
* Get latest Spool No
  SELECT SINGLE RQIDENT
                RQCLIENT
                RQO1NAME
         INTO (V_RQIDENT , V_RQCLIENT , V_RQO1NAME)
    FROM TSP01
   WHERE RQCRETIME =   ( SELECT MAX( RQCRETIME )
                                FROM TSP01
                               WHERE RQ2NAME EQ L_USER
                                 AND RQFINAL EQ '.' ).
 
  IF SY-SUBRC = 0 .
    P_V_SPOOL = V_RQIDENT.
  ENDIF.
 
 
ENDFORM.                    " fetch_recent_spool
 
*&---------------------------------------------------------------------*
*&      Form  format_check
*&---------------------------------------------------------------------*
*       Checking the format ( ABAP/OTF)
*----------------------------------------------------------------------*
FORM FORMAT_CHECK TABLES P_S_EMAIL STRUCTURE S_EMAIL.
 
  DATA : L_OBJTYPE    LIKE RSTSTYPE-TYPE.
 
  CALL FUNCTION 'RSTS_GET_ATTRIBUTES'
    EXPORTING
      AUTHORITY     = 'SP01'(019)
      CLIENT        = V_RQCLIENT
      NAME          = V_RQO1NAME
      PART          = 1
    IMPORTING
      OBJTYPE       = L_OBJTYPE
    EXCEPTIONS
      FB_ERROR      = 1
      FB_RSTS_OTHER = 2
      NO_OBJECT     = 3
      NO_PERMISSION = 4.
 
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
  IF L_OBJTYPE(3) = C_OTF.
* Convert OTF Spool to PDF
    PERFORM CONVERT_OTF2PDF TABLES P_S_EMAIL.
  ELSE.
* Convert ABAP Spool to PDF
    PERFORM CONVERT_ABAP2PDF TABLES P_S_EMAIL.
  ENDIF.
 
ENDFORM.                    " format_check
 
*&---------------------------------------------------------------------*
*&      Form  convert_otf2pdf
*&---------------------------------------------------------------------*
*       Convert OTF Spool to PDF
*----------------------------------------------------------------------*
FORM CONVERT_OTF2PDF TABLES P_P_S_EMAIL STRUCTURE S_EMAIL .
 
  CLEAR   IT_PDF.
  REFRESH IT_PDF.
 
  DATA : L_BYTECOUNT  TYPE I.
 
* Fn. to get the PDF format
  CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
    EXPORTING
      SRC_SPOOLID              = V_RQIDENT
      NO_DIALOG                = 'X'
    IMPORTING
      PDF_BYTECOUNT            = L_BYTECOUNT
    TABLES
      PDF                      = IT_PDF
    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.
 
  IF SY-SUBRC = 0.
* For page format
    PERFORM PAGE_FORMAT TABLES P_P_S_EMAIL.
  ELSE.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
ENDFORM.                    " convert_otf2pdf
 
*&---------------------------------------------------------------------*
*&      Form  convert_abap2pdf
*&---------------------------------------------------------------------*
*        Convert ABAP Spool to PDF
*----------------------------------------------------------------------*
FORM CONVERT_ABAP2PDF TABLES P_P_S_EMAIL STRUCTURE S_EMAIL.
 
  CLEAR   IT_PDF.
  REFRESH IT_PDF.
 
  DATA : L_BYTECOUNT  TYPE I.
 
* Fn. to convert to PDF format
  CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
    EXPORTING
      SRC_SPOOLID              = V_RQIDENT
      NO_DIALOG                = 'X'
    IMPORTING
      PDF_BYTECOUNT            = L_BYTECOUNT
    TABLES
      PDF                      = IT_PDF
    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.
 
  IF SY-SUBRC = 0.
* For page formatting
    PERFORM PAGE_FORMAT TABLES P_P_S_EMAIL.
  ELSE.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
ENDFORM.                    " convert_abap2pdf
 
*&---------------------------------------------------------------------*
*&      Form  send_mail
*&---------------------------------------------------------------------*
*       For sending mail
*----------------------------------------------------------------------*
FORM SEND_MAIL TABLES MAIL STRUCTURE S_EMAIL .
 
* Structures and internal tables for the send data
  DATA: OBJPACK LIKE SOPCKLSTI1 OCCURS 2  WITH HEADER LINE,
        OBJHEAD LIKE SOLISTI1   OCCURS 1  WITH HEADER LINE,
        OBJBIN  LIKE SOLISTI1   OCCURS 0  WITH HEADER LINE,
        OBJTXT  LIKE SOLISTI1   OCCURS 10 WITH HEADER LINE,
        RECLIST LIKE SOMLRECI1  OCCURS 5  WITH HEADER LINE.
 
  DATA: DOC_CHNG LIKE SODOCCHGI1,
        TAB_LINES LIKE SY-TABIX.
 
* Data for the status output after sending
  DATA: SENT_TO_ALL LIKE SONV-FLAG.
 
  CLEAR: IT_RECLIST, IT_RECLIST[],
         IT_OBJTXT , IT_OBJTXT[],
         IT_OBJPACK, IT_OBJPACK[],
         IT_OBJBIN , IT_OBJBIN[],X_DOC_CHNG.
 
  LOOP AT IT_HTML.
    OBJBIN-LINE = IT_HTML-LINE.
    APPEND OBJBIN.
    CLEAR OBJBIN.
  ENDLOOP.
 
 
* Create the document which is to be sent
  DOC_CHNG-OBJ_NAME  = 'List'(012).
  DOC_CHNG-OBJ_DESCR = 'Mail'(013).
 
* Heading
  OBJTXT-LINE = 'Mail with pdf attachment'(014).
  APPEND OBJTXT.
  CLEAR OBJTXT.
 
* Size
  DESCRIBE TABLE OBJTXT LINES TAB_LINES.
  READ TABLE OBJTXT INDEX TAB_LINES.
  DOC_CHNG-DOC_SIZE = ( TAB_LINES - 1 ) * 255 + STRLEN( OBJTXT ).
 
* Fill the fields of the packing_list for the main document:
  CLEAR OBJPACK-TRANSF_BIN.
 
* The document needs no header (head_num = 0)
  OBJPACK-HEAD_START = 1.
  OBJPACK-HEAD_NUM = 0.
 
* Body
  OBJPACK-BODY_START = 1.
  OBJPACK-BODY_NUM = TAB_LINES.
  OBJPACK-DOC_TYPE = 'RAW'(015).
  APPEND OBJPACK.
 
* Create the attachment (the list itself)
  DESCRIBE TABLE OBJBIN LINES TAB_LINES.
 
* Fill the fields of the packing_list for the attachment:
  OBJPACK-TRANSF_BIN = 'X'.
 
* Header
  OBJPACK-HEAD_START = 1.
  OBJPACK-HEAD_NUM = 0.
 
* Body
  OBJPACK-BODY_START = 1.
  OBJPACK-BODY_NUM = TAB_LINES.
  OBJPACK-DOC_TYPE = 'PDF'(016).
  OBJPACK-OBJ_NAME = 'Attachment'(017).
  OBJPACK-OBJ_DESCR = 'Mail with pdf Attachment'(018).
  OBJPACK-DOC_SIZE = TAB_LINES * 255.
  APPEND OBJPACK.
 
*-Fill the mail recipient list
  LOOP AT MAIL.
    RECLIST-RECEIVER = MAIL-LOW.
    RECLIST-REC_TYPE = C_U.
    APPEND RECLIST.
    CLEAR: RECLIST,
           MAIL.
  ENDLOOP.
 
*-Send the document by calling the SAPoffice API1 module for sending
*-documents with attachments
 
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      DOCUMENT_DATA              = DOC_CHNG
      PUT_IN_OUTBOX              = C_X
      COMMIT_WORK                = C_X
    IMPORTING
      SENT_TO_ALL                = SENT_TO_ALL
    TABLES
      PACKING_LIST               = OBJPACK
      OBJECT_HEADER              = OBJHEAD
      CONTENTS_BIN               = OBJBIN
      CONTENTS_TXT               = OBJTXT
      RECEIVERS                  = RECLIST
    EXCEPTIONS
      TOO_MANY_RECEIVERS         = 1
      DOCUMENT_NOT_SENT          = 2
      OPERATION_NO_AUTHORIZATION = 4
      OTHERS                     = 99.
 
  CASE SY-SUBRC .
    WHEN 0.
      MESSAGE I000 WITH 'Mail has been sent successfully'(006).
    WHEN OTHERS.
      MESSAGE E000 WITH 'Problem in sending the mail'(023).
  ENDCASE.
 
ENDFORM.                    " send_mail
*&---------------------------------------------------------------------*
*&      Form  page_format
*&---------------------------------------------------------------------*
*        For page foramtting
*----------------------------------------------------------------------*
FORM PAGE_FORMAT TABLES EMAIL STRUCTURE S_EMAIL .
 
  DATA : L_LINES       TYPE I,
         L_TEMP(500)   TYPE C,
         L_OFFSET      TYPE P,
         L_LINESLEN(2) TYPE P,
         L_MIMELEN(2)  TYPE P,
         L_TABIX       LIKE SY-TABIX.
 
  CLEAR : IT_XI_PDF,
          IT_XI_TEMP.
 
  REFRESH : IT_XI_PDF,
            IT_XI_TEMP.
 
  IT_XI_PDF[] = IT_PDF[].
 
* Reformat the line to 255 characters wide (--code from SAP--)
  CLEAR: L_TEMP, L_OFFSET, IT_XI_TEMP.
  DESCRIBE TABLE IT_XI_PDF   LINES  L_LINES.
  DESCRIBE FIELD IT_XI_PDF   LENGTH L_LINESLEN IN CHARACTER MODE.
  DESCRIBE FIELD IT_XI_TEMP  LENGTH L_MIMELEN IN CHARACTER MODE.
 
  LOOP AT IT_XI_PDF.
    L_TABIX = SY-TABIX.
    MOVE IT_XI_PDF TO L_TEMP+L_OFFSET.
    IF L_TABIX = L_LINES.
      L_LINESLEN = STRLEN( IT_XI_PDF ).
    ENDIF.
    L_OFFSET = L_OFFSET + L_LINESLEN.
    IF L_OFFSET GE L_MIMELEN.
      CLEAR IT_XI_TEMP.
      IT_XI_TEMP = L_TEMP(L_MIMELEN).
      APPEND IT_XI_TEMP.
      SHIFT L_TEMP BY L_MIMELEN PLACES.
      L_OFFSET = L_OFFSET - L_MIMELEN.
    ENDIF.
    IF L_TABIX = L_LINES.
      IF L_OFFSET GT 0.
        CLEAR IT_XI_TEMP.
        IT_XI_TEMP = L_TEMP(L_OFFSET).
        APPEND IT_XI_TEMP.
      ENDIF.
    ENDIF.
  ENDLOOP.
 
  CLEAR : IT_XI_MIME,
          IT_XI_MIME[].
 
  LOOP AT IT_XI_TEMP.
    IT_XI_MIME(255) = IT_XI_TEMP-LINE.
    APPEND IT_XI_MIME.
    CLEAR  IT_XI_MIME.
  ENDLOOP.
 
* Final Data
  CLEAR : IT_HTML,
          IT_HTML[].
 
  IT_HTML[] = IT_XI_MIME[].
 
* For sending mail
  PERFORM SEND_MAIL TABLES EMAIL.
 
ENDFORM.                    " page_format
*&---------------------------------------------------------------------*
*&      Form  fetch_variants
*&---------------------------------------------------------------------*
*       For fetching the variants available for the program
*----------------------------------------------------------------------*
FORM FETCH_VARIANTS .
 
  DATA : L_PROGRAM LIKE RS38M-PROGRAMM VALUE 'RKAEP000',
         L_VARA1 TYPE DFIES-FIELDNAME VALUE 'P_VARA1'.
 
  CLEAR : IT_VARIANT1,
          IT_VARIANT1[].
 
* Get variants
  PERFORM GET_VARIANTS TABLES IT_VARIANT1
                       USING L_PROGRAM.
 
* F4 Help
  IF NOT IT_VARIANT1[] IS INITIAL.
    PERFORM GET_F4_HELP TABLES IT_VARIANT1
                         USING L_VARA1
                        CHANGING P_VARA1.
  ELSE.
    MESSAGE E000 WITH 'No variants available for report1'(054).
  ENDIF.
 
ENDFORM.                    " fetch_variants
 
*&---------------------------------------------------------------------*
*&      Form  validation
*&---------------------------------------------------------------------*
*       For Validation
*----------------------------------------------------------------------*
FORM VALIDATION .
 
  DATA : L_PRO1 LIKE RS38M-PROGRAMM VALUE 'RKAEP000',
         L_PRO2 LIKE RS38M-PROGRAMM VALUE 'GP3DIEHXY88SNFJ0391V7KF9EK7050',
         L_C1,
         L_C2.
 
* If both check-box are unchecked
  IF P_C1 IS INITIAL
 AND P_C2 IS INITIAL.
    MESSAGE E000 WITH 'Check any one check-box'(049).
  ENDIF.
 
* If checked without varaint
  IF NOT P_C1 IS INITIAL AND P_VARA1 IS INITIAL.
    MESSAGE E000 WITH 'Please give any one of the variant for report1'(055).
  ENDIF.
 
* If checked without varaint
  IF NOT P_C2 IS INITIAL AND P_VARA2 IS INITIAL.
    MESSAGE E000 WITH 'Please give any one of the variant for report2'(061).
  ENDIF.
 
* Reading the variant and fetching the mail-ids
  IF P_C1 = C_X.
 
    L_C1 = '1'.
    CLEAR : S_EMAIL,
            S_EMAIL[].
 
    PERFORM READ_VARIANTS TABLES IT_MAILID
                                 S_EMAIL
                           USING P_VARA1
                                 L_PRO1
                                 L_C1.
    IF S_EMAIL[] IS INITIAL.
      MESSAGE E000 WITH 'No Id available for given Cost report1'(066).
    ELSE.
      SORT S_EMAIL BY LOW.
      DELETE ADJACENT DUPLICATES FROM S_EMAIL COMPARING LOW.
    ENDIF.
 
  ENDIF.
 
* Reading the variant and fetching the mail-ids
  IF P_C2 = C_X.
 
    CLEAR : S_EMAIL1,
            S_EMAIL1[].
 
    L_C2 = '2'.
    PERFORM READ_VARIANTS TABLES IT_MAILID1
                                 S_EMAIL1
                           USING P_VARA2
                                 L_PRO2
                                 L_C2.
 
    IF S_EMAIL1[] IS INITIAL.
      MESSAGE E000 WITH 'No Id available for given Cost report2'(067).
    ELSE.
      SORT S_EMAIL1 BY LOW.
      DELETE ADJACENT DUPLICATES FROM S_EMAIL1 COMPARING LOW.
    ENDIF.
 
  ENDIF.
 
ENDFORM.                    " validation
 
*&---------------------------------------------------------------------*
*&      Form  GET_VARIANTS
*&---------------------------------------------------------------------*
*       Fetching Variants
*----------------------------------------------------------------------*
FORM GET_VARIANTS  TABLES   P_IT_VARIANT STRUCTURE IT_VARIANT1
                   USING    P_V_PROGRAM  TYPE RS38M-PROGRAMM.
 
  SELECT VARIANT
         FROM VARID
         INTO TABLE P_IT_VARIANT
         WHERE REPORT = P_V_PROGRAM.
 
ENDFORM.                    " GET_VARIANTS
*&---------------------------------------------------------------------*
*&      Form  GET_F4_HELP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GET_F4_HELP  TABLES   P_IT_VARIANT1 STRUCTURE IT_VARIANT1
                   USING   P_L_VARA1 LIKE DFIES-FIELDNAME
                  CHANGING P_P_VARA LIKE P_VARA1.
 
 
* Fn. for Pop-Up
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = P_L_VARA1
      VALUE_ORG       = 'S'
      DISPLAY         = ' '
    TABLES
      VALUE_TAB       = P_IT_VARIANT1
      RETURN_TAB      = IT_RETURN
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
  IF SY-SUBRC = 0.
    P_P_VARA = IT_RETURN-FIELDVAL.
  ELSE.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
ENDFORM.                    " GET_F4_HELP
*&---------------------------------------------------------------------*
*&      Form  FETCH_VARIANTS1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FETCH_VARIANTS1 .
 
  DATA : V_PROGRAM1 LIKE RS38M-PROGRAMM VALUE 'GP3DIEHXY88SNFJ0391V7KF9EK7050',
         L_VARA2  TYPE DFIES-FIELDNAME VALUE 'P_VARA2'.
 
  CLEAR : IT_VARIANT2,
          IT_VARIANT2[].
 
* Get Variants
  PERFORM GET_VARIANTS TABLES IT_VARIANT2
                       USING V_PROGRAM1.
 
* F4 Help
  IF NOT IT_VARIANT2[] IS INITIAL.
    PERFORM GET_F4_HELP TABLES IT_VARIANT2
                        USING  L_VARA2
                      CHANGING P_VARA2.
  ELSE.
    MESSAGE E000 WITH 'No variants available for report2'(050).
  ENDIF.
 
ENDFORM.                    " FETCH_VARIANTS1
 
*&---------------------------------------------------------------------*
*&      Form  read_variants
*&---------------------------------------------------------------------*
*        Reading the variant and fetching the mail-ids
*----------------------------------------------------------------------*
FORM READ_VARIANTS TABLES P_IT_MAILID STRUCTURE IT_MAILID
                          P_S_EMAIL   STRUCTURE S_EMAIL
                   USING  P_P_VARA1   LIKE P_VARA1
                          P_L_PRO1    LIKE RS38M-PROGRAMM
                          P_L_C1      TYPE C.
 
  DATA : L_TEMP(44),
         IT_VALUTAB LIKE RSPARAMS OCCURS 0 WITH HEADER LINE.
 
  RANGES : R_COCEN FOR CSKS-KOSTL.
 
* Function Module to get the variant contents
  CALL FUNCTION 'RS_VARIANT_CONTENTS'
    EXPORTING
      REPORT               = P_L_PRO1
      VARIANT              = P_P_VARA1
    TABLES
      VALUTAB              = IT_VALUTAB
    EXCEPTIONS
      VARIANT_NON_EXISTENT = 1
      VARIANT_OBSOLETE     = 2
      OTHERS               = 3.
 
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
  CLEAR : R_COCEN,
          R_COCEN[].
 
  LOOP AT IT_VALUTAB WHERE SELNAME = 'KOSTL'
                        OR SELNAME = '_C-CCTR'.
 
* Getting the range of cost centers
    IF IT_VALUTAB-OPTION = 'BT'.
      R_COCEN-LOW    = IT_VALUTAB-LOW.
* For Conversion Routine
      PERFORM CONVERSION USING R_COCEN-LOW.
      R_COCEN-HIGH   = IT_VALUTAB-HIGH.
* For Conversion Routine
      PERFORM CONVERSION USING R_COCEN-HIGH.
      R_COCEN-OPTION = 'BT'.
      R_COCEN-SIGN   = 'I'.
      APPEND R_COCEN.
      CLEAR  R_COCEN.
    ENDIF.
 
* Getting the single cost centers
    IF IT_VALUTAB-OPTION = 'EQ'.
      R_COCEN-LOW    = IT_VALUTAB-LOW.
* For Conversion Routine
      PERFORM CONVERSION USING R_COCEN-LOW.
      R_COCEN-OPTION = 'EQ'.
      R_COCEN-SIGN   = 'I'.
      APPEND R_COCEN.
      CLEAR  R_COCEN.
    ENDIF.
 
  ENDLOOP.
 
* If no cost centers
  IF NOT R_COCEN[] IS INITIAL.
    SELECT KOKRS
           KOSTL
           DATBI
           TELX1
      FROM CSKS
           INTO TABLE P_IT_MAILID
     WHERE KOSTL IN R_COCEN.
 
    IF P_IT_MAILID[] IS INITIAL.
      IF P_L_C1 = '1'.
        MESSAGE E000 WITH 'No IDs available for report1'(059).
      ELSEIF P_L_C1 = '2'.
        MESSAGE E000 WITH 'No IDs available for report2'(062).
      ENDIF.
 
    ENDIF.
 
* Deleting the blank entries
    DELETE P_IT_MAILID WHERE TELX1 = SPACE.
 
    CLEAR L_TEMP.
    READ TABLE P_IT_MAILID INDEX 1.
    L_TEMP = P_IT_MAILID-TELX1.
 
    DATA : L_CHECK.
 
    LOOP AT P_IT_MAILID WHERE TELX1 <> L_TEMP.
      L_CHECK = C_X.
    ENDLOOP.
 
* For checking the unique ids
    IF L_CHECK = C_X.
      IF P_L_C1 = '1'.
        MESSAGE E000 WITH 'No unique mail-ids for  report1'(058).
      ELSEIF P_L_C1 = '2'.
        MESSAGE E000 WITH 'No unique mail-ids for  report2'(065).
      ENDIF.
    ENDIF.
 
* Populating the IDs for the cost centers
    LOOP AT P_IT_MAILID.
      SET LOCALE LANGUAGE SY-LANGU.
      TRANSLATE P_IT_MAILID-TELX1 TO LOWER CASE.
      SET LOCALE LANGUAGE SPACE .
      CONCATENATE P_IT_MAILID-TELX1 '@allergan.com' INTO L_TEMP.
      P_S_EMAIL-LOW = L_TEMP.
      P_S_EMAIL-SIGN = 'I'.
      P_S_EMAIL-OPTION = 'EQ'.
      APPEND P_S_EMAIL.
      CLEAR  P_S_EMAIL.
    ENDLOOP.
 
  ELSE.
    IF P_L_C1 = '1'.
      MESSAGE E000 WITH 'No Cost Center Available for report1'(057).
    ELSEIF P_L_C1 = '2'.
      MESSAGE E000 WITH 'No Cost Center Available for report2'(063).
    ENDIF.
  ENDIF.
 
ENDFORM.                    " read_variants
*&---------------------------------------------------------------------*
*&      Form  CONVERSION
*&---------------------------------------------------------------------*
*       For Conversion Routine
*----------------------------------------------------------------------*
FORM CONVERSION  USING    P_IT_VALUTAB_LOW TYPE C.
 
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      INPUT  = P_IT_VALUTAB_LOW
    IMPORTING
      OUTPUT = P_IT_VALUTAB_LOW.
 
ENDFORM.                    " CONVERSION

hope this will help

regards

vijay

Former Member
0 Kudos

Hi Veni

First you need create a spool and covert that spool to PDF format and send as attachement .

Below is the sample code which works for me.

Hope this helps you.

Thanks,

Nethaji.

REPORT ZPDFMAIL.

TABLES : USR21,ADR6.

*-Internal Table

DATA: IT_OBJPACK LIKE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE.

DATA: IT_OBJBIN TYPE SOLIX_TAB .

DATA: IT_OBJHEAD LIKE SOLISTI1 OCCURS 1 WITH HEADER LINE.

DATA: IT_OBJTXT LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE.

DATA: IT_PDF LIKE TLINE OCCURS 100 WITH HEADER LINE.

DATA: IT_RECLIST LIKE SOMLRECI1 OCCURS 5 WITH HEADER LINE.

DATA: IT_EMAIL_HEADER LIKE SODOCCHGI1-OBJ_DESCR.

DATA: IT_DOC_CHNG LIKE SODOCCHGI1.

DATA: IT_CONTENT_OUT TYPE SOLIX.

DATA: BEGIN OF IT_CONTENT_IN,

LINE TYPE TLINE,

DUMMY TYPE TLINE,

END OF IT_CONTENT_IN.

*-Variables

DATA: W_NUMBYTES TYPE I,

W_PDFSPOOLID LIKE TSP01-RQIDENT,

W_JOBNAME LIKE TBTCJOB-JOBNAME,

W_JOBCOUNT LIKE TBTCJOB-JOBCOUNT,

W_SPOOLNO LIKE TSP01-RQIDENT,

W_TAB_LINES LIKE SY-TABIX,

W_LINE_WIDTH_SRC TYPE I,

W_POS_OUT TYPE I,

W_POS_IN TYPE I.

*-Type

TYPES TY_PDF_RAW TYPE X LENGTH 268.

*-Field symbol

FIELD-SYMBOLS <PDF_BIN> TYPE TY_PDF_RAW.

W_SPOOLNO = '0000020025'.

*-Convert OTF Spool to PDF

CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'

EXPORTING

SRC_SPOOLID = W_SPOOLNO

NO_DIALOG = ' '

IMPORTING

PDF_BYTECOUNT = W_NUMBYTES

PDF_SPOOLID = W_PDFSPOOLID

BTC_JOBNAME = W_JOBNAME

BTC_JOBCOUNT = W_JOBCOUNT

TABLES

PDF = IT_PDF

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.

IF SY-SUBRC NE 0.

ENDIF.

*-Get Person number and Address number for SY_UNAME

CLEAR USR21.

SELECT SINGLE PERSNUMBER ADDRNUMBER FROM USR21

INTO (USR21-PERSNUMBER,USR21-ADDRNUMBER)

WHERE BNAME = SY-UNAME.

IF SY-SUBRC = 0.

CLEAR ADR6.

SELECT SINGLE SMTP_ADDR FROM ADR6

INTO ADR6-SMTP_ADDR

WHERE ADDRNUMBER = USR21-ADDRNUMBER

AND PERSNUMBER = USR21-PERSNUMBER.

ENDIF.

IT_RECLIST-RECEIVER = SY-UNAME.

IT_RECLIST-REC_TYPE = 'B'.

APPEND IT_RECLIST.

IT_RECLIST-RECEIVER = ADR6-SMTP_ADDR.

IT_RECLIST-REC_TYPE = 'U'.

APPEND IT_RECLIST.

*-Populate Mail Body Text

IT_OBJTXT = 'Mail with Quotation PDF attachment'.

APPEND IT_OBJTXT.

IT_OBJTXT = 'Please double click the attachment to verify'.

APPEND IT_OBJTXT.

*-Email Header and Subject

IT_EMAIL_HEADER = 'Quotation PDF'.

IT_DOC_CHNG-OBJ_NAME = IT_EMAIL_HEADER.

IT_DOC_CHNG-OBJ_DESCR = IT_EMAIL_HEADER.

DESCRIBE TABLE IT_OBJTXT LINES W_TAB_LINES.

READ TABLE IT_OBJTXT INDEX W_TAB_LINES.

IT_DOC_CHNG-DOC_SIZE = ( W_TAB_LINES - 1 ) * 255 + STRLEN( IT_OBJTXT ).

*--Fill object package table

CLEAR IT_OBJPACK-TRANSF_BIN.

IT_OBJPACK-HEAD_START = 1.

IT_OBJPACK-HEAD_NUM = 0.

IT_OBJPACK-BODY_START = 1.

IT_OBJPACK-BODY_NUM = W_TAB_LINES.

IT_OBJPACK-DOC_TYPE = 'RAW'.

APPEND IT_OBJPACK.

  • Cast to binary type and adjust table line length

DESCRIBE FIELD IT_CONTENT_IN-LINE LENGTH W_LINE_WIDTH_SRC IN BYTE MODE.

REFRESH IT_OBJBIN.

CLEAR IT_CONTENT_OUT.

W_POS_OUT = 0.

*-Populate it_OBJBIN

LOOP AT IT_PDF INTO IT_CONTENT_IN-LINE.

ASSIGN IT_CONTENT_IN TO <PDF_BIN> CASTING.

MOVE <PDF_BIN> TO IT_CONTENT_OUT-LINE+W_POS_OUT.

ADD W_LINE_WIDTH_SRC TO W_POS_OUT.

WHILE W_POS_OUT >= 255.

APPEND IT_CONTENT_OUT TO IT_OBJBIN.

CLEAR IT_CONTENT_OUT.

SUBTRACT 255 FROM W_POS_OUT.

IF W_POS_OUT > 0.

W_POS_IN = W_LINE_WIDTH_SRC - W_POS_OUT.

MOVE <PDF_BIN>+W_POS_IN TO IT_CONTENT_OUT-LINE.

ENDIF.

ENDWHILE.

ENDLOOP.

IF W_POS_OUT > 0.

APPEND IT_CONTENT_OUT TO IT_OBJBIN.

ENDIF.

DESCRIBE TABLE IT_OBJBIN LINES W_TAB_LINES.

IT_OBJHEAD = 'Quotation PDF'.

APPEND IT_OBJHEAD.

  • Settings for PDF file

IT_OBJPACK-TRANSF_BIN = 'X'.

IT_OBJPACK-HEAD_START = 1.

IT_OBJPACK-HEAD_NUM = 1.

IT_OBJPACK-BODY_START = 1.

IT_OBJPACK-BODY_NUM = W_TAB_LINES.

IT_OBJPACK-DOC_TYPE = 'PDF'.

IT_OBJPACK-OBJ_NAME = IT_EMAIL_HEADER.

IT_OBJPACK-OBJ_DESCR = IT_EMAIL_HEADER.

IT_OBJPACK-DOC_SIZE = W_TAB_LINES * 255.

APPEND IT_OBJPACK.

*-Send Mail

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

DOCUMENT_DATA = IT_DOC_CHNG

PUT_IN_OUTBOX = 'X'

COMMIT_WORK = 'X'

TABLES

PACKING_LIST = IT_OBJPACK

OBJECT_HEADER = IT_OBJHEAD

CONTENTS_HEX = IT_OBJBIN

CONTENTS_TXT = IT_OBJTXT

RECEIVERS = IT_RECLIST

EXCEPTIONS

TOO_MANY_RECEIVERS = 1

DOCUMENT_NOT_SENT = 2

OPERATION_NO_AUTHORIZATION = 4

OTHERS = 99.

IF SY-SUBRC NE 0.

ENDIF.

Former Member
0 Kudos

Hi Veni

First you need create a spool and covert that spool to PDF format and send as attachement .

Below is the sample code which works for me.

Hope this helps you.

Thanks,

Nethaji.

REPORT ZPDFMAIL.

TABLES : USR21,ADR6.

*-Internal Table

DATA: IT_OBJPACK LIKE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE.

DATA: IT_OBJBIN TYPE SOLIX_TAB .

DATA: IT_OBJHEAD LIKE SOLISTI1 OCCURS 1 WITH HEADER LINE.

DATA: IT_OBJTXT LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE.

DATA: IT_PDF LIKE TLINE OCCURS 100 WITH HEADER LINE.

DATA: IT_RECLIST LIKE SOMLRECI1 OCCURS 5 WITH HEADER LINE.

DATA: IT_EMAIL_HEADER LIKE SODOCCHGI1-OBJ_DESCR.

DATA: IT_DOC_CHNG LIKE SODOCCHGI1.

DATA: IT_CONTENT_OUT TYPE SOLIX.

DATA: BEGIN OF IT_CONTENT_IN,

LINE TYPE TLINE,

DUMMY TYPE TLINE,

END OF IT_CONTENT_IN.

*-Variables

DATA: W_NUMBYTES TYPE I,

W_PDFSPOOLID LIKE TSP01-RQIDENT,

W_JOBNAME LIKE TBTCJOB-JOBNAME,

W_JOBCOUNT LIKE TBTCJOB-JOBCOUNT,

W_SPOOLNO LIKE TSP01-RQIDENT,

W_TAB_LINES LIKE SY-TABIX,

W_LINE_WIDTH_SRC TYPE I,

W_POS_OUT TYPE I,

W_POS_IN TYPE I.

*-Type

TYPES TY_PDF_RAW TYPE X LENGTH 268.

*-Field symbol

FIELD-SYMBOLS <PDF_BIN> TYPE TY_PDF_RAW.

W_SPOOLNO = '0000020025'.

*-Convert OTF Spool to PDF

CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'

EXPORTING

SRC_SPOOLID = W_SPOOLNO

NO_DIALOG = ' '

IMPORTING

PDF_BYTECOUNT = W_NUMBYTES

PDF_SPOOLID = W_PDFSPOOLID

BTC_JOBNAME = W_JOBNAME

BTC_JOBCOUNT = W_JOBCOUNT

TABLES

PDF = IT_PDF

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.

IF SY-SUBRC NE 0.

ENDIF.

*-Get Person number and Address number for SY_UNAME

CLEAR USR21.

SELECT SINGLE PERSNUMBER ADDRNUMBER FROM USR21

INTO (USR21-PERSNUMBER,USR21-ADDRNUMBER)

WHERE BNAME = SY-UNAME.

IF SY-SUBRC = 0.

CLEAR ADR6.

SELECT SINGLE SMTP_ADDR FROM ADR6

INTO ADR6-SMTP_ADDR

WHERE ADDRNUMBER = USR21-ADDRNUMBER

AND PERSNUMBER = USR21-PERSNUMBER.

ENDIF.

IT_RECLIST-RECEIVER = SY-UNAME.

IT_RECLIST-REC_TYPE = 'B'.

APPEND IT_RECLIST.

IT_RECLIST-RECEIVER = ADR6-SMTP_ADDR.

IT_RECLIST-REC_TYPE = 'U'.

APPEND IT_RECLIST.

*-Populate Mail Body Text

IT_OBJTXT = 'Mail with Quotation PDF attachment'.

APPEND IT_OBJTXT.

IT_OBJTXT = 'Please double click the attachment to verify'.

APPEND IT_OBJTXT.

*-Email Header and Subject

IT_EMAIL_HEADER = 'Quotation PDF'.

IT_DOC_CHNG-OBJ_NAME = IT_EMAIL_HEADER.

IT_DOC_CHNG-OBJ_DESCR = IT_EMAIL_HEADER.

DESCRIBE TABLE IT_OBJTXT LINES W_TAB_LINES.

READ TABLE IT_OBJTXT INDEX W_TAB_LINES.

IT_DOC_CHNG-DOC_SIZE = ( W_TAB_LINES - 1 ) * 255 + STRLEN( IT_OBJTXT ).

*--Fill object package table

CLEAR IT_OBJPACK-TRANSF_BIN.

IT_OBJPACK-HEAD_START = 1.

IT_OBJPACK-HEAD_NUM = 0.

IT_OBJPACK-BODY_START = 1.

IT_OBJPACK-BODY_NUM = W_TAB_LINES.

IT_OBJPACK-DOC_TYPE = 'RAW'.

APPEND IT_OBJPACK.

  • Cast to binary type and adjust table line length

DESCRIBE FIELD IT_CONTENT_IN-LINE LENGTH W_LINE_WIDTH_SRC IN BYTE MODE.

REFRESH IT_OBJBIN.

CLEAR IT_CONTENT_OUT.

W_POS_OUT = 0.

*-Populate it_OBJBIN

LOOP AT IT_PDF INTO IT_CONTENT_IN-LINE.

ASSIGN IT_CONTENT_IN TO <PDF_BIN> CASTING.

MOVE <PDF_BIN> TO IT_CONTENT_OUT-LINE+W_POS_OUT.

ADD W_LINE_WIDTH_SRC TO W_POS_OUT.

WHILE W_POS_OUT >= 255.

APPEND IT_CONTENT_OUT TO IT_OBJBIN.

CLEAR IT_CONTENT_OUT.

SUBTRACT 255 FROM W_POS_OUT.

IF W_POS_OUT > 0.

W_POS_IN = W_LINE_WIDTH_SRC - W_POS_OUT.

MOVE <PDF_BIN>+W_POS_IN TO IT_CONTENT_OUT-LINE.

ENDIF.

ENDWHILE.

ENDLOOP.

IF W_POS_OUT > 0.

APPEND IT_CONTENT_OUT TO IT_OBJBIN.

ENDIF.

DESCRIBE TABLE IT_OBJBIN LINES W_TAB_LINES.

IT_OBJHEAD = 'Quotation PDF'.

APPEND IT_OBJHEAD.

  • Settings for PDF file

IT_OBJPACK-TRANSF_BIN = 'X'.

IT_OBJPACK-HEAD_START = 1.

IT_OBJPACK-HEAD_NUM = 1.

IT_OBJPACK-BODY_START = 1.

IT_OBJPACK-BODY_NUM = W_TAB_LINES.

IT_OBJPACK-DOC_TYPE = 'PDF'.

IT_OBJPACK-OBJ_NAME = IT_EMAIL_HEADER.

IT_OBJPACK-OBJ_DESCR = IT_EMAIL_HEADER.

IT_OBJPACK-DOC_SIZE = W_TAB_LINES * 255.

APPEND IT_OBJPACK.

*-Send Mail

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

DOCUMENT_DATA = IT_DOC_CHNG

PUT_IN_OUTBOX = 'X'

COMMIT_WORK = 'X'

TABLES

PACKING_LIST = IT_OBJPACK

OBJECT_HEADER = IT_OBJHEAD

CONTENTS_HEX = IT_OBJBIN

CONTENTS_TXT = IT_OBJTXT

RECEIVERS = IT_RECLIST

EXCEPTIONS

TOO_MANY_RECEIVERS = 1

DOCUMENT_NOT_SENT = 2

OPERATION_NO_AUTHORIZATION = 4

OTHERS = 99.

IF SY-SUBRC NE 0.

ENDIF.

former_member186741
Active Contributor
0 Kudos

please have a look at the abaps BCS_EXAMPLE_1 - BCS_EXAMPLE_5 which give examples of how to send emails and/or faxes with and without attachments.

0 Kudos

hi neil,

How do I check these examples. Please let me know.

Thanks

Veni.

0 Kudos

Hi,

just look at them in SE38 or SE80. They are quite easy to follow.

Former Member
0 Kudos

hi

this is just a function to send any attachment

FUNCTION zsend_mail_attachment.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(V_FILE_PATH) TYPE  STRING OPTIONAL
*"     REFERENCE(V_SUBJECT) TYPE  SO_OBJ_DES
*"  TABLES
*"      IT_RECEIVERS STRUCTURE  SOMLRECI1
*"      IT_MESSAGE STRUCTURE  SOLISTI1
*"----------------------------------------------------------------------

  DATA: gd_cnt TYPE i,
        gd_sent_all(1) TYPE c,
        gd_doc_data LIKE sodocchgi1,
        gd_error TYPE sy-subrc.

  DATA objbin LIKE solisti1 OCCURS 0 WITH HEADER LINE.

  DATA : it_packing_list LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE.

* Binary store for File
  DATA : BEGIN OF it_file OCCURS 0,
           row(255),
         END OF it_file.

* splitting of the filepath
  DATA : BEGIN OF i_split OCCURS 0,
           row(50),
         END OF i_split.

  DATA tab_lines LIKE sy-tabix.

  REFRESH : it_file, objbin, it_packing_list, i_split.
  CLEAR   : it_file, objbin, it_packing_list, i_split.

  DESCRIBE TABLE it_message LINES tab_lines.
  READ     TABLE it_message INDEX tab_lines.

  gd_doc_data-doc_size = ( tab_lines - 1 ) * 255 + STRLEN( it_message ).
  gd_doc_data-obj_langu  = sy-langu.
  gd_doc_data-obj_name   = 'SENDFILE'.
  gd_doc_data-obj_descr  = v_subject.
  gd_doc_data-sensitivty = 'O'.

  CLEAR it_packing_list.

  it_packing_list-head_start = 1.
  it_packing_list-head_num   = 0.
  it_packing_list-body_start = 1.
  it_packing_list-doc_type   = 'RAW'.
  it_packing_list-body_num   = tab_lines.
  APPEND it_packing_list.

  IF v_file_path IS NOT INITIAL.
    DATA : v_len      TYPE i,
           v_index    LIKE sy-index,
           v_doc_type TYPE  so_obj_tp,
           v_filename TYPE  so_obj_des .

    v_len = STRLEN( v_file_path ) - 3.
    v_doc_type = v_file_path+v_len(3) .
    TRANSLATE v_doc_type TO UPPER CASE .

    SPLIT v_file_path AT '' INTO TABLE i_split .
    DESCRIBE TABLE i_split LINES v_index .
    READ TABLE i_split INDEX v_index .
    v_filename = i_split-row .
    v_len = STRLEN( v_filename ) - 4.
    v_filename = v_filename(v_len) .

    CALL FUNCTION 'GUI_UPLOAD'
      EXPORTING
        filename = v_file_path
        filetype = 'BIN'
      TABLES
        data_tab = it_file.

    LOOP AT it_file.
      MOVE it_file-row TO objbin-line.
      APPEND objbin.
    ENDLOOP.

    CLEAR it_packing_list.

    DESCRIBE TABLE objbin LINES tab_lines.

    it_packing_list-transf_bin = 'X'.
    it_packing_list-head_start = 1.
    it_packing_list-head_num   = 1.
    it_packing_list-body_start = 1.
    it_packing_list-doc_type   = v_doc_type.
    it_packing_list-body_num   = tab_lines.
    it_packing_list-doc_size   = tab_lines * 255.
    it_packing_list-obj_descr  = v_filename.
    APPEND it_packing_list.
  ENDIF.

*  it_receivers-receiver = 'abhiaries@yahoo.com'.
*  it_receivers-rec_type = 'U'.
*  it_receivers-com_type = 'INT'.
*  APPEND it_receivers .

* Call the FM to post the message to SAPMAIL
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data = gd_doc_data
      put_in_outbox = 'X'
      commit_work   = 'X'
*   IMPORTING
*     sent_to_all = gd_sent_all
    TABLES
      packing_list = it_packing_list
      contents_txt = it_message
      contents_bin = objbin
      receivers    = it_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.

ENDFUNCTION.

i hope this will solve ur problem

Reward points if solved.

Abhishek Suppal