Application Development and Automation 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: 
Read only

program

Former Member
0 Likes
741

Hi All,

In the below code where should I give the file name. ex : my file name is test.txt/.doc file present in d:\pavan\test.txt.

Please let me know if there is any modification to be done.

&----


*& Report ZSPOOLTOPDF2 *

*& *

&----


*& Converts spool request into PDF document and emails it to *

*& recipicant. *

*& *

*& Execution *

*& -


*

*& This program can be run in background or online and a spool request *

*& will still be created *

&----


REPORT zspooltopdf2.

PARAMETER: p_email1 LIKE somlreci1-receiver

DEFAULT 'abap@sapdev.co.uk',

p_sender LIKE somlreci1-receiver

DEFAULT 'abap@sapdev.co.uk',

p_delspl AS CHECKBOX,

p_online no-display.

*DATA DECLARATION

DATA: gd_recsize TYPE i.

  • Spool IDs

TYPES: BEGIN OF t_tbtcp.

INCLUDE STRUCTURE tbtcp.

TYPES: END OF t_tbtcp.

DATA: it_tbtcp TYPE STANDARD TABLE OF t_tbtcp INITIAL SIZE 0,

wa_tbtcp TYPE t_tbtcp.

  • Job Runtime Parameters

DATA: gd_eventid LIKE tbtcm-eventid,

gd_eventparm LIKE tbtcm-eventparm,

gd_external_program_active LIKE tbtcm-xpgactive,

gd_jobcount LIKE tbtcm-jobcount,

gd_jobname LIKE tbtcm-jobname,

gd_stepcount LIKE tbtcm-stepcount,

gd_error TYPE sy-subrc,

gd_reciever TYPE sy-subrc.

DATA: w_recsize TYPE i,

w_spool_nr like sy-spono.

  • %_print LIKE pri_params.

DATA: gd_subject LIKE sodocchgi1-obj_descr,

it_mess_bod LIKE solisti1 OCCURS 0 WITH HEADER LINE,

it_mess_att LIKE solisti1 OCCURS 0 WITH HEADER LINE,

gd_sender_type LIKE soextreci1-adr_typ,

gd_attachment_desc TYPE so_obj_nam,

gd_attachment_name TYPE so_obj_des.

  • Spool to PDF conversions

DATA: gd_spool_nr LIKE tsp01-rqident,

gd_destination LIKE rlgrap-filename,

gd_bytecount LIKE tst01-dsize,

gd_buffer TYPE string.

  • Binary store for PDF

DATA: BEGIN OF it_pdf_output OCCURS 0.

INCLUDE STRUCTURE tline.

DATA: END OF it_pdf_output.

CONSTANTS: c_dev LIKE sy-sysid VALUE 'DEV',

c_no(1) TYPE c VALUE ' ',

c_device(4) TYPE c VALUE 'LOCL'.

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

*START-OF-SELECTION.

START-OF-SELECTION.

  • Write statement to represent report output. Spool request is created

  • if write statement is executed in background. This could also be an

  • ALV grid which would be converted to PDF without any extra effort

WRITE 'Hello World'.

new-page.

commit work.

new-page print off.

If p_online = 'X'.

  • Processing performed when program calls itself when run online

gd_spool_nr = sy-spono.

EXPORT gd_spool_nr TO MEMORY ID 'SPOOLTOPDF'.

EXIT.

endif.

IF sy-batch EQ 'X'.

PERFORM get_job_details.

PERFORM obtain_spool_id.

ELSE.

gd_spool_nr = sy-spono.

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

  • If executed online, it submits a program to perform the write statements

  • instructing it to create a spool request, this could be another program

  • which just performs the write statements and then exports sy-spono

  • to memory. But in this example it calls itself passing X to parameter

  • p_online, which takes it down an alternative procesing path.

submit ZSPOOLTOPDF2

with p_online = 'X'

to sap-spool

spool parameters %_print

  • archive parameters %_print

without spool dynpro

and return.

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

ENDIF.

  • Get spool id from program called above

IMPORT gd_spool_nr FROM MEMORY ID 'SPOOLTOPDF'.

PERFORM convert_spool_to_pdf.

PERFORM process_email.

if p_delspl EQ 'X'.

PERFORM delete_spool.

endif.

IF sy-sysid = c_dev.

wait up to 5 seconds.

SUBMIT rsconn01 WITH mode = 'INT'

WITH output = 'X'

AND RETURN.

ENDIF.

----


  • FORM obtain_spool_id *

----


FORM obtain_spool_id.

CHECK NOT ( gd_jobname IS INITIAL ).

CHECK NOT ( gd_jobcount IS INITIAL ).

SELECT * FROM tbtcp

INTO TABLE it_tbtcp

WHERE jobname = gd_jobname

AND jobcount = gd_jobcount

AND stepcount = gd_stepcount

AND listident <> '0000000000'

ORDER BY jobname

jobcount

stepcount.

READ TABLE it_tbtcp INTO wa_tbtcp INDEX 1.

IF sy-subrc = 0.

message s004(zdd) with gd_spool_nr.

gd_spool_nr = wa_tbtcp-listident.

MESSAGE s004(zdd) WITH gd_spool_nr.

ELSE.

MESSAGE s005(zdd).

ENDIF.

ENDFORM.

----


  • FORM get_job_details *

----


FORM get_job_details.

  • Get current job details

CALL FUNCTION 'GET_JOB_RUNTIME_INFO'

IMPORTING

eventid = gd_eventid

eventparm = gd_eventparm

external_program_active = gd_external_program_active

jobcount = gd_jobcount

jobname = gd_jobname

stepcount = gd_stepcount

EXCEPTIONS

no_runtime_info = 1

OTHERS = 2.

ENDFORM.

----


  • FORM convert_spool_to_pdf *

----


FORM convert_spool_to_pdf.

CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'

EXPORTING

src_spoolid = gd_spool_nr

no_dialog = c_no

dst_device = c_device

IMPORTING

pdf_bytecount = gd_bytecount

TABLES

pdf = it_pdf_output

EXCEPTIONS

err_no_abap_spooljob = 1

err_no_spooljob = 2

err_no_permission = 3

err_conv_not_possible = 4

err_bad_destdevice = 5

user_cancelled = 6

err_spoolerror = 7

err_temseerror = 8

err_btcjob_open_failed = 9

err_btcjob_submit_failed = 10

err_btcjob_close_failed = 11

OTHERS = 12.

CHECK sy-subrc = 0.

  • Transfer the 132-long strings to 255-long strings

LOOP AT it_pdf_output.

TRANSLATE it_pdf_output USING ' ~'.

CONCATENATE gd_buffer it_pdf_output INTO gd_buffer.

ENDLOOP.

TRANSLATE gd_buffer USING '~ '.

DO.

it_mess_att = gd_buffer.

APPEND it_mess_att.

SHIFT gd_buffer LEFT BY 255 PLACES.

IF gd_buffer IS INITIAL.

EXIT.

ENDIF.

ENDDO.

ENDFORM.

----


  • FORM process_email *

----


FORM process_email.

DESCRIBE TABLE it_mess_att LINES gd_recsize.

CHECK gd_recsize > 0.

PERFORM send_email USING p_email1.

  • perform send_email using p_email2.

ENDFORM.

----


  • FORM send_email *

----


  • --> p_email *

----


FORM send_email USING p_email.

CHECK NOT ( p_email IS INITIAL ).

REFRESH it_mess_bod.

  • Default subject matter

gd_subject = 'Subject'.

gd_attachment_desc = 'Attachname'.

  • CONCATENATE 'attach_name' ' ' INTO gd_attachment_name.

it_mess_bod = 'Message Body text, line 1'.

