Monday, January 23, 2017

How To Purge E-Mail Notifications From The Workflow Queue

How To Purge E-Mail Notifications From The Workflow Queue So The E-Mail Is Not Sent (Doc ID 372933.1)

Oracle Workflow - Version 11.5.10.0 to 12.2 [Release 11.5.10 to 12.2]
Please try in a test instance before making any changes in Prod instance.

1) Verify the current status of each notifications found in the WF_NOTIFICATIONS table that has potential for being sent when the Java Mailer gets started.
   select notification_id, recipient_role, message_type, message_name, status, mail_status
     from wf_notifications
     where status in ('OPEN', 'CANCELED')
     And Mail_Status In ('MAIL', 'INVALID')
     order by notification_id;

Normally, only records where status = 'OPEN' and mail_status = 'MAIL' are notifications that would be sent, but there are programs that also can retry Canceled or Invalid notifications, so we included these as well. This query should show which notifications are waiting to be e-mailed.

2) Use BEGIN_DATE in the where clause to help narrow down the emails not to get sent by the Mailer from a specific date range. 


For example :
  select notification_id, begin_date, recipient_role, message_type, message_name, status,         mail_status
     from wf_notifications
     Where Status In ('OPEN', 'CANCELED')
     And Mail_Status In ('MAIL', 'INVALID')
     and begin_date < sysdate-30      -- List only emails older than 30 days ago
     order by notification_id;

3) To update a notification so that it will not get e-mailed, simply set the MAIL_STATUS = 'SENT', and rebuild the Mailer queue using wfntfqup.sql. The mailer will think the e-mail has already been sent and it will not send it again.   Note : Users can still reply to all these notifications from the worklist page in the applications.

Example:
 update WF_NOTIFICATIONS set mail_status = 'SENT'
     where mail_status in ('MAIL','INVALID')
     and Status In ('OPEN', 'CANCELED');

(Remember to include any other filters you want like begin_date <= sysdate-30)

This will update all notifications waiting to be sent by the mailer to SENT, and therefore will not get emailed when the Mailer is restarted.

4) Run the script $FND_TOP/patch/115/sql/wfntfqup.sql to purge the WF_NOTIFICATION_OUT queue and rebuild it with data currently in the WF_NOTIFICATIONS table. This is what purges all notifications waiting in the queue to be sent.  It will then populate the queue with the current data in the wf_notifications table.

Since we have changed the mail_status = 'SENT" it will not enqueue these messages again.. Only the ones where mail_status = 'MAIL' and status = 'OPEN' will be placed in the WF_NOTIFICATION_OUT queue and sent by the mailer. (or CANCELED and INVALID if certain concurrent reports are run)


Example :
$ sqlplus usr/passwd@db @$FND_TOP/patch/115/sql/wfntfqup.sql APPSusr APPSpw FNDusr
Syntax:
$ sqlplus apps/apps@db @$FND_TOP/patch/115/sql/wfntfqup.sql apps apps applsys

5) Now start the Workflow Java Mailer.
----------------------------------------------------------------------
Please also refer these docs.
847889.1 - Stop Workflow Notification Emails During Clone
828812.1 - How To Stop Old Outbound Workflow Notification Email Messages During Clone 
603003.1 - How To Remove Workflow Data On A Test Or Cloned Instance
736508.1 - How to Cancel Email Notifications for Particular Workflow Type
---------------------------------------------------------------------

Tuesday, January 17, 2017

How to enable and retrieve FND debug log messages (Doc ID 433199.1)


1) Set up profiles for the User / Responsibility to be used to reproduce the issue

Responsibility: System Administrator
Navigation: Profile > System

Query up the Application, Responsibility and User you will use to reproduce the issue you want to debug.
For example:
Application = Receivables
Responsibility = Receivables Manager
User = MYUSER1
Profile = FND%Debug%

then set the profiles as shown below:
Profile Name
Suggested value
Comments
FND: Debug Log Enabled
YES
This turns the debugging feature on
FND: Debug Log Filename  or FND: Debug Log Filename for Middle-Tier
leave this blank/null at all levels
Use when you want debug messages to get stored to a file.

Note however, that the preferred method of downloading debug messages to a .xls file is provided in step 5 below.
FND: Debug Log Level
Statement
Following are options listed from least to most detailed debugging :
Unexpected, Error, Exception, Event, Procedure, Statement
FND: Debug Log Module
%
Indicate what modules to debug. You can use something like 'ar%' or even  '%arp_rounding%' to limit modules debugged

Following are examples on how you would set the above profiles depending on what you want to debug :
sample setting to debug everything :
FND: Debug Log Enabled YES
FND: Debug Log Filename NULL
FND: Debug Log Level STATEMENT
FND: Debug Log Module %
sample setting to debug ONLY Receivables :
FND: Debug Log Enabled YES
FND: Debug Log Filename NULL
FND: Debug Log Level STATEMENT
FND: Debug Log Module ar%
2) Since the debugging routine will start writing messages to the table, we want to know which messages pertain to our test.
    a) If you are tracking the debug messages for a concurrent request, take note of the Concurrent Request id
    b) Otherwise, retrieve the current max value of log sequence as follows:
SELECT MAX(LOG_SEQUENCE) before_seq
FROM FND_LOG_MESSAGES;

3) Run your test case, try to stay on track in reproducing the issue and leave out extraneous steps so that you don't end up with debug messages that are not relevant to your issue. It is ideal to not have anyone else using the Responsibility you have enabled debug for, so that only messages pertaining to your testcase are picked up.
4) If you ran the script above to get the log_sequence, do it again now, after you have completed the steps to reproduce the issue:
SELECT MAX(LOG_SEQUENCE) after_seq
FROM FND_LOG_MESSAGES;

5) For ease of review by Development, spool the output of the following to a .xls spreadsheet :
a) Retrieve the debug messages for a concurrent request ID:
SELECT log.module, log.message_text message
FROM fnd_log_messages log,
            fnd_log_transaction_context con
WHERE con.transaction_id = &request_id
AND con.transaction_type = 'REQUEST'
AND con.transaction_context_id = log.transaction_context_id
ORDER BY log.log_sequence; 
b) Otherwise, retrieve debug messages using a log_sequence range:
SELECT module, message_text
FROM fnd_log_messages
WHERE log_sequence between &before_seq and &after_seq
ORDER BY log_sequence;
For either of the above select statements, you can pick up all the fields by using:
select *
(and the rest of the statement...)
6) Don't forget to turn OFF debugging, otherwise all your actions will be logged and this could impact performance of the application.
FND: Debug Log Enabled = NO