You are on page 1of 7

Periodic Alert:

1) Open the Alert Responsibility:


2) Set ur Application.

3) Then Click the Actions Button

4) Then Click the Action Details Button


5) Then Click the Action Set Button in d Alert home form.

6) Then click d Action set Details Button

7) Now the important step. Then click d Alert Details Button which is in the Alert home form. What r d the operating unit is used by d client. We must enter it.
Otherwise we will get a runtime error.
8) We r triggering the mail by using d Concurrent Program. Hence we must create the Executable.

9) Then create the Concurrent Pgm. (Note: the concurrent pgm must be register in d system administrator responsibility. Similar as we r registering 4 d
report. Here I am not include that screenshot. So don’t forget it. For example in this concurrent program I am registering in the recievables responsiblity)

10) Then click the parameter button.Here parameters we r specifying which is coming from action details argument.
11) Now write the package 4 firing the mail

Main Package:

CREATE OR REPLACE PACKAGE BODY apps.fine_last_transction


AS
PROCEDURE con_program_alert_email (
p_errbuf OUT VARCHAR2,
p_retcode OUT VARCHAR2,
p_company_name IN VARCHAR2,
p_customer_name IN VARCHAR2, --Taking the parameters from Concurrent Program
p_customer_number IN VARCHAR2,
p_ship_to_address IN VARCHAR2,
p_sales_order_number_date IN VARCHAR2,
p_trans_num_date IN VARCHAR2,
p_excise_invoice_date IN VARCHAR2,
p_item IN VARCHAR2,
p_description IN VARCHAR2,
p_basic_price IN NUMBER,
p_quantity IN NUMBER,
p_division IN VARCHAR2,
p_sales_person IN VARCHAR2,
p_sales_rep_id IN VARCHAR2,
p_sender IN VARCHAR2:= 'oracle@fineorganics.com' --From Address
)
IS
v_subject VARCHAR2 (100) := 'Last Transction Information'; --Email Subject
v_mime_type VARCHAR2 (100) := 'Content-Type: text/html';
v_body VARCHAR2 (10000);
v_line_feed VARCHAR2 (1) := CHR (10); --Datatype for moving next line
v_recipient VARCHAR2 (500) ;
cc_party VARCHAR2 (100);
CURSOR last_txn
IS
SELECT p_company_name, p_customer_name, p_customer_number,
p_ship_to_address, p_sales_order_number_date,
p_trans_num_date, p_excise_invoice_date, p_item,
p_description, p_basic_price, p_quantity, p_division,
p_sales_person, p_sales_rep_id
FROM DUAL;

tran_rec last_txn%ROWTYPE;
BEGIN
OPEN last_txn;

LOOP
FETCH last_txn
INTO tran_rec;

EXIT WHEN last_txn%NOTFOUND;


IF last_txn%ROWCOUNT = 1
THEN
v_body := '<html>' || v_line_feed; --Using the html tag to display the email output like table format
v_body :=
v_body
|| '<body style="font-family:arial;font-size:10pt">'
|| v_line_feed;
v_body := v_body || 'Dear Sir/Madam,<br /><br />' || v_line_feed;
v_body :=
v_body
|| 'List Of Last Customer Transctions Above 90 Days.<br /><br />'
|| v_line_feed;
v_body := v_body || '<table border="1">' || v_line_feed; --table tag
-- table heading
v_body := v_body || '<tr>' || v_line_feed;
v_body :=
v_body
|| '<td align="center"><b>Company Name</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Customer Name </b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b>Customer number</b></td>'
|| v_line_feed;
v_body :=
v_body || '<td align="center"><b>Address</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Sales Order Number/Date</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Trx Num/Date</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Excise invoice Date</b></td>'
|| v_line_feed;
v_body :=
v_body || '<td align="center"><b> Item</b></td>' || v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Description</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Basic Price</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Quantity</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b> Division</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b>Sales Person</b></td>'
|| v_line_feed;
v_body :=
v_body
|| '<td align="center"><b>Sales Person ID</b></td>'
|| v_line_feed;
v_body := v_body || '</tr>' || v_line_feed;
END IF;