APPEND it_mess_bod.

it_mess_bod = 'Message Body text, line 2...'.

APPEND it_mess_bod.

  • If no sender specified - default blank

IF p_sender EQ space.

gd_sender_type = space.

ELSE.

gd_sender_type = 'INT'.

ENDIF.

  • Send file by email as .xls speadsheet

PERFORM send_file_as_email_attachment

tables it_mess_bod

it_mess_att

using p_email

'Example .xls documnet attachment'

'PDF'

gd_attachment_name

gd_attachment_desc

p_sender

gd_sender_type

changing gd_error

gd_reciever.

ENDFORM.

----


  • FORM delete_spool *

----


FORM delete_spool.

DATA: ld_spool_nr TYPE tsp01_sp0r-rqid_char.

ld_spool_nr = gd_spool_nr.

CHECK p_delspl <> c_no.

CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ'

EXPORTING

spoolid = ld_spool_nr.

ENDFORM.

&----


*& Form SEND_FILE_AS_EMAIL_ATTACHMENT

&----


  • Send email

----


FORM send_file_as_email_attachment tables it_message

it_attach

using p_email

p_mtitle

p_format

p_filename

p_attdescription

p_sender_address

p_sender_addres_type

changing p_error

p_reciever.

DATA: ld_error TYPE sy-subrc,

ld_reciever TYPE sy-subrc,

ld_mtitle LIKE sodocchgi1-obj_descr,

ld_email LIKE somlreci1-receiver,

ld_format TYPE so_obj_tp ,

ld_attdescription TYPE so_obj_nam ,

ld_attfilename TYPE so_obj_des ,

ld_sender_address LIKE soextreci1-receiver,

ld_sender_address_type LIKE soextreci1-adr_typ,

ld_receiver LIKE sy-subrc.

data: t_packing_list like sopcklsti1 occurs 0 with header line,

t_contents like solisti1 occurs 0 with header line,

t_receivers like somlreci1 occurs 0 with header line,

t_attachment like solisti1 occurs 0 with header line,

t_object_header like solisti1 occurs 0 with header line,

w_cnt type i,

w_sent_all(1) type c,

w_doc_data like sodocchgi1.

ld_email = p_email.

ld_mtitle = p_mtitle.

ld_format = p_format.

ld_attdescription = p_attdescription.

ld_attfilename = p_filename.

ld_sender_address = p_sender_address.

ld_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 = ld_mtitle .

w_doc_data-sensitivty = 'F'.

  • Fill the document data and get size of attachment

CLEAR w_doc_data.

READ TABLE it_attach INDEX w_cnt.

w_doc_data-doc_size =

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

w_doc_data-obj_langu = sy-langu.

w_doc_data-obj_name = 'SAPRPT'.

w_doc_data-obj_descr = ld_mtitle.

w_doc_data-sensitivty = 'F'.

CLEAR t_attachment.

REFRESH t_attachment.

t_attachment[] = it_attach[].

  • Describe the body of the message

CLEAR t_packing_list.

REFRESH t_packing_list.

t_packing_list-transf_bin = space.

t_packing_list-head_start = 1.

t_packing_list-head_num = 0.

t_packing_list-body_start = 1.

DESCRIBE TABLE it_message LINES t_packing_list-body_num.

t_packing_list-doc_type = 'RAW'.

APPEND t_packing_list.

  • Create attachment notification

t_packing_list-transf_bin = 'X'.

t_packing_list-head_start = 1.

t_packing_list-head_num = 1.

t_packing_list-body_start = 1.

DESCRIBE TABLE t_attachment LINES t_packing_list-body_num.

t_packing_list-doc_type = ld_format.

t_packing_list-obj_descr = ld_attdescription.

t_packing_list-obj_name = ld_attfilename.

t_packing_list-doc_size = t_packing_list-body_num * 255.

APPEND t_packing_list.

  • Add the recipients email address

CLEAR t_receivers.

REFRESH t_receivers.

t_receivers-receiver = ld_email.

t_receivers-rec_type = 'U'.

t_receivers-com_type = 'INT'.

t_receivers-notif_del = 'X'.

t_receivers-notif_ndel = 'X'.

APPEND t_receivers.

CALL FUNCTION 'SO_DOCUMENT_SEND_API1'

EXPORTING

document_data = w_doc_data

put_in_outbox = 'X'

sender_address = ld_sender_address

sender_address_type = ld_sender_address_type

commit_work = 'X'

IMPORTING

sent_to_all = w_sent_all

TABLES

packing_list = t_packing_list

contents_bin = t_attachment

contents_txt = it_message

receivers = t_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

ld_error = sy-subrc.

  • Populate zreceiver return code

LOOP AT t_receivers.

ld_receiver = t_receivers-retrn_code.

ENDLOOP.

ENDFORM.

Awaiting for your reply.

Thanks,

Pavan.

4 REPLIES 4
Read only

Former Member
0 Likes
628

hi pavan

I think , you have pass filename to t_object_header .

here is the sample code for Email.

TYPE-POOLS: SLIS.

----


  • INTERNAL TABLES

----


  • Internal table to hold Customer data.

DATA: BEGIN OF TB_BSID OCCURS 0,

BUKRS LIKE BSID-BUKRS, " Company code

KUNNR LIKE BSID-KUNNR, " Customer number

AUGDT LIKE BSID-AUGDT, " Clearing Date

BLDAT LIKE BSID-BLDAT, " Doc date in document

SHKZG LIKE BSID-SHKZG, " Debit/credit indicator

DMBTR LIKE BSID-DMBTR, " Amount in local currency

ZFBDT LIKE BSID-ZFBDT, " Baseline date for due date calc

ZBD1T LIKE BSID-ZBD1T, " Cash discount days 1

ZBD2T LIKE BSID-ZBD2T, " Cash discount days 2

ZBD3T LIKE BSID-ZBD3T, " Net Payment Terms Period

REBZG LIKE BSID-REBZG, " No Of the Inv the Tran Belongs to

REBZT LIKE BSID-REBZT, " Follow-On Document Type

END OF TB_BSID.

  • Internal table to hold Open Items.

DATA: TB_BSID_OPEN LIKE TABLE OF TB_BSID WITH HEADER LINE.

  • Internal table to hold Cleared Items.

DATA: TB_BSAD_CLEAR LIKE TABLE OF TB_BSID WITH HEADER LINE.

  • Internal table to hold General Data in Customer Master

DATA: BEGIN OF TB_KNA1 OCCURS 0,

KUNNR LIKE KNA1-KUNNR, " Customer Number

ADRNR LIKE KNA1-ADRNR, " Address

END OF TB_KNA1.

  • Internal table to hold Customer Master (Company Code)

DATA: BEGIN OF TB_KNB1 OCCURS 0,

KUNNR LIKE KNB1-KUNNR, " Customer Number

BUKRS LIKE KNB1-BUKRS, " Company code

ERDAT LIKE KNB1-ERDAT, " Rec Created Date

ZAMIB LIKE KNB1-ZAMIB, " DMS Managed Indicator

END OF TB_KNB1.

  • Internal table to hold Final Output Data

DATA: BEGIN OF TB_FINAL OCCURS 0,

KUNNR LIKE KNA1-KUNNR, " Customer Number

NAME1 LIKE KNA1-NAME1, " Name Line 1

ADDRESS1(25) TYPE C, " Address line 1

ADDRESS2(25) TYPE C, " Address line 2

ADDRESS3(25) TYPE C, " Address line 3

ADDRESS4(25) TYPE C, " Address line 4

PHONE LIKE KNA1-TELF1, " Telephone Number

DAYS_SLOW(6) TYPE C, " Days Slow

