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: 

how to send email?

shahid
Product and Topic Expert
Product and Topic Expert
0 Kudos
118

i want to write a report program , when i execute it it should send the data to an email....can someone please give me a demo code...

1 ACCEPTED SOLUTION

Former Member
0 Kudos
58

Hi

See the sample report for sending Mail

REPORT zm_reservation_alert

NO STANDARD PAGE HEADING

MESSAGE-ID zm_msg.

************************************************************************

  • D A T A B A S E T A B L E S D E C L A R A T I O N

************************************************************************

  • T Y P E S D E C L A R A T I O N S

************************************************************************

  • Reservations Main Structure

TYPES: BEGIN OF s_res,

rsnum TYPE rsnum, " Reservation No

rspos TYPE rspos, " Item No

usnam TYPE usnam, " User Name

bwart TYPE bwart, " Movement Type

aufnr TYPE aufnr, " Order Number

rsart TYPE rsart, " Record Type

bdart TYPE bdart, " Reservation Type

matnr TYPE matnr, " Material No

bdter TYPE bdter, " Req Date

menge TYPE menge_d, " Quantity

kostl TYPE kostl, " Cost Center

usrid TYPE sysid, " User ID

END OF s_res.

  • Output Main Structure

TYPES: BEGIN OF s_rep,

usnam TYPE usnam, " User Name

rsnum TYPE rsnum, " Reservation No

rspos TYPE rspos, " Item No

matnr TYPE matnr, " Material No

bdter TYPE bdter, " Req Date

menge TYPE menge_d, " Quantity

kostl TYPE kostl, " Cost Center

aufnr TYPE aufnr, " Order Number

END OF s_rep.

  • User Dept Details

TYPES: BEGIN OF s_dept,

pernr TYPE persno, " Personal No

usrid TYPE sysid, " User ID

orgeh TYPE orgeh, " Orgn Unit

orgtx TYPE orgtx, " Dept Name

END OF s_dept.

  • For Send Mail Purpose

DATA : i_doc_data LIKE sodocchgi1.

DATA : BEGIN OF i_pack_list OCCURS 0.

INCLUDE STRUCTURE sopcklsti1.

DATA : END OF i_pack_list.

DATA : BEGIN OF i_receivers OCCURS 0.

INCLUDE STRUCTURE somlreci1.

DATA : END OF i_receivers.

DATA : BEGIN OF i_contents OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA : END OF i_contents.

DATA : BEGIN OF i_header OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA : END OF i_header.

DATA : BEGIN OF i_att OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA : END OF i_att.

  • Internal table for bdcdata

DATA : it_bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.

  • Internal table to handle messages

DATA : it_messages LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.

************************************************************************

  • D A T A D E C L A R A T I O N S

************************************************************************

DATA: gv_lines TYPE sy-index, " Total Lines int Table

gv_days TYPE i, " Difference Days

gv_date TYPE sy-datum, " Date

gv_date1 TYPE sy-datum, " Date

gv_date2 TYPE sy-datum, " Date

gv_text(85), " Text Field

gv_mesg(70), " Error Messages

gv_bdc, " BDC Flag

gv_flag TYPE i, " Flag

gv_ernam TYPE ernam. " User ID

************************************************************************

  • C O N S T A N T S D E C L A R A T I O N S

************************************************************************

CONSTANTS: c_x VALUE 'X', " Flag

c_endda TYPE endda VALUE '99991231'. " Date

************************************************************************

  • I N T E R N A L T A B L E S D E C L A R A T I O N S

************************************************************************

DATA: i_res TYPE STANDARD TABLE OF s_res WITH HEADER LINE, " Reservns

i_dept TYPE STANDARD TABLE OF s_dept WITH HEADER LINE, " Dept

i_rep TYPE STANDARD TABLE OF s_rep WITH HEADER LINE. " Output

************************************************************************

  • S T A R T - O F - S E L E C T I O N *

************************************************************************

START-OF-SELECTION.

  • Fetch main data

PERFORM fetch_data.

  • Process data

PERFORM process_data.

&----


*& Form fetch_data

&----


  • Fetching the Reservations related data from Database Tables

----


FORM fetch_data .

CLEAR: gv_date, gv_date1, gv_date2.

gv_date = sy-datum.

gv_date1 = sy-datum - 10.

gv_date2 = sy-datum + 10.

CLEAR i_res.

REFRESH i_res.

SELECT a~rsnum " Reservation No.

b~rspos " Reservation Item

a~usnam " User Name

a~bwart " Movement Type

a~aufnr " Order Number

b~rsart " Record Type

b~bdart " Reservation Type

b~matnr " Material No

b~bdter " Req Date

INTO TABLE i_res

FROM rkpf AS a JOIN resb AS b

ON arsnum = brsnum

WHERE ( b~bdter BETWEEN gv_date1 AND gv_date2 ) AND