-- table detail
v_body := v_body || '<tr>' || v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_company_name || '</td>'
|| v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_customer_name || '</td>'
|| v_line_feed;
v_body :=
v_body
|| '<td>'
|| tran_rec.p_customer_number
|| '</td>'
|| v_line_feed;
v_body :=
v_body
|| '<td>'
|| tran_rec.p_ship_to_address
|| '</td>'
|| v_line_feed;
v_body :=
v_body
|| '<td>'
|| tran_rec.p_sales_order_number_date
|| '</td>'
|| v_line_feed;
v_body :=
v_body
|| '<td>'
|| tran_rec.p_trans_num_date
|| '</td>'
|| v_line_feed;
v_body :=
v_body
|| '<td>'
|| tran_rec.p_excise_invoice_date
|| '</td>'
|| v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_item || '</td>' || v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_description || '</td>'
|| v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_basic_price || '</td>'
|| v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_quantity || '</td>' || v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_division || '</td>' || v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_sales_person || '</td>'
|| v_line_feed;
v_body :=
v_body || '<td>' || tran_rec.p_sales_rep_id || '</td>'
|| v_line_feed;
v_body := v_body || '</tr>' || v_line_feed;
END LOOP;

IF last_txn%ROWCOUNT = 0
THEN
-- The cursor fetched no rows.
-- send email using utl_smtp

fnd_file.put_line (fnd_file.LOG, ' no rows fetched...');


ELSE
-- Generate the end of the email body if we fetched at least one row.
v_body := v_body || '</table><br /><br />' || v_line_feed;
v_body := v_body || 'With Regards,<br /></br>' || v_line_feed;
v_body := v_body || 'FINE IT TEAM' || v_line_feed;
v_body := v_body || v_line_feed || '</body>' || v_line_feed;
v_body := v_body || '</html>' || v_line_feed;

THEN
IF p_sales_rep_id IS NOT NULL
THEN
SELECT email_address /*this column has multiple values like ‘mail1@gmail.com,mail2@gmail.com….etc’*/
INTO v_recipient
FROM ra_salesreps_all
WHERE salesrep_id = p_sales_rep_id;

IF v_recipient IS NOT NULL


THEN

fine_last_trans_cust.send_e_mail ( --Email Package


p_sender,
v_recipient,
cc_party,
v_subject || v_line_feed || v_mime_type,
v_body);
END LOOP;
END IF;
END IF;
END IF;

CLOSE last_txn;
END con_program_alert_email;
END fine_last_transction;
/

Email Package : fine_last_trans_cust

CREATE OR REPLACE PACKAGE BODY APPS.fine_last_trans_cust


AS
PROCEDURE send_e_mail (p_sender IN VARCHAR2,
p_recipient IN VARCHAR2,
p_cc IN VARCHAR2 DEFAULT NULL,
p_subject IN VARCHAR2,
p_message IN VARCHAR2)
IS
v_mail_host VARCHAR2 (30);
v_crlf CONSTANT VARCHAR2 (2) := CHR (13) || CHR (10); --To remove the empty line
v_message VARCHAR2 (10000);
v_mail_conn UTL_SMTP.connection; -- Email package is used to send emails
cc_parties VARCHAR2 (2000);
BEGIN
v_mail_host := '192.168.1.100'; --Ip address

v_mail_conn := UTL_SMTP.open_connection (v_mail_host, 25);-- It opens the SMTP port

v_message :=
'Date: '
|| TO_CHAR (SYSDATE, 'dd Mon yy hh24:mi:ss')
|| v_crlf
|| 'From: <'
|| p_sender
|| '>'
|| v_crlf
|| 'Subject: '
|| p_subject
|| v_crlf
|| 'To: '
|| p_recipient
|| v_crlf
|| 'Cc: '
|| cc_parties
|| v_crlf
|| ''
|| v_crlf
|| p_message;

name_array (1) := 'om_local@fineorganics.com';

UTL_SMTP.ehlo (v_mail_conn, v_mail_host); -- utl_smtp utility enables e-mail message


UTL_SMTP.mail (v_mail_conn, p_sender); -- from address
UTL_SMTP.rcpt (v_mail_conn, p_recipient); -- to address (it will trigger where to send)

FOR i IN name_array.FIRST .. name_array.LAST


LOOP
cc_parties := cc_parties || ';' || name_array (i);
UTL_SMTP.rcpt (v_mail_conn, name_array (i)); -- for cc persons
END LOOP;

UTL_SMTP.data (v_mail_conn, v_message); --it will display in the to address like date,sender,receiver,cc persons
UTL_SMTP.quit (v_mail_conn);
EXCEPTION
WHEN OTHERS
THEN
UTL_SMTP.close_connection (v_mail_conn);
END send_e_mail;
END fine_last_trans_cust;
/ it will look like the below screen shot

Final Output:

You might also like