LAST_DATE LIKE BSID-BLDAT, " Date of Last Invoice

AVG(6) TYPE C, " Average Days to Pay

CURRENT LIKE RF035-SNFAE," Current

AVG_1_30 LIKE RF035-SFAE1," 1-30 past due

AVG_31_60 LIKE RF035-SFAE2," 31-60 past due

AVG_61_90 LIKE RF035-SFAE3," 61-90 past due

AVG_90G LIKE RF035-SFAE4," 90+ past due

END OF TB_FINAL.

  • ALV Internal tables

DATA : TB_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV. " Field Catalog

  • Internal tables for the sending mail data

DATA: TB_OBJPACK TYPE SOPCKLSTI1 OCCURS 2 WITH HEADER LINE,

TB_OBJHEAD TYPE SOLISTI1 OCCURS 1 WITH HEADER LINE,

TB_OBJTXT TYPE SOLISTI1 OCCURS 10 WITH HEADER LINE,

TB_RECLIST TYPE SOMLRECI1 OCCURS 5 WITH HEADER LINE,

TB_OBJBIN LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,

TB_DOC_CHNG TYPE SODOCCHGI1.

  • Internal table to get mail Receivers Address

DATA: TB_ZRECEIVE LIKE YSMTP_ADDRESS OCCURS 0 WITH HEADER LINE.

----


  • STRUCTURES

----


DATA: X_SADR TYPE SADR, " For Address

X_FIELDCAT TYPE SLIS_FIELDCAT_ALV, " For Field Catalog

X_LAYOUT TYPE SLIS_LAYOUT_ALV, " For Layout

X_ADDR1_SEL LIKE ADDR1_SEL, " For Address

WA_FAEDE TYPE FAEDE. " For FAEDE struct

----


  • VARIABLES

----


DATA: G_REPID LIKE SY-REPID, " Prog ID

G_DAYS_SLOW(4) TYPE N, " Days Slow

G_OPEN TYPE I, " Counter

G_AVG(4) TYPE N, " Avg Days

G_COUNT(10) TYPE N, " Counter

G_TEXT TYPE SOLISTI1-LINE, " Description

G_TAB_LINES TYPE SY-TABIX, " Internal data count

G_REC_COUNT(10) TYPE N, " Total records

G_CURR_BAL(10) TYPE N, " Account balance

G_FILE_NAME LIKE EDI_PATH-PTHNAM, " Output File Name

G_BUKRS LIKE BSID-BUKRS, " Company Code

G_BLDAT LIKE BSID-BLDAT, " Doc Date

G_FLAG TYPE C, " Flag to Exit

G_KUNNR LIKE BSID-KUNNR, " Cust No

G_ZUONR LIKE BSID-ZUONR. " Assignment

----


  • CONSTANTS

----


CONSTANTS: C_D TYPE C VALUE 'D', " Account type

C_X(1) VALUE 'X', " Default value 'X'

C_1(2) TYPE C VALUE '01', " Posting key const

C_DELIMETER TYPE X VALUE '09', " ASCII CODE LINE begin

C_INTERFACE TYPE YWFSALOFFICNOTIF-INTERFACE_ID VALUE 'AP',

C_Z001 TYPE RF035-RASID VALUE 'Z001'." Net 30/60/90/120/150

----


  • SELECTION SCREEN.

----


  • Selection Screen for Selection Criteria.

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-T01.

SELECT-OPTIONS: S_BUKRS FOR G_BUKRS OBLIGATORY, " Company Code

S_BLDAT FOR G_BLDAT OBLIGATORY, " Doc Date

S_KUNNR FOR G_KUNNR, " Cust No

S_ZUONR FOR G_ZUONR. " Assignment

PARAMETERS: P_GRACE(2) TYPE N OBLIGATORY, " Grace Days

P_ZAMIB LIKE KNB1-ZAMIB AS CHECKBOX. " DMS Indicator

SELECTION-SCREEN END OF BLOCK B1.

  • Selection Screen for Output Options.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-T02.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN POSITION 01.

PARAMETERS: P_REPORT RADIOBUTTON GROUP R1. " Report Only

SELECTION-SCREEN COMMENT 5(25) TEXT-016.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN POSITION 01.

PARAMETERS: P_DOWN RADIOBUTTON GROUP R1. " Dwnld to Unix

SELECTION-SCREEN COMMENT 5(25) TEXT-017.

SELECTION-SCREEN POSITION 30.

PARAMETERS: P_FILE LIKE FILENAME-FILEINTERN DEFAULT

'Z21614_DB_CREDIT_AGENCY'. " File Name

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK B2.

  • Selection Screen for E-mail.

SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME TITLE TEXT-T03.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN POSITION 01.

PARAMETERS: P_EMAIL AS CHECKBOX. " E-mail

SELECTION-SCREEN COMMENT 5(25) TEXT-018.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK B3.

----


  • INITIALIZATION

----


INITIALIZATION.

G_REPID = SY-REPID.

----


  • AT SELECTION SCREEN. *

----


AT SELECTION-SCREEN.

  • Validation of selection screen entries

perform validate_data.

  • If both display report and send email is checked

IF P_REPORT = C_X AND P_EMAIL = C_X.

MESSAGE E999 WITH

'Select One Among Report Only & Send E-mail'(023).

ENDIF.

----


  • START-OF-SELECTION

----


START-OF-SELECTION.

  • Preparing file for download to Unix

PERFORM GET_FILE.

  • If File Error, then err out and exit the program

if g_flag = 'X'.

EXIT.

endif.

  • Select Data from Customer Master (Company Code)

PERFORM SELECT_KNB1.

  • Select Custmer Open Items.

PERFORM SELECT_CUSTOMER_OPEN_ITEMS.

  • Select Custmer Cleared Items.

PERFORM SELECT_CUSTOMER_CLEARED_ITEMS.

  • Select General Data in Customer Master

PERFORM SELECT_KNA1.

  • Populate Final Output Data.

PERFORM POPULATE_TB_FINAL.

----


  • End of selection *

----


END-OF-SELECTION.

  • If there are no records in TB_FINAL internal table

IF TB_FINAL[] IS INITIAL.

MESSAGE I999 WITH

'No Records Found For Selection Criteria'(024).

EXIT.

ELSE.

  • When Radiobutton for Email or if the program is run background

IF ( P_EMAIL = C_X OR SY-BATCH = C_X ).

  • To send the mail

PERFORM SEND_MAIL USING C_INTERFACE.

ELSEIF P_REPORT = C_X .

  • To display the Final Output data using ALV's

PERFORM DISPLAY_ALV_REPORT.

ENDIF.

  • Transfering data to file when downloading to Unix

IF P_DOWN = C_X.

IF NOT G_FILE_NAME IS INITIAL.

  • Trasefering data to file

PERFORM TRANSFER_DATA_FILE.

  • Interface Audit report

PERFORM WRITE_REPORT.

ENDIF.

ENDIF.

ENDIF.

----


  • F O R M S

----


&----


*& Form VALIDATE_DATA

&----


  • Validating selection-screen entries

----


FORM VALIDATE_DATA.

  • Validate the Company code.

CLEAR G_BUKRS.

SELECT SINGLE BUKRS

INTO G_BUKRS

FROM T001

WHERE BUKRS IN S_BUKRS.

IF SY-SUBRC <> 0.

MESSAGE E999 WITH 'Enter valid Company Code'(025).

ENDIF.

  • Validate the Customer number

CLEAR G_KUNNR.

IF NOT S_KUNNR[] IS INITIAL.

SELECT SINGLE KUNNR

INTO G_KUNNR

FROM KNA1

WHERE KUNNR IN S_KUNNR.