b~xloek EQ ' '.

SORT i_res BY rsnum rspos.

DELETE ADJACENT DUPLICATES FROM i_res COMPARING matnr.

  • Add userid into the i_usr int table

LOOP AT i_res.

i_res-usrid = i_res-usnam.

MODIFY i_res INDEX sy-tabix.

ENDLOOP.

IF NOT i_res[] IS INITIAL.

  • Get the User Dept Name

CLEAR i_dept.

REFRESH i_dept.

SELECT a~pernr " Personal No

a~usrid " User ID

b~orgeh " Orgn Unit

c~orgtx " Dept Name

INTO TABLE i_dept

FROM pa0105 AS a JOIN pa0001 AS b

ON apernr = bpernr JOIN t527x AS c

ON borgeh = corgeh

FOR ALL ENTRIES IN i_res

WHERE a~usrid = i_res-usrid AND

a~endda EQ c_endda AND

b~endda EQ c_endda.

ENDIF.

SORT i_dept BY pernr.

DELETE ADJACENT DUPLICATES FROM i_dept COMPARING pernr.

  • Move the Creator of Reservation to a diff table

LOOP AT i_res.

MOVE-CORRESPONDING i_res TO i_rep.

APPEND i_rep.

CLEAR i_rep.

ENDLOOP.

SORT i_rep BY usnam rsnum rspos.

ENDFORM. " Fetch_Data

&----


*& Form process_data

&----


  • Process the Reservations related data for Expiry Date

----


FORM process_data .

DATA: lv_date1 LIKE sy-datum,

lv_date2 LIKE sy-datum,

lv_date3(10),

lv_menge(13),

lv_tabix LIKE sy-tabix.

LOOP AT i_rep.

CLEAR: gv_days, gv_text, lv_date1, lv_date2,lv_date3.

lv_tabix = sy-tabix.

AT NEW usnam.

  • Populate the Contents Table

CLEAR i_att.

REFRESH i_att.

i_att = 'Reservations Reminder'(014).

APPEND i_att.

i_att = '----


'.

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

READ TABLE i_dept WITH KEY usrid = i_rep-usnam.

CONCATENATE 'Name:'(003) i_rep-usnam 'Dept:'(015) i_dept-orgtx

INTO i_att-line SEPARATED BY space.

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

i_att = 'Please find the List of expiring Reservations'(004).

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

CONCATENATE '--


' '
' '
--


'

'--


' '--


' INTO

i_att-line SEPARATED BY space.

APPEND i_att.

CONCATENATE 'Reservation #'(006) 'Material #'(007) ' Quantity'(002)

'Due Date'(008) 'Work Center/CC'(005) INTO

i_att-line SEPARATED BY space.

APPEND i_att.

CONCATENATE '--


' '
' '
--


'

'--


' '--


' INTO

i_att-line SEPARATED BY space.

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

ENDAT.

gv_days = i_rep-bdter - gv_date.

lv_date1 = i_rep-bdter + 5.

lv_date2 = i_rep-bdter + 10.

MOVE i_rep-menge TO lv_menge.

WRITE i_rep-bdter TO lv_date3.

IF gv_days = 10.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is due for 10 days. Please collect'(009)

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is due for 10 days. Please collect'(009)

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

ENDIF.

IF gv_days = 5.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is due for 5 days. Please collect'(010)

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is due for 5 days. Please collect'(010)

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

ENDIF.

IF gv_date = lv_date1.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is getting cancelled on'(011) lv_date2

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is getting cancelled on'(011) lv_date2

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

ENDIF.

IF gv_date = lv_date2.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is being cancelled'(012)

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is being cancelled'(012)

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

  • Mark the Reservation Item 'DELETED' using BDC.

  • UPDATE resb SET xloek = c_x.

PERFORM delete_item_resb.

ENDIF.

AT END OF usnam.

IF ( gv_days = 10 OR gv_days = 5 OR gv_date = lv_date1 OR

gv_date = lv_date2 ).

  • Read the User who creates the Reservn and send a mail alert to him

CLEAR : i_receivers,gv_ernam.

REFRESH: i_receivers.

READ TABLE i_rep INDEX lv_tabix.

gv_ernam = i_rep-usnam.

IF gv_ernam <> space.

  • Send mail Alert to PR Creator(SAP inbox)

PERFORM send_alert_data.

  • Send Mail to External Mail ID of the SAP USER

PERFORM send_mail_external.

ENDIF.

ENDIF.

ENDAT.

ENDLOOP.

ENDFORM. " Process_data

&----


*& Form delete_item_resb

&----


  • Set the Deletion Indicator for the Res. Item in RESB

----


FORM delete_item_resb.

gv_bdc = 'N'.

  • Perform to fill it_bdcdata.

PERFORM fill_it_bdcdata.

  • Call the Transaction MB22

