‎2006 Mar 03 12:56 PM
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.
‎2006 Mar 03 1:15 PM
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
‎2006 Mar 03 1:51 PM
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.
‎2006 Mar 06 3:30 AM
HI,
U r correct that is my requirement.
Please correct me.
Thanks,
PAvan.
‎2006 Mar 06 3:40 AM
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