IF SY-SUBRC <> 0.

MESSAGE E999 WITH 'Enter valid Customer Number'(026).

ENDIF.

ENDIF.

ENDFORM. " VALIDATE_DATA

&----


*& Form GET_FILE

&----


  • Preparing file to download to Unix

----


FORM GET_FILE.

  • If file path is empty an error is given at the selection screen

IF P_DOWN = 'X' AND P_FILE = ''.

MESSAGE I999 WITH

'Enter The File Path To Download the Data'(027).

g_flag = 'X'.

EXIT.

ENDIF.

  • Assign the Physical File Name Using a Logical File Name

IF P_DOWN = 'X'.

PERFORM POPULATE_FILE_PATH_SERVER.

ENDIF.

ENDFORM.

&----


*& Form POPULATE_FILE_PATH_SERVER

&----


  • Assign the Physical File Name Using a Logical File Name

----


FORM POPULATE_FILE_PATH_SERVER.

CALL FUNCTION 'FILE_GET_NAME'

EXPORTING

LOGICAL_FILENAME = P_FILE

IMPORTING

FILE_NAME = G_FILE_NAME

EXCEPTIONS

FILE_NOT_FOUND = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

MESSAGE I999 WITH 'File not found for the logical path'(028).

g_flag = 'X'.

EXIT.

ENDIF.

ENDFORM. " POPULATE_FILE_PATH_SERVER

&----


*& Form SELECT_KNB1

&----


  • Select Data from Customer Master (Company Code)

----


FORM SELECT_KNB1 .

CLEAR: TB_KNB1,

TB_KNB1[].

SELECT KUNNR

BUKRS

ERDAT

ZAMIB

FROM KNB1

INTO TABLE TB_KNB1

WHERE BUKRS IN S_BUKRS

AND KUNNR IN S_KUNNR.

IF SY-SUBRC = 0.

  • Sort TB_KNB1 by Customer no & Rec Created Date

SORT TB_KNB1 BY KUNNR ERDAT DESCENDING.

ENDIF.

ENDFORM. " SELECT_KNB1

&----


*& Form SELECT_CUSTOMER_OPEN_ITEMS

&----


  • Select Custmer Open Items.

----


FORM SELECT_CUSTOMER_OPEN_ITEMS .

CLEAR: TB_BSID,

TB_BSID[].

SELECT A~BUKRS

B~KUNNR

B~AUGDT

B~BLDAT

B~SHKZG

B~DMBTR

B~ZFBDT

B~ZBD1T

B~ZBD2T

B~ZBD3T

B~REBZG

B~REBZT

INTO TABLE TB_BSID

FROM BKPF AS A JOIN BSID AS B

ON ABUKRS = BBUKRS

AND ABELNR = BBELNR

AND AGJAHR = BGJAHR

WHERE A~BUKRS IN S_BUKRS

AND A~BLDAT IN S_BLDAT

AND B~KUNNR IN S_KUNNR

AND B~ZUONR IN S_ZUONR

AND B~BSCHL = C_1.

IF SY-SUBRC = 0.

  • DMS Managed Indicator = ‘X’.

IF P_ZAMIB = C_X.

LOOP AT TB_KNB1 WHERE ZAMIB = SPACE.

DELETE TB_BSID WHERE BUKRS = TB_KNB1-BUKRS

AND KUNNR = TB_KNB1-KUNNR.

ENDLOOP.

ENDIF.

  • Transfering Open Items from TB_BSID to TB_BSID_OPEN

TB_BSID_OPEN[] = TB_BSID[].

ENDIF.

ENDFORM. " SELECT_CUSTOMER_OPEN_ITEMS

&----


*& Form SELECT_CUSTOMER_CLEARED_ITEMS

&----


  • Select Custmer Cleared Items.

----


FORM SELECT_CUSTOMER_CLEARED_ITEMS .

CLEAR: TB_BSAD_CLEAR,

TB_BSAD_CLEAR[].

SELECT A~BUKRS

B~KUNNR

B~AUGDT

B~BLDAT

B~SHKZG

B~DMBTR

B~ZFBDT

B~ZBD1T

B~ZBD2T

B~ZBD3T

B~REBZG

B~REBZT

INTO TABLE TB_BSAD_CLEAR

FROM BKPF AS A JOIN BSAD AS B

ON ABUKRS = BBUKRS

AND ABELNR = BBELNR

AND AGJAHR = BGJAHR

WHERE A~BUKRS IN S_BUKRS

AND A~BLDAT IN S_BLDAT

AND B~KUNNR IN S_KUNNR

AND B~ZUONR IN S_ZUONR

AND B~BSCHL = C_1.

IF SY-SUBRC = 0.

  • DMS Managed Indicator = ‘X’.

IF P_ZAMIB = C_X.

LOOP AT TB_KNB1 WHERE ZAMIB = SPACE.

DELETE TB_BSID WHERE BUKRS = TB_KNB1-BUKRS

AND KUNNR = TB_KNB1-KUNNR.

ENDLOOP.

ENDIF.

  • Sort TB_BSID_CLEAR by Customer number

SORT TB_BSAD_CLEAR BY KUNNR.

ENDIF.

  • Append lines of TB_BSID_CLEAR to table TB_BSID

APPEND LINES OF TB_BSAD_CLEAR TO TB_BSID.

  • Sort TB_BSID by Cust num AND Doc date in document

SORT TB_BSID BY KUNNR BLDAT DESCENDING.

ENDFORM. " SELECT_CUSTOMER_CLEARED_ITEMS

&----


*& Form SELECT_KNA1

&----


  • Select General Data in Customer Master

----


FORM SELECT_KNA1.

CLEAR: TB_KNA1,

TB_KNA1[].

IF NOT TB_BSID[] IS INITIAL.

select kunnr

adrnr

from kna1

into table tb_kna1

FOR ALL ENTRIES IN TB_BSID

where KUNNR = TB_BSID-KUNNR AND

kunnr in s_kunnr.

ENDIF.

ENDFORM. " SELECT_KNA1

&----


*& Form POPULATE_TB_FINAL

&----


  • Populate Final Output Data.

----


FORM POPULATE_TB_FINAL.

  • Local variable

DATA: L_DAYS_SLOW(4) TYPE N, " Days Slow

L_DAYS_SLOW_TEMP TYPE P DECIMALS 3. " Days Slow

CLEAR: TB_FINAL,

TB_FINAL[].

LOOP AT TB_KNA1.

TB_FINAL-KUNNR = TB_KNA1-KUNNR. " Customer Number

  • To get Customer Address.

PERFORM GET_CUSTOMER_ADDRESS.

  • To get Date of Last Invoice.

CLEAR TB_BSID.

READ TABLE TB_BSID WITH KEY KUNNR = TB_KNA1-KUNNR.

IF SY-SUBRC = 0.

TB_FINAL-LAST_DATE = TB_BSID-BLDAT.

ENDIF.

  • To get past due and current details.

PERFORM GET_PAST_DUE_CURRENT.

  • To get Days Slow.

CLEAR WA_FAEDE .

LOOP AT TB_BSID_OPEN WHERE KUNNR = TB_KNA1-KUNNR.

WA_FAEDE-SHKZG = TB_BSID-SHKZG.

WA_FAEDE-ZFBDT = TB_BSID-ZFBDT.

WA_FAEDE-ZBD1T = TB_BSID-ZBD1T.

WA_FAEDE-ZBD2T = TB_BSID-ZBD2T.

WA_FAEDE-ZBD3T = TB_BSID-ZBD3T.

WA_FAEDE-REBZG = TB_BSID-REBZG.

WA_FAEDE-REBZT = TB_BSID-REBZT.