CALL TRANSACTION 'MB22' USING it_bdcdata MODE 'A' UPDATE 'S'

MESSAGES INTO it_messages.

IF sy-subrc <> 0.

gv_flag = 1.

  • If error occurs in transaction mode run bdc session for that data

PERFORM bdc_process.

ENDIF.

  • Handles error messages

PERFORM error_messages.

CLEAR : it_bdcdata, it_messages.

REFRESH : it_bdcdata, it_messages.

IF gv_bdc = 'O'.

  • close bdc if it is open

PERFORM close_bdc.

ENDIF.

ENDFORM. "delete_item_resb

&----


*& Form FILL_IT_BDCDATA

&----


  • Filling Bdcdata structure with data

----


FORM fill_it_bdcdata.

PERFORM bdc_dynpro USING 'SAPMM07R' '0560'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RM07M-RSPOS'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RM07M-RSNUM'

i_rep-rsnum.

PERFORM bdc_field USING 'RM07M-RSPOS'

i_rep-rspos.

PERFORM bdc_dynpro USING 'SAPMM07R' '0510'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RESB-XLOEK'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RESB-XLOEK'

c_x.

PERFORM bdc_dynpro USING 'SAPLKACB' '0002'.

PERFORM bdc_field USING 'BDC_CURSOR'

'COBL-KOSTL'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=ENTE'.

PERFORM bdc_dynpro USING 'SAPMM07R' '0510'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RESB-ERFMG'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=BU'.

PERFORM bdc_dynpro USING 'SAPLKACB' '0002'.

PERFORM bdc_field USING 'BDC_CURSOR'

'COBL-KOSTL'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=ENTE'.

ENDFORM. " FILL_IT_BDCDATA

&----


*& Form BDC_DYNPRO

&----


  • Filling the it_bdcdata table with program name & screen number

----


FORM bdc_dynpro USING program LIKE bdcdata-program

dynpro LIKE bdcdata-dynpro.

it_bdcdata-program = program.

it_bdcdata-dynpro = dynpro.

it_bdcdata-dynbegin = 'X'.

APPEND it_bdcdata.

CLEAR it_bdcdata.

ENDFORM. " BDC_DYNPRO

&----


*& Form BDC_FIELD

&----


  • Filling it_bdcdata with field name and field value

----


FORM bdc_field USING fnam LIKE bdcdata-fnam

fval.

it_bdcdata-fnam = fnam.

it_bdcdata-fval = fval.

APPEND it_bdcdata.

CLEAR it_bdcdata.

ENDFORM. " BDC_FIELD

&----


*& Form ERROR_MESSAGES

&----


  • Displaying error messages

----


FORM error_messages.

CALL FUNCTION 'FORMAT_MESSAGE'

EXPORTING

id = sy-msgid

lang = sy-langu

IMPORTING

msg = gv_mesg

EXCEPTIONS

not_found = 1

OTHERS = 2.

LOOP AT it_messages WHERE msgtyp = 'E'.

WRITE : / 'Message :'(001) ,gv_mesg.

CLEAR it_messages.

ENDLOOP.

ENDFORM. " ERROR_MESSAGES

&----


*& Form BDC_PROCESS

&----


  • Open bdc session if call transaction fails

----


FORM bdc_process.

IF gv_bdc = 'N'.

  • open bdc session

PERFORM open_bdc.

gv_bdc = 'O'.

ENDIF.

IF gv_bdc = 'O'.

  • insert data into bdc session

PERFORM insert_bdc.

ENDIF.

ENDFORM. " BDC_PROCESS

&----


*& Form OPEN_BDC

&----


  • Calling function module to open bdc session

----


FORM open_bdc.

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING

client = sy-mandt

group = 'ZMM'

keep = 'X'

user = sy-uname

EXCEPTIONS

client_invalid = 1

destination_invalid = 2

group_invalid = 3

group_is_locked = 4

holddate_invalid = 5

internal_error = 6

queue_error = 7

running = 8

system_lock_error = 9

user_invalid = 10

OTHERS = 11.

ENDFORM. " OPEN_BDC

&----


*& Form INSERT_BDC

&----


  • Insert it_bdcdata into bdc by calling function module bdc_insert

----


FORM insert_bdc.

CALL FUNCTION 'BDC_INSERT'

EXPORTING

tcode = 'MB22'

TABLES

dynprotab = it_bdcdata

EXCEPTIONS

internal_error = 1

not_open = 2

queue_error = 3

tcode_invalid = 4

printing_invalid = 5

posting_invalid = 6

OTHERS = 7.

ENDFORM. " INSERT_BDC

&----


*& Form CLOSE_BDC

&----


  • Closing bdc session

----


FORM close_bdc.

CALL FUNCTION 'BDC_CLOSE_GROUP'

EXCEPTIONS

not_open = 1

queue_error = 2