WA_FAEDE-KOART = C_D.

  • To Determine Due Date.

CALL FUNCTION 'DETERMINE_DUE_DATE'

EXPORTING

I_FAEDE = WA_FAEDE

IMPORTING

E_FAEDE = WA_FAEDE

EXCEPTIONS

ACCOUNT_TYPE_NOT_SUPPORTED = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

CLEAR WA_FAEDE.

ENDIF.

CLEAR: L_DAYS_SLOW.

L_DAYS_SLOW = SY-DATUM - WA_FAEDE-NETDT - P_GRACE.

G_DAYS_SLOW = G_DAYS_SLOW + ABS( L_DAYS_SLOW ).

G_OPEN = G_OPEN + 1.

ENDLOOP.

CLEAR L_DAYS_SLOW_TEMP.

IF NOT G_OPEN IS INITIAL.

L_DAYS_SLOW_TEMP = G_DAYS_SLOW / G_OPEN.

  • Days Slow.

TB_FINAL-DAYS_SLOW = L_DAYS_SLOW_TEMP.

ENDIF.

  • To get Average days to Pay.

PERFORM GET_AVG_DAYS_PAY.

IF NOT P_REPORT = 'X'.

  • Calculating total records .

G_REC_COUNT = G_REC_COUNT + 1.

ENDIF.

APPEND TB_FINAL.

CLEAR TB_FINAL.

ENDLOOP.

ENDFORM. " POPULATE_TB_FINAL

&----


*& Form GET_PAST_DUE_CURRENT

&----


  • To get past due and current details.

----


FORM GET_PAST_DUE_CURRENT.

  • Local Varaibles.

DATA: L_RF035_SFAE1 TYPE RF035-SFAE1, " Total of Due Items

L_RF035_SFAE2 TYPE RF035-SFAE2, " Total of Due Items (Interval 2)

L_RF035_SFAE3 TYPE RF035-SFAE3, " Total of Due Items (Interval 3)

L_RF035_SFAE4 TYPE RF035-SFAE4, " Total of Due Items (Interval 4)

L_RF035_SFAE5 TYPE RF035-SFAE5, " Total of Due Items (Interval 5)

L_RF035_SFAE6 TYPE RF035-SFAE6, " Total of Due Items (Interval 6)

L_RF035_SNFAE TYPE RF035-SNFAE. " Total of Items not Due

clear G_CURR_BAL.

LOOP AT TB_KNB1 WHERE KUNNR = TB_KNA1-KUNNR.

clear : L_RF035_SFAE1, L_RF035_SFAE2, L_RF035_SFAE3, L_RF035_SFAE4,

L_RF035_SFAE5, L_RF035_SFAE6, L_RF035_SNFAE.

  • For Customer Due Details

CALL FUNCTION 'CUSTOMER_DUE_DATE_ANALYSIS'

EXPORTING

BUKRS = TB_KNB1-BUKRS

KKBER = ' '

KUNNR = TB_KNB1-KUNNR

RASID = C_Z001

IMPORTING

SFAE1 = L_RF035_SFAE1

SFAE2 = L_RF035_SFAE2

SFAE3 = L_RF035_SFAE3

SFAE4 = L_RF035_SFAE4

SFAE5 = L_RF035_SFAE5

SFAE6 = L_RF035_SFAE6

SNFAE = L_RF035_SNFAE

EXCEPTIONS

INVALID_RASTER = 1

NO_OPEN_ITEMS = 2

OTHERS = 3.

IF SY-SUBRC = 0.

  • 1 – 30 past Due

TB_FINAL-AVG_1_30 = TB_FINAL-AVG_1_30 + L_RF035_SFAE1.

  • 31 – 60 past Due

TB_FINAL-AVG_31_60 = TB_FINAL-AVG_31_60 + L_RF035_SFAE2.

  • 61 – 90 past Due.

TB_FINAL-AVG_61_90 = TB_FINAL-AVG_61_90 + L_RF035_SFAE3.

  • 90 + past Due

TB_FINAL-AVG_90G = TB_FINAL-AVG_90G + L_RF035_SFAE4

+ L_RF035_SFAE5

+ L_RF035_SFAE6.

  • Current.

TB_FINAL-CURRENT = TB_FINAL-CURRENT + L_RF035_SNFAE.

IF NOT P_REPORT = 'X'.

  • Current account balance.

G_CURR_BAL = G_CURR_BAL + TB_FINAL-CURRENT +

TB_FINAL-AVG_1_30 +

TB_FINAL-AVG_31_60 +

TB_FINAL-AVG_61_90 +

TB_FINAL-AVG_90G .

ENDIF.

ELSE.

CLEAR: L_RF035_SFAE1,L_RF035_SFAE2,L_RF035_SFAE3,

L_RF035_SFAE4,L_RF035_SFAE5,L_RF035_SFAE6,

L_RF035_SNFAE.

ENDIF.

ENDLOOP.

ENDFORM. " GET_PAST_DUE_CURRENT

&----


*& Form GET_CUSTOMER_ADDRESS

&----


  • To get Customer Address.

----


FORM GET_CUSTOMER_ADDRESS.

CLEAR: X_ADDR1_SEL,

X_SADR.

  • Populate Address to ADDRESS_SELECTION-ADDRNUMBER field

X_ADDR1_SEL-ADDRNUMBER = TB_KNA1-ADRNR.

  • The function module reads all records for the addresses specified

  • in the structure ADDRESS_SELECTION and puts them in the return

  • structures *ADDRESS_VALUE and SADR.

CALL FUNCTION 'ADDR_GET'

EXPORTING

ADDRESS_SELECTION = X_ADDR1_SEL

IMPORTING

SADR = X_SADR

EXCEPTIONS

PARAMETER_ERROR = 1

ADDRESS_NOT_EXIST = 2

VERSION_NOT_EXIST = 3

INTERNAL_ERROR = 4

OTHERS = 5.

IF SY-SUBRC = 0.

  • Name Line 1

TB_FINAL-NAME1 = X_SADR-NAME1.

  • Telephone Number

TB_FINAL-PHONE = X_SADR-TELF1.

  • ADDRESS LINE 1.

TB_FINAL-ADDRESS1 = X_SADR-STRAS.

  • ADDRESS LINE 2.

CONCATENATE X_SADR-PFACH 'CODE' X_SADR-PSTL2 INTO TB_FINAL-ADDRESS2

SEPARATED BY SPACE.

  • ADDRESS LINE 3.

CONCATENATE X_SADR-ORT01 X_SADR-ORT02 ',' X_SADR-REGIO X_SADR-PSTLZ

INTO TB_FINAL-ADDRESS3 SEPARATED BY SPACE.

  • ADDRESS LINE 4.

TB_FINAL-ADDRESS4 = X_SADR-LAND1.

ELSE.

CLEAR: X_ADDR1_SEL,

X_SADR.

ENDIF.

ENDFORM. " GET_CUSTOMER_ADDRESS

&----


*& Form GET_AVG_DAYS_PAY

&----


  • To get Average days to Pay.

----


FORM GET_AVG_DAYS_PAY.

*Local variable

DATA: L_DAYS(4) TYPE N, " Number of Days

L_TEMP TYPE P DECIMALS 3. " Average

LOOP AT TB_BSAD_CLEAR WHERE KUNNR = TB_KNA1-KUNNR.

L_DAYS = TB_BSAD_CLEAR-AUGDT - TB_BSAD_CLEAR-BLDAT.

G_AVG = G_AVG + L_DAYS.

G_COUNT = G_COUNT + 1.

ENDLOOP.

IF NOT G_COUNT IS INITIAL.

  • Average days to Pay.

L_TEMP = G_AVG / G_COUNT.

TB_FINAL-AVG = L_TEMP.

ENDIF.

ENDFORM. " GET_AVG_DAYS_PAY

&----


*& Form DISPLAY_ALV_REPORT

&----


  • To display the Final Output data using ALV's

----


FORM DISPLAY_ALV_REPORT.

  • For Populating Field Catalog.

PERFORM RPT_BUILD_FIELDCATLOG.

  • If the Field catlog failed, then err out and exit the program

if g_flag = 'X'.

EXIT.

endif.

  • For Modifying Field Catalog.

PERFORM RPT_MODIFY_FIELDCATLOG.

  • For Displaying Output in Grid Format.

PERFORM RPT_GRID_DISPLAY.

ENDFORM. " DISPLAY_ALV_REPORT

&----


*& Form RPT_BUILD_FIELDCATLOG

&----


  • For Populating Field Catalog.

----


FORM RPT_BUILD_FIELDCATLOG.

  • Local Variable.

DATA : L_TABNAME TYPE SLIS_TABNAME. " Table Name

L_TABNAME = 'TB_FINAL'.

CLEAR:TB_FIELDCAT,

TB_FIELDCAT[].

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'

EXPORTING

I_PROGRAM_NAME = G_REPID

I_INTERNAL_TABNAME = L_TABNAME

I_INCLNAME = G_REPID

CHANGING

CT_FIELDCAT = TB_FIELDCAT

EXCEPTIONS

INCONSISTENT_INTERFACE = 1

PROGRAM_ERROR = 2

OTHERS = 3.

IF SY-SUBRC <> 0.

MESSAGE I999 WITH 'Error in Populating Fieldcatalog'(036).

g_flag = 'X'.

EXIT.

ENDIF.

ENDFORM. " RPT_BUILD_FIELDCATLOG

&----


*& Form RPT_MODIFY_FIELDCATLOG

&----


  • For Modifying Field Catalog

----


FORM RPT_MODIFY_FIELDCATLOG.

  • Getting the Header Text for the Coloumns

DATA : L_TABIX LIKE SY-TABIX, " Index

L_DDICTXT TYPE C VALUE 'L'. " Flag

  • Getting the Header Text for the Coloumns

LOOP AT TB_FIELDCAT INTO X_FIELDCAT.

CLEAR L_TABIX.

L_TABIX = SY-TABIX.

CASE X_FIELDCAT-FIELDNAME.

  • Customer Number

WHEN 'KUNNR'.

X_FIELDCAT-SELTEXT_L = 'Customer Number'(001).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Name Line 1

WHEN 'NAME1'.

X_FIELDCAT-SELTEXT_L = 'Name'(002).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Address line 1

WHEN 'ADDRESS1'.

X_FIELDCAT-SELTEXT_L = 'Address 1'(003).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Address line 2

WHEN 'ADDRESS2'.

X_FIELDCAT-SELTEXT_L = 'Address 2'(004).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Address line 3

WHEN 'ADDRESS3'.

X_FIELDCAT-SELTEXT_L = 'Address 3'(005).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Address line 4

WHEN 'ADDRESS4'.

X_FIELDCAT-SELTEXT_L = 'Address 4'(006).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Telephone Number

WHEN 'PHONE'.

X_FIELDCAT-SELTEXT_L = 'Telephone Number'(007).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Days Slow

WHEN 'DAYS_SLOW'.

X_FIELDCAT-SELTEXT_L = 'Days Slow'(008).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Date of Last Invoice

WHEN 'LAST_DATE'.

X_FIELDCAT-SELTEXT_L = 'Date of Last Invoice'(009).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Average Days to Pay

WHEN 'AVG'.

X_FIELDCAT-SELTEXT_L = 'Average Days to Pay'(010).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • Current

WHEN 'CURRENT'.

X_FIELDCAT-SELTEXT_L = 'Aging Category 1'(011).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • 1-30 past due

WHEN 'AVG_1_30'.

X_FIELDCAT-SELTEXT_L = 'Aging Category 2'(012).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • 31-60 past due

WHEN 'AVG_31_60'.

X_FIELDCAT-SELTEXT_L = 'Aging Category 3'(013).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • 61-90 past due

WHEN 'AVG_61_90'.

X_FIELDCAT-SELTEXT_L = 'Aging Category 4'(014).

X_FIELDCAT-DDICTXT = L_DDICTXT.

  • 90+ past due

WHEN 'AVG_90G'.

X_FIELDCAT-SELTEXT_L = 'Aging Category 5'(015).

X_FIELDCAT-DDICTXT = L_DDICTXT.

ENDCASE.

MODIFY TB_FIELDCAT FROM X_FIELDCAT INDEX L_TABIX.

ENDLOOP.

ENDFORM. " RPT_MODIFY_FIELDCATLOG

&----


*& Form RPT_GRID_DISPLAY

&----


  • For Displaying Output in Grid Format.

----


FORM RPT_GRID_DISPLAY.

  • Layout Settings

CLEAR X_LAYOUT.

X_LAYOUT-ZEBRA = 'X'.

X_LAYOUT-COLWIDTH_OPTIMIZE = C_X.

X_LAYOUT-NO_COLHEAD = SPACE.

  • To Display the Output in ALV Format

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

I_CALLBACK_PROGRAM = G_REPID

IS_LAYOUT = X_LAYOUT

IT_FIELDCAT = TB_FIELDCAT

I_GRID_TITLE = 'D&B Credit Agency Interface'(019)

TABLES

T_OUTTAB = TB_FINAL

EXCEPTIONS

PROGRAM_ERROR = 1

OTHERS = 2.

IF SY-SUBRC <> 0.

MESSAGE I999 WITH 'Error in displaying ALV Grid'(037).

EXIT.

ENDIF.

ENDFORM. " RPT_GRID_DISPLAY

&----


*& Form TRANSFER_DATA_FILE

&----


  • Download data to Application server

----


FORM TRANSFER_DATA_FILE.

  • Opening file in application server

OPEN DATASET G_FILE_NAME FOR OUTPUT IN TEXT MODE.

IF SY-SUBRC <> 0.

MESSAGE I999 WITH 'Error When Opening File'(034).

EXIT.

ENDIF.

  • Transfer of data to file

LOOP AT TB_FINAL.

TRANSFER TB_FINAL TO G_FILE_NAME.

ENDLOOP.

  • Closing the file in application server

CLOSE DATASET G_FILE_NAME.

IF SY-SUBRC <> 0.

MESSAGE I999 WITH 'No File Found To Close'(035).

EXIT.

ENDIF.

ENDFORM. " TRANSFER_DATA_FILE

&----


*& Form WRITE_REPORT

&----


  • Display data for summary report

----


FORM WRITE_REPORT.

  • Colunm headings for the Report

WRITE :/01(46) SY-ULINE.

FORMAT COLOR 1.

WRITE 😕 SY-VLINE,

02(14) 'Record Count'(021),

16 SY-VLINE,

19(25) 'Current Account Balance'(022),

46 SY-VLINE.

FORMAT COLOR OFF.

  • Displaying the record count and Curr Acc balance

FORMAT COLOR 2.

WRITE 😕 SY-VLINE,

02(14) G_REC_COUNT LEFT-JUSTIFIED,

16 SY-VLINE ,

19(25) G_CURR_BAL ,

46 SY-VLINE.

FORMAT COLOR OFF.

WRITE :/01(46) SY-ULINE.

ENDFORM. " WRITE_REPORT

&----


*& Form SEND_MAIL

&----


  • To Send Mail to The user Attaching The TXT File

----


FORM SEND_MAIL USING P_SENDER TYPE YWFSALOFFICNOTIF-INTERFACE_ID.

  • Populating data to send mail