OTHERS = 3.

ENDFORM. " CLOSE_BDC

&----


*& Form send_alert_data

&----


  • Send Alert for the Expired Contract

----


FORM send_alert_data .

CLEAR: gv_lines,i_receivers, i_header, i_contents,i_doc_data.

REFRESH : i_receivers,i_header,i_contents.

DESCRIBE TABLE i_att LINES gv_lines.

i_receivers-receiver = gv_ernam.

  • i_receivers-receiver = 'SSHEIK'.

i_receivers-rec_type = 'B'.

  • i_receivers-rec_date = sy-datum.

  • i_receivers-express = 'X'.

  • i_receivers-com_type = 'INT'.

  • i_receivers-notif_del = 'X'.

APPEND i_receivers.

i_doc_data-obj_name = 'SAPoffice'(013).

i_doc_data-obj_descr = 'Reservations Reminder'(014).

i_doc_data-obj_langu = 'E'.

i_doc_data-no_change = c_x.

i_doc_data-obj_prio = 1.

i_doc_data-priority = 1.

i_doc_data-doc_size = ( gv_lines - 1 ) * 255 + 135.

i_pack_list-transf_bin = c_x.

i_pack_list-head_start = '1'.

i_pack_list-head_num = '1'.

i_pack_list-body_start = '1'.

i_pack_list-body_num = gv_lines.

i_pack_list-doc_type = 'DOC'.

i_pack_list-obj_name = 'SAPoffice'(013).

i_pack_list-obj_descr = 'Reservations Reminder'(014).

i_pack_list-obj_langu = 'E'.

i_pack_list-doc_size = ( gv_lines - 1 ) * 255 + 135.

APPEND i_pack_list.

  • i_header-line = 'Header'. APPEND i_header.

  • Data for contents

i_contents-line = 'Please find the Reservations Due List'(016).

APPEND i_contents.

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

document_data = i_doc_data

  • PUT_IN_OUTBOX = 'X'

  • IMPORTING

  • SENT_TO_ALL =

  • NEW_OBJECT_ID =

TABLES

packing_list = i_pack_list

object_header = i_header

contents_bin = i_att

contents_txt = i_contents

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 i000 WITH 'Mail Sucessfully sent'(017).

ELSE.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " send_alert_data

&----


*& Form send_mail_external

&----


  • Send mail to External MAIL ID of the PR Creator

----


FORM send_mail_external.

DATA : lv_str(24), lv_str1(40),

lv_pernr LIKE adr6-persnumber,

lv_adrnr LIKE adr6-addrnumber,

lv_usrid LIKE pa0105-usrid,

lv_mail LIKE adr6-smtp_addr,

lv_sendor TYPE syuname,

lv_receiver TYPE string,

lv_header TYPE string,

lv_body TYPE string.

CLEAR: lv_pernr, lv_usrid, lv_adrnr,

lv_mail, lv_sendor, lv_receiver,

lv_header, lv_body .

lv_usrid = gv_ernam.

SELECT SINGLE persnumber addrnumber FROM usr21

INTO (lv_pernr,lv_adrnr)

WHERE bname = lv_usrid.

IF sy-subrc = 0.

SELECT SINGLE smtp_addr INTO lv_mail FROM adr6

WHERE addrnumber = lv_adrnr AND

persnumber = lv_pernr.

IF sy-subrc <> 0.

CONCATENATE lv_usrid '@anc.com' INTO lv_mail.

lv_receiver = lv_mail.

ELSE.

lv_receiver = lv_mail.

ENDIF.

  • lv_receiver = 'avangala@anc.com'.

lv_sendor = 'JALKHATAM'.

lv_header = 'Reservations Reminder'(014).

lv_str = 'Pls check your SAP Inbox'(019).

lv_str1 = 'for the status of Reservations Due List'(020).

CONCATENATE lv_str lv_str1 INTO lv_body

SEPARATED BY space.

  • Call Function Module To send mail

CALL FUNCTION 'UWSP_SEND_MAIL_TO_WEB'

EXPORTING

id_header = lv_header

id_body = lv_body

id_receiver = lv_receiver

id_sender = lv_sendor

  • ID_HTML_MAIL =

id_commit_work = 'X'

EXCEPTIONS

error = 1

OTHERS = 2.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDFORM. " send_mail_external

<b>Reward points for useful Answers</b>

Regards

Anji

3 REPLIES 3

Former Member
0 Kudos
59

Hi

See the sample report for sending Mail

REPORT zm_reservation_alert

NO STANDARD PAGE HEADING

MESSAGE-ID zm_msg.

************************************************************************

  • D A T A B A S E T A B L E S D E C L A R A T I O N

************************************************************************

  • T Y P E S D E C L A R A T I O N S

************************************************************************

  • Reservations Main Structure

TYPES: BEGIN OF s_res,

rsnum TYPE rsnum, " Reservation No

rspos TYPE rspos, " Item No

usnam TYPE usnam, " User Name

bwart TYPE bwart, " Movement Type

aufnr TYPE aufnr, " Order Number

rsart TYPE rsart, " Record Type

bdart TYPE bdart, " Reservation Type

matnr TYPE matnr, " Material No

bdter TYPE bdter, " Req Date

menge TYPE menge_d, " Quantity

kostl TYPE kostl, " Cost Center

usrid TYPE sysid, " User ID

END OF s_res.

  • Output Main Structure

TYPES: BEGIN OF s_rep,

usnam TYPE usnam, " User Name

rsnum TYPE rsnum, " Reservation No

rspos TYPE rspos, " Item No

matnr TYPE matnr, " Material No

bdter TYPE bdter, " Req Date

menge TYPE menge_d, " Quantity

kostl TYPE kostl, " Cost Center

aufnr TYPE aufnr, " Order Number

END OF s_rep.

  • User Dept Details

TYPES: BEGIN OF s_dept,

pernr TYPE persno, " Personal No

usrid TYPE sysid, " User ID

orgeh TYPE orgeh, " Orgn Unit

orgtx TYPE orgtx, " Dept Name

END OF s_dept.

  • For Send Mail Purpose

DATA : i_doc_data LIKE sodocchgi1.

DATA : BEGIN OF i_pack_list OCCURS 0.

INCLUDE STRUCTURE sopcklsti1.

DATA : END OF i_pack_list.

DATA : BEGIN OF i_receivers OCCURS 0.

INCLUDE STRUCTURE somlreci1.

DATA : END OF i_receivers.

DATA : BEGIN OF i_contents OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA : END OF i_contents.

DATA : BEGIN OF i_header OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA : END OF i_header.

DATA : BEGIN OF i_att OCCURS 0.

INCLUDE STRUCTURE solisti1.

DATA : END OF i_att.

  • Internal table for bdcdata

DATA : it_bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.

  • Internal table to handle messages

DATA : it_messages LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.

************************************************************************

  • D A T A D E C L A R A T I O N S

************************************************************************

DATA: gv_lines TYPE sy-index, " Total Lines int Table

gv_days TYPE i, " Difference Days

gv_date TYPE sy-datum, " Date

gv_date1 TYPE sy-datum, " Date

gv_date2 TYPE sy-datum, " Date

gv_text(85), " Text Field

gv_mesg(70), " Error Messages

gv_bdc, " BDC Flag

gv_flag TYPE i, " Flag

gv_ernam TYPE ernam. " User ID

************************************************************************

  • C O N S T A N T S D E C L A R A T I O N S

************************************************************************

CONSTANTS: c_x VALUE 'X', " Flag

c_endda TYPE endda VALUE '99991231'. " Date

************************************************************************

  • I N T E R N A L T A B L E S D E C L A R A T I O N S

************************************************************************

DATA: i_res TYPE STANDARD TABLE OF s_res WITH HEADER LINE, " Reservns

i_dept TYPE STANDARD TABLE OF s_dept WITH HEADER LINE, " Dept

i_rep TYPE STANDARD TABLE OF s_rep WITH HEADER LINE. " Output

************************************************************************

  • S T A R T - O F - S E L E C T I O N *

************************************************************************

START-OF-SELECTION.

  • Fetch main data

PERFORM fetch_data.

  • Process data

PERFORM process_data.

&----


*& Form fetch_data

&----


  • Fetching the Reservations related data from Database Tables

----


FORM fetch_data .

CLEAR: gv_date, gv_date1, gv_date2.

gv_date = sy-datum.

gv_date1 = sy-datum - 10.

gv_date2 = sy-datum + 10.

CLEAR i_res.

REFRESH i_res.

SELECT a~rsnum " Reservation No.

b~rspos " Reservation Item

a~usnam " User Name

a~bwart " Movement Type

a~aufnr " Order Number

b~rsart " Record Type

b~bdart " Reservation Type

b~matnr " Material No

b~bdter " Req Date

INTO TABLE i_res

FROM rkpf AS a JOIN resb AS b

ON arsnum = brsnum

WHERE ( b~bdter BETWEEN gv_date1 AND gv_date2 ) AND

b~xloek EQ ' '.

SORT i_res BY rsnum rspos.

DELETE ADJACENT DUPLICATES FROM i_res COMPARING matnr.

  • Add userid into the i_usr int table

LOOP AT i_res.

i_res-usrid = i_res-usnam.

MODIFY i_res INDEX sy-tabix.

ENDLOOP.

IF NOT i_res[] IS INITIAL.

  • Get the User Dept Name

CLEAR i_dept.

REFRESH i_dept.

SELECT a~pernr " Personal No

a~usrid " User ID

b~orgeh " Orgn Unit

c~orgtx " Dept Name