PERFORM POPULATE_EMAIL_REF_DATA USING G_TEXT.

  • To populate the data to table tb_objbin

PERFORM POP_DATA_OBJBIN.

  • To get the attached file for the mail

CLEAR G_TAB_LINES.

DESCRIBE TABLE TB_OBJBIN LINES G_TAB_LINES.

TB_OBJHEAD = 'TEST.TXT'.

APPEND TB_OBJHEAD.

  • Creation of the entry for the mail(mail contents)

TB_OBJPACK-TRANSF_BIN = C_X.

TB_OBJPACK-HEAD_START = 1.

TB_OBJPACK-HEAD_NUM = 1.

TB_OBJPACK-BODY_START = 1.

TB_OBJPACK-BODY_NUM = G_TAB_LINES.

TB_OBJPACK-DOC_TYPE = 'TXT'.

TB_OBJPACK-OBJ_NAME = SY-REPID.

TB_OBJPACK-OBJ_DESCR = 'Interface Audit Report'(020).

TB_OBJPACK-DOC_SIZE = G_TAB_LINES * 255.

APPEND TB_OBJPACK.

  • Populate the User mail id entered on selection screen

PERFORM MAIL_DETAILS TABLES TB_ZRECEIVE USING P_SENDER.

ENDFORM. " SEND_MAIL

&----


*& Form POPULATE_EMAIL_REF_DATA

&----


  • Populating data to send mail

----


FORM POPULATE_EMAIL_REF_DATA USING TEXT TYPE SOLISTI1-LINE.

  • File

TB_DOC_CHNG-OBJ_NAME = 'Interface Audit Report'(020).

  • Subject

TB_DOC_CHNG-OBJ_DESCR = 'Interface Audit Report'(020).

TB_OBJTXT = TEXT.

APPEND TB_OBJTXT.

DESCRIBE TABLE TB_OBJTXT LINES G_TAB_LINES.

READ TABLE TB_OBJTXT INDEX G_TAB_LINES.

  • To determine the document size

TB_DOC_CHNG-DOC_SIZE = ( G_TAB_LINES - 1 ) * 255 + STRLEN( TB_OBJTXT )

.

  • Creation of the entry for the Mail Contents

CLEAR TB_OBJPACK-TRANSF_BIN.

TB_OBJPACK-HEAD_START = 1.

TB_OBJPACK-HEAD_NUM = 0.

TB_OBJPACK-BODY_START = 1.

TB_OBJPACK-BODY_NUM = G_TAB_LINES.

TB_OBJPACK-DOC_TYPE = 'RAW'.

APPEND TB_OBJPACK.

ENDFORM. " POPULATE_EMAIL_REF_DATA

&----


*& Form POP_DATA_OBJBIN

&----


  • Send mail Logic

----


FORM POP_DATA_OBJBIN.

  • To set space for Excel

PERFORM EXCEL_SPACE.

  • To set coloumn heading for the Excel

PERFORM EXCEL_HEADING_1.

  • To set space for Excel

PERFORM EXCEL_SPACE.

  • to populate data for the Excel

PERFORM EXCEL_DATA_1.

  • To set space for Excel

PERFORM EXCEL_SPACE.

ENDFORM. " POP_DATA_OBJBIN

&----


*& Form EXCEL_SPACE

&----


  • Setting The space

----


FORM EXCEL_SPACE.

  • To set the space

CONCATENATE SPACE C_DELIMETER INTO TB_OBJBIN-LINE.

APPEND TB_OBJBIN.

CLEAR TB_OBJBIN.

ENDFORM. " EXCEL_SPACE

&----


*& Form EXCEL_HEADING_1

&----


  • Heading For The Mail

----


FORM EXCEL_HEADING_1.

  • To get the Column headings for the attached file in the mail

CONCATENATE

TEXT-021 " Record Count

TEXT-022 " Current Account Balance

INTO TB_OBJBIN-LINE

SEPARATED BY C_DELIMETER.

CONCATENATE TB_OBJBIN-LINE C_DELIMETER INTO

TB_OBJBIN-LINE.

APPEND TB_OBJBIN.

CLEAR TB_OBJBIN.

ENDFORM. " EXCEL_HEADING_1

&----


*& Form EXCEL_DATA_1

&----


  • Data Population To Send Mail

----


FORM EXCEL_DATA_1.

CONDENSE: G_REC_COUNT,G_CURR_BAL.

CONCATENATE G_REC_COUNT C_DELIMETER G_CURR_BAL INTO

TB_OBJBIN-LINE.

APPEND TB_OBJBIN.

CLEAR TB_OBJBIN.

ENDFORM. " EXCEL_DATA_1

&----


*& Form MAIL_DETAILS

&----


  • Mail Receviers

----


FORM MAIL_DETAILS TABLES PI_RECEIVER STRUCTURE YSMTP_ADDRESS

USING P_SENDER TYPE YWFSALOFFICNOTIF-INTERFACE_ID.

  • Table declared for the mail receviers

DATA: TB_ACTOR LIKE SWHACTOR OCCURS 0 WITH HEADER LINE.

  • Sales office

CONSTANTS : C_VKBUR LIKE YWFSALOFFICNOTIF-VKBUR VALUE '0123'.

  • Work Area To Get The Receviers Address

DATA: WA_USERS LIKE YWFSALOFFICNOTIF OCCURS 0 WITH HEADER LINE.

  • To get the user id for the mail recepients

SELECT SINGLE *

INTO WA_USERS

FROM YWFSALOFFICNOTIF

WHERE INTERFACE_ID = P_SENDER

AND VKBUR = C_VKBUR.

  • populating the tb_actor table from wa_users

IF SY-SUBRC = 0.

IF NOT WA_USERS-OBJID01 IS INITIAL AND

NOT WA_USERS-OTYPE01 IS INITIAL.

TB_ACTOR-OTYPE = WA_USERS-OTYPE01.

TB_ACTOR-OBJID = WA_USERS-OBJID01.

APPEND TB_ACTOR.

ENDIF.

IF NOT WA_USERS-OBJID02 IS INITIAL AND

NOT WA_USERS-OTYPE02 IS INITIAL.

TB_ACTOR-OTYPE = WA_USERS-OTYPE02.

TB_ACTOR-OBJID = WA_USERS-OBJID02.

APPEND TB_ACTOR.

ENDIF.

IF NOT WA_USERS-OBJID03 IS INITIAL AND

NOT WA_USERS-OTYPE03 IS INITIAL.

TB_ACTOR-OTYPE = WA_USERS-OTYPE03.

TB_ACTOR-OBJID = WA_USERS-OBJID03.

APPEND TB_ACTOR.

ENDIF.

ENDIF.

  • Get the list of smtp address from the selected objid/otype.

PERFORM GET_ADDRESS TABLES PI_RECEIVER

TB_ACTOR.

  • Create the records in the receiver internal table.

IF NOT TB_ZRECEIVE[] IS INITIAL.

LOOP AT TB_ZRECEIVE.

TB_RECLIST-RECEIVER = TB_ZRECEIVE-SMTP_ADDR.

TB_RECLIST-REC_TYPE = 'U'.

APPEND TB_RECLIST.

CLEAR TB_RECLIST.

ENDLOOP. " receivers

  • used to send the mail along with attached file

PERFORM CALL_FUNCTION_TXT.

ENDIF.

ENDFORM. " MAIL_DETAILS

&----


*& Form GET_ADDRESS

&----


  • Getting The Receviers Address

----


FORM GET_ADDRESS TABLES P_ADDRESS STRUCTURE YSMTP_ADDRESS

P_ACTOR STRUCTURE SWHACTOR.

  • Internal tables and structure to find the address