INTO TABLE i_dept

FROM pa0105 AS a JOIN pa0001 AS b

ON apernr = bpernr JOIN t527x AS c

ON borgeh = corgeh

FOR ALL ENTRIES IN i_res

WHERE a~usrid = i_res-usrid AND

a~endda EQ c_endda AND

b~endda EQ c_endda.

ENDIF.

SORT i_dept BY pernr.

DELETE ADJACENT DUPLICATES FROM i_dept COMPARING pernr.

  • Move the Creator of Reservation to a diff table

LOOP AT i_res.

MOVE-CORRESPONDING i_res TO i_rep.

APPEND i_rep.

CLEAR i_rep.

ENDLOOP.

SORT i_rep BY usnam rsnum rspos.

ENDFORM. " Fetch_Data

&----


*& Form process_data

&----


  • Process the Reservations related data for Expiry Date

----


FORM process_data .

DATA: lv_date1 LIKE sy-datum,

lv_date2 LIKE sy-datum,

lv_date3(10),

lv_menge(13),

lv_tabix LIKE sy-tabix.

LOOP AT i_rep.

CLEAR: gv_days, gv_text, lv_date1, lv_date2,lv_date3.

lv_tabix = sy-tabix.

AT NEW usnam.

  • Populate the Contents Table

CLEAR i_att.

REFRESH i_att.

i_att = 'Reservations Reminder'(014).

APPEND i_att.

i_att = '----


'.

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

READ TABLE i_dept WITH KEY usrid = i_rep-usnam.

CONCATENATE 'Name:'(003) i_rep-usnam 'Dept:'(015) i_dept-orgtx

INTO i_att-line SEPARATED BY space.

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

i_att = 'Please find the List of expiring Reservations'(004).

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

CONCATENATE '--


' '
' '
--


'

'--


' '--


' INTO

i_att-line SEPARATED BY space.

APPEND i_att.

CONCATENATE 'Reservation #'(006) 'Material #'(007) ' Quantity'(002)

'Due Date'(008) 'Work Center/CC'(005) INTO

i_att-line SEPARATED BY space.

APPEND i_att.

CONCATENATE '--


' '
' '
--


'

'--


' '--


' INTO

i_att-line SEPARATED BY space.

APPEND i_att.

i_att-line = ' '.

APPEND i_att.

ENDAT.

gv_days = i_rep-bdter - gv_date.

lv_date1 = i_rep-bdter + 5.

lv_date2 = i_rep-bdter + 10.

MOVE i_rep-menge TO lv_menge.

WRITE i_rep-bdter TO lv_date3.

IF gv_days = 10.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is due for 10 days. Please collect'(009)

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is due for 10 days. Please collect'(009)

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

ENDIF.

IF gv_days = 5.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is due for 5 days. Please collect'(010)

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is due for 5 days. Please collect'(010)

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

ENDIF.

IF gv_date = lv_date1.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is getting cancelled on'(011) lv_date2

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is getting cancelled on'(011) lv_date2

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

ENDIF.

IF gv_date = lv_date2.

IF i_rep-aufnr <> space.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-aufnr 'is being cancelled'(012)

INTO gv_text SEPARATED BY space.

ELSE.

CONCATENATE i_rep-rsnum i_rep-matnr lv_menge lv_date3

i_rep-kostl 'is being cancelled'(012)

INTO gv_text SEPARATED BY space.

ENDIF.

i_att-line = gv_text.

APPEND i_att.

CLEAR i_att.

CLEAR gv_text.

  • Mark the Reservation Item 'DELETED' using BDC.

  • UPDATE resb SET xloek = c_x.

PERFORM delete_item_resb.

ENDIF.

AT END OF usnam.

IF ( gv_days = 10 OR gv_days = 5 OR gv_date = lv_date1 OR

gv_date = lv_date2 ).

  • Read the User who creates the Reservn and send a mail alert to him

CLEAR : i_receivers,gv_ernam.

REFRESH: i_receivers.

READ TABLE i_rep INDEX lv_tabix.

gv_ernam = i_rep-usnam.

IF gv_ernam <> space.

  • Send mail Alert to PR Creator(SAP inbox)

PERFORM send_alert_data.

  • Send Mail to External Mail ID of the SAP USER

PERFORM send_mail_external.

ENDIF.

ENDIF.

ENDAT.

ENDLOOP.

ENDFORM. " Process_data

&----


*& Form delete_item_resb

&----


  • Set the Deletion Indicator for the Res. Item in RESB

----


FORM delete_item_resb.

gv_bdc = 'N'.

  • Perform to fill it_bdcdata.

PERFORM fill_it_bdcdata.

  • Call the Transaction MB22

CALL TRANSACTION 'MB22' USING it_bdcdata MODE 'A' UPDATE 'S'

MESSAGES INTO it_messages.