DATA: TB_RESULT_TAB TYPE TABLE OF SWHACTOR,

TB_LIST_OF_USERS TYPE TABLE OF SWHACTOR,

TB_EPEOPLE_OBJEC TYPE OBJEC OCCURS 0 WITH HEADER LINE,

TB_EPEOPLE_STRUC TYPE TABLE OF STRUC.

DATA: L_ACTOR TYPE SWHACTOR, " Role Resol Result

L_USERID TYPE PA0105-USRID, " Communication ID

L_OBJID TYPE OBJEC-OBJID, " Object ID

L_DATUM TYPE BEGDATUM, " Start Date

L_PERSON_NUMBER TYPE USR21-PERSNUMBER, " Person number

L_ADDRESS_NUMBER TYPE USR21-ADDRNUMBER. " Address Number

L_DATUM = SY-DATUM.

  • get the email addresses of the selected agent

LOOP AT P_ACTOR INTO L_ACTOR.

IF L_ACTOR-OTYPE = 'A '. "Agent is a workcenter

CLEAR TB_RESULT_TAB.

REFRESH TB_RESULT_TAB.

  • FM to find the receipent

CALL FUNCTION 'RH_STRUC_GET'

EXPORTING

ACT_OTYPE = L_ACTOR-OTYPE

ACT_OBJID = L_ACTOR-OBJID

ACT_WEGID = 'US_ACTGR'

ACT_BEGDA = L_DATUM "#EC DOM_EQUAL

ACT_ENDDA = L_DATUM "#EC DOM_EQUAL

AUTHORITY_CHECK = ' '

TABLES

RESULT_TAB = TB_RESULT_TAB

EXCEPTIONS

NO_PLVAR_FOUND = 1

NO_ENTRY_FOUND = 2

OTHERS = 3.

IF SY-SUBRC NE 0.

CONTINUE.

ENDIF.

LOOP AT TB_RESULT_TAB INTO L_ACTOR WHERE OTYPE = 'US'.

COLLECT L_ACTOR INTO TB_LIST_OF_USERS.

ENDLOOP.

ELSEIF L_ACTOR-OTYPE = 'US'. "Agent is a userid

COLLECT L_ACTOR INTO TB_LIST_OF_USERS.

ELSE. "Agent is a position

L_OBJID = L_ACTOR-OBJID.

CLEAR : TB_EPEOPLE_OBJEC, TB_EPEOPLE_STRUC.

REFRESH: TB_EPEOPLE_OBJEC, TB_EPEOPLE_STRUC.

  • FM to find the List of People

CALL FUNCTION 'RH_GET_PEOPLE_STRUC'

EXPORTING

PLVAR = '01'

OTYPE = L_ACTOR-OTYPE

OBJID = L_OBJID

C_OTYPE = ''

C_OBJID = L_OBJID

BEGDA = L_DATUM "#EC DOM_EQUAL

ENDDA = L_DATUM "#EC DOM_EQUAL

TABLES

EPEOPLE_OBJEC = TB_EPEOPLE_OBJEC

EPEOPLE_STRUC = TB_EPEOPLE_STRUC

EXCEPTIONS

NO_PLVAR_FOUND = 1

NO_ENTRY_FOUND = 2

STRUCTURE_ERROR = 3

OTHERS = 4.

IF SY-SUBRC NE 0.

CONTINUE.

ENDIF.

LOOP AT TB_EPEOPLE_OBJEC.

CASE TB_EPEOPLE_OBJEC-OTYPE.

WHEN 'US'.

L_ACTOR-OTYPE = TB_EPEOPLE_OBJEC-OTYPE.

L_ACTOR-OBJID = TB_EPEOPLE_OBJEC-REALO.

COLLECT L_ACTOR INTO TB_LIST_OF_USERS.

WHEN 'P '.

CLEAR L_USERID.

SELECT SINGLE USRID INTO L_USERID FROM PA0105

WHERE PERNR = TB_EPEOPLE_OBJEC-OBJID

AND SUBTY = '0001'

AND OBJPS = ' '

AND SPRPS = ' '

AND ENDDA GE SY-DATUM

AND BEGDA LE SY-DATUM

AND USRTY = '0001'.

IF NOT L_USERID IS INITIAL.

L_ACTOR-OTYPE = 'US'.

L_ACTOR-OBJID = L_USERID.

COLLECT L_ACTOR INTO TB_LIST_OF_USERS.

ENDIF.

ENDCASE.

ENDLOOP.

ENDIF.

ENDLOOP.

  • Get email addresses for selected users

CLEAR P_ADDRESS. REFRESH P_ADDRESS.

LOOP AT TB_LIST_OF_USERS INTO L_ACTOR.

CLEAR: L_PERSON_NUMBER, L_ADDRESS_NUMBER.

SELECT SINGLE PERSNUMBER ADDRNUMBER FROM USR21

INTO (L_PERSON_NUMBER, L_ADDRESS_NUMBER)

WHERE BNAME = L_ACTOR-OBJID.

SELECT SINGLE SMTP_ADDR INTO P_ADDRESS-SMTP_ADDR FROM ADR6

WHERE PERSNUMBER = L_PERSON_NUMBER

AND ADDRNUMBER = L_ADDRESS_NUMBER

AND FLGDEFAULT = 'X'.

IF SY-SUBRC = 0.

APPEND P_ADDRESS.

ENDIF.

ENDLOOP.

ENDFORM. "get_address

&----


*& Form CALL_FUNCTION_TXT

&----


  • Function Module used to send mail

----


FORM CALL_FUNCTION_TXT.

  • Function Module used to send mail

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

EXPORTING

DOCUMENT_DATA = TB_DOC_CHNG

TABLES

PACKING_LIST = TB_OBJPACK

OBJECT_HEADER = TB_OBJHEAD

CONTENTS_BIN = TB_OBJBIN

CONTENTS_TXT = TB_OBJTXT

RECEIVERS = TB_RECLIST

EXCEPTIONS

TOO_MANY_RECEIVERS = 1

DOCUMENT_NOT_SENT = 2

OPERATION_NO_AUTHORIZATION = 4

OTHERS = 99.

CASE SY-SUBRC.

WHEN 0.

  • Mail has been sucessfully sent

MESSAGE S999 WITH 'Mail has been sucessfully sent'(029).

WHEN 1.

  • Too Many Parameters

MESSAGE S999 WITH 'Too Many Parameters'(030).

WHEN 2.

  • Doc Could Not Be Sent

MESSAGE S999 WITH 'Doc Could Not Be Sent'(031).

WHEN 4.

  • No Authority To Send

MESSAGE S999 WITH 'No Authority To Send'(032).

WHEN 99.

  • Error While Sending

MESSAGE S999 WITH 'Error While Sending'(033).

ENDCASE.

ENDFORM. " CALL_FUNCTION_TXT

Read only

Former Member
0 Likes
628

Hello Pavan,

After going through your code it does all the operations via memory and there is no interaction to get file from disk. Are u asking how this to be changed to access file from disk e.g d:\text.txt? and ur file is stored on disk which u want to convert to PDF and pass to email.

Please correct me if my understanding is worng.

Read only

0 Likes
628

HI,

U r correct that is my requirement.

Please correct me.

Thanks,

PAvan.

Read only

0 Likes
628

PARAMETERS: FILENAME TYPE RLGRAP-FILENAME

AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILENAME.

CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

CHANGING

FILE_NAME = FILENAME.

THE ABOVE FN MODULE WORKS LIKE A BROWSER, MEANS IT SHOWS U

PATHS IN PRESENTATION SERVER, WITH WHICH U CAN SELECT UR FILE