IF sy-subrc <> 0.

gv_flag = 1.

  • If error occurs in transaction mode run bdc session for that data

PERFORM bdc_process.

ENDIF.

  • Handles error messages

PERFORM error_messages.

CLEAR : it_bdcdata, it_messages.

REFRESH : it_bdcdata, it_messages.

IF gv_bdc = 'O'.

  • close bdc if it is open

PERFORM close_bdc.

ENDIF.

ENDFORM. "delete_item_resb

&----


*& Form FILL_IT_BDCDATA

&----


  • Filling Bdcdata structure with data

----


FORM fill_it_bdcdata.

PERFORM bdc_dynpro USING 'SAPMM07R' '0560'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RM07M-RSPOS'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RM07M-RSNUM'

i_rep-rsnum.

PERFORM bdc_field USING 'RM07M-RSPOS'

i_rep-rspos.

PERFORM bdc_dynpro USING 'SAPMM07R' '0510'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RESB-XLOEK'.

PERFORM bdc_field USING 'BDC_OKCODE'

'/00'.

PERFORM bdc_field USING 'RESB-XLOEK'

c_x.

PERFORM bdc_dynpro USING 'SAPLKACB' '0002'.

PERFORM bdc_field USING 'BDC_CURSOR'

'COBL-KOSTL'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=ENTE'.

PERFORM bdc_dynpro USING 'SAPMM07R' '0510'.

PERFORM bdc_field USING 'BDC_CURSOR'

'RESB-ERFMG'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=BU'.

PERFORM bdc_dynpro USING 'SAPLKACB' '0002'.

PERFORM bdc_field USING 'BDC_CURSOR'

'COBL-KOSTL'.

PERFORM bdc_field USING 'BDC_OKCODE'

'=ENTE'.

ENDFORM. " FILL_IT_BDCDATA

&----


*& Form BDC_DYNPRO

&----


  • Filling the it_bdcdata table with program name & screen number

----


FORM bdc_dynpro USING program LIKE bdcdata-program

dynpro LIKE bdcdata-dynpro.

it_bdcdata-program = program.

it_bdcdata-dynpro = dynpro.

it_bdcdata-dynbegin = 'X'.

APPEND it_bdcdata.

CLEAR it_bdcdata.

ENDFORM. " BDC_DYNPRO

&----


*& Form BDC_FIELD

&----


  • Filling it_bdcdata with field name and field value

----


FORM bdc_field USING fnam LIKE bdcdata-fnam

fval.

it_bdcdata-fnam = fnam.

it_bdcdata-fval = fval.

APPEND it_bdcdata.

CLEAR it_bdcdata.

ENDFORM. " BDC_FIELD

&----


*& Form ERROR_MESSAGES

&----


  • Displaying error messages

----


FORM error_messages.

CALL FUNCTION 'FORMAT_MESSAGE'

EXPORTING

id = sy-msgid

lang = sy-langu

IMPORTING

msg = gv_mesg

EXCEPTIONS

not_found = 1

OTHERS = 2.

LOOP AT it_messages WHERE msgtyp = 'E'.

WRITE : / 'Message :'(001) ,gv_mesg.

CLEAR it_messages.

ENDLOOP.

ENDFORM. " ERROR_MESSAGES

&----


*& Form BDC_PROCESS

&----


  • Open bdc session if call transaction fails

----


FORM bdc_process.

IF gv_bdc = 'N'.

  • open bdc session

PERFORM open_bdc.

gv_bdc = 'O'.

ENDIF.

IF gv_bdc = 'O'.

  • insert data into bdc session

PERFORM insert_bdc.

ENDIF.

ENDFORM. " BDC_PROCESS

&----


*& Form OPEN_BDC

&----


  • Calling function module to open bdc session

----


FORM open_bdc.

CALL FUNCTION 'BDC_OPEN_GROUP'

EXPORTING

client = sy-mandt

group = 'ZMM'

keep = 'X'

user = sy-uname

EXCEPTIONS

client_invalid = 1

destination_invalid = 2

group_invalid = 3

group_is_locked = 4

holddate_invalid = 5

internal_error = 6

queue_error = 7

running = 8

system_lock_error = 9

user_invalid = 10

OTHERS = 11.

ENDFORM. " OPEN_BDC

&----


*& Form INSERT_BDC

&----


  • Insert it_bdcdata into bdc by calling function module bdc_insert

----


FORM insert_bdc.

CALL FUNCTION 'BDC_INSERT'

EXPORTING

tcode = 'MB22'

TABLES

dynprotab = it_bdcdata

EXCEPTIONS

internal_error = 1

not_open = 2

queue_error = 3

tcode_invalid = 4

printing_invalid = 5

posting_invalid = 6

OTHERS = 7.

ENDFORM. " INSERT_BDC

&----


*& Form CLOSE_BDC

&----


  • Closing bdc session

----


FORM close_bdc.

CALL FUNCTION 'BDC_CLOSE_GROUP'

EXCEPTIONS

not_open = 1

queue_error = 2

OTHERS = 3.

ENDFORM. " CLOSE_BDC

&----


*& Form send_alert_data

&----


  • Send Alert for the Expired Contract

----


FORM send_alert_data .

CLEAR: gv_lines,i_receivers, i_header, i_contents,i_doc_data.

REFRESH : i_receivers,i_header,i_contents.

DESCRIBE TABLE i_att LINES gv_lines.

i_receivers-receiver = gv_ernam.

  • i_receivers-receiver = 'SSHEIK'.

i_receivers-rec_type = 'B'.

  • i_receivers-rec_date = sy-datum.

  • i_receivers-express = 'X'.

  • i_receivers-com_type = 'INT'.

  • i_receivers-notif_del = 'X'.

APPEND i_receivers.

i_doc_data-obj_name = 'SAPoffice'(013).

i_doc_data-obj_descr = 'Reservations Reminder'(014).

i_doc_data-obj_langu = 'E'.

i_doc_data-no_change = c_x.

i_doc_data-obj_prio = 1.

i_doc_data-priority = 1.

i_doc_data-doc_size = ( gv_lines - 1 ) * 255 + 135.

i_pack_list-transf_bin = c_x.

i_pack_list-head_start = '1'.

i_pack_list-head_num = '1'.

i_pack_list-body_start = '1'.

i_pack_list-body_num = gv_lines.

i_pack_list-doc_type = 'DOC'.

i_pack_list-obj_name = 'SAPoffice'(013).

i_pack_list-obj_descr = 'Reservations Reminder'(014).

i_pack_list-obj_langu = 'E'.

i_pack_list-doc_size = ( gv_lines - 1 ) * 255 + 135.

APPEND i_pack_list.

  • i_header-line = 'Header'. APPEND i_header.

  • Data for contents

i_contents-line = 'Please find the Reservations Due List'(016).

APPEND i_contents.

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

document_data = i_doc_data

  • PUT_IN_OUTBOX = 'X'

  • IMPORTING

  • SENT_TO_ALL =

  • NEW_OBJECT_ID =

TABLES

packing_list = i_pack_list

object_header = i_header

contents_bin = i_att

contents_txt = i_contents

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 i000 WITH 'Mail Sucessfully sent'(017).

ELSE.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDFORM. " send_alert_data

&----


*& Form send_mail_external

&----


  • Send mail to External MAIL ID of the PR Creator

----


FORM send_mail_external.

DATA : lv_str(24), lv_str1(40),

lv_pernr LIKE adr6-persnumber,

lv_adrnr LIKE adr6-addrnumber,

lv_usrid LIKE pa0105-usrid,

lv_mail LIKE adr6-smtp_addr,

lv_sendor TYPE syuname,

lv_receiver TYPE string,

lv_header TYPE string,

lv_body TYPE string.

CLEAR: lv_pernr, lv_usrid, lv_adrnr,

lv_mail, lv_sendor, lv_receiver,

lv_header, lv_body .

lv_usrid = gv_ernam.

SELECT SINGLE persnumber addrnumber FROM usr21

INTO (lv_pernr,lv_adrnr)

WHERE bname = lv_usrid.

IF sy-subrc = 0.

SELECT SINGLE smtp_addr INTO lv_mail FROM adr6

WHERE addrnumber = lv_adrnr AND

persnumber = lv_pernr.

IF sy-subrc <> 0.

CONCATENATE lv_usrid '@anc.com' INTO lv_mail.

lv_receiver = lv_mail.

ELSE.

lv_receiver = lv_mail.

ENDIF.

  • lv_receiver = 'avangala@anc.com'.

lv_sendor = 'JALKHATAM'.

lv_header = 'Reservations Reminder'(014).

lv_str = 'Pls check your SAP Inbox'(019).

lv_str1 = 'for the status of Reservations Due List'(020).

CONCATENATE lv_str lv_str1 INTO lv_body

SEPARATED BY space.

  • Call Function Module To send mail

CALL FUNCTION 'UWSP_SEND_MAIL_TO_WEB'

EXPORTING

id_header = lv_header

id_body = lv_body

id_receiver = lv_receiver

id_sender = lv_sendor

  • ID_HTML_MAIL =

id_commit_work = 'X'

EXCEPTIONS

error = 1

OTHERS = 2.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

ENDIF.

ENDFORM. " send_mail_external

<b>Reward points for useful Answers</b>

Regards

Anji

Former Member
0 Kudos
58

Former Member
0 Kudos
58

Hi,

look at function modules SO_NEW_DOCUMENT_SEND_API1 and SO_NEW_DOCUMENT_ATT_SEND_API1.

Check this thread:

<b>Reward points</b>

Regards