Thursday, 29 June 2017

OutBound Interface and example

create or replace PACKAGE BODY GL_RPT_01_PKG
 AS
  PROCEDURE JOURNAL_AUDIT_PRC(
      O_ERRBUF OUT VARCHAR2,
      O_RETCODE OUT VARCHAR2,
      I_LEDGER      IN NUMBER,
      I_COMPANY     IN VARCHAR2,
      I_PERIOD_FROM IN VARCHAR2,
      I_PERIOD_TO   IN VARCHAR2
      )
      AS
    x_count          NUMBER:=0;
    X_FILE_NAME      varchar2(100);
    x_directory_name v$parameter.value%type;--VARCHAR2(1000);
    file_handle UTL_FILE.FILE_TYPE;
    x_ledger      NUMBER;
    x_company     VARCHAR2(15);
    x_period_from VARCHAR2(15);
    x_period_to   VARCHAR2(15);
    x_period_year NUMBER;
    x_ledger_name VARCHAR2(100);
    CURSOR cur_journal_entry(i_ledger IN NUMBER, i_company IN VARCHAR2, i_period_from IN VARCHAR2, i_period_to IN VARCHAR2 )
    IS
      SELECT gjh.NAME
        ||gjh.CURRENCY_CODE
        ||gjh.PERIOD_NAME JOURNAL_ENTRY , --Journal Entry Unique Identifier
        gjl.code_combination_id,
        gcc.segment3 ACCOUNT_NUMBER,
        gjh.POSTED_DATE POSTING_DATE,
        gjh.DEFAULT_EFFECTIVE_DATE EFFECTIVE_DATE,
        gjl.ACCOUNTED_DR,
        gjl.ACCOUNTED_CR,
        DECODE(gjl.ACCOUNTED_DR,NULL,'-'
        ||gjl.ACCOUNTED_CR,gjl.ACCOUNTED_DR) GL_AMOUNT,
        gjh.CURRENCY_CODE,
        TO_CHAR(gjh.posted_date,'HH24:MI:SS') posting_time,
        gjh.period_name EFFECTIVE_PERIOD,
        gjh.JE_SOURCE JOURNAL_ENTRY_MA,
        gjh.DESCRIPTION HEADER_DESCR,
        gjl.DESCRIPTION LINE_DESCR,
        (SELECT user_name FROM fnd_user WHERE user_id = gjl.CREATED_BY
        ) CREATED_BY,
      gjh.JE_SOURCE,
      gjb.NAME BATCH_NUMBER,
      gjb.CREATION_DATE BATCH_DATE,
      gjb.DESCRIPTION BATCH_DESCR,
      gjl.JE_LINE_NUM JE_LINE_NUM,
      gcc.segment2 COST_CENTER,
      gjh.JE_CATEGORY DOCUMENT_TYPE,
      gp.period_year FISCAL_YEAR,
      gjh.JE_SOURCE ENTRY_DOCU_TYPE,
      gjh.CURRENCY_CONVERSION_RATE ,
      gjh.ACCRUAL_REV_FLAG REVERSE_IND,
      gjh.ACCRUAL_REV_EFFECTIVE_DATE REVERSE_DATE,
      gjh.CREATION_DATE CREATION_DATE ,
      TO_CHAR(gjh.creation_date,'HH24:MI:SS') CREATION_TIME ,
      (SELECT user_name FROM fnd_user WHERE user_id = gjh.LAST_UPDATED_BY
      ) CHANGED_BY,
      gjh.LAST_UPDATE_DATE CHANGED_BY_DATE,
      TO_CHAR(gjh.last_update_date,'HH24:MI:SS') CHANGED_BY_time,
      (SELECT user_name FROM fnd_user WHERE user_id = gjb.APPROVER_EMPLOYEE_ID
        ) APPROVER_EMPLOYEE_ID,
      gjb.je_batch_id,
      SB_GL_RPT_01_PKG.SB_ApproveDate(gjb.je_batch_id) APPROVED_DATE,
      to_char(SB_GL_RPT_01_PKG.SB_ApproveDate(gjb.je_batch_id),'HH24:MI:SS') APPROVED_TIME
    FROM GL_JE_HEADERS gjh,
      GL_JE_LINES gjl,
      GL_JE_BATCHES gjb,
      GL_CODE_COMBINATIONS gcc,
      gl_periods gp
    WHERE gjh.je_header_id      = gjl.je_header_id
    AND gjh.je_batch_id         = gjb.je_batch_id
    AND gcc.code_combination_id = gjl.code_combination_id
    AND gp.period_name          = gjh.period_name
    AND gjh.ledger_id           = i_ledger
    AND gcc.segment1            = NVL(i_company,gcc.segment1)
    AND gp.start_date           >=
      (SELECT start_date FROM gl_periods WHERE period_name = i_period_from
      )
    AND gp.end_date   <=
      (SELECT end_date FROM gl_periods WHERE period_name = i_period_to
      );

  BEGIN
    -- initializing the variables with null
    x_directory_name:='/usr/tmp';
    x_file_name     :=NULL;
    -- initializing the parameter values into defined variables
    x_ledger      := i_ledger;
    x_company     := i_company;
    x_period_from := i_period_from;
    x_period_to   := i_period_to;
    fnd_file.put_line(fnd_file.log,'starts printing');
    fnd_file.put_line(fnd_file.log,'Ledger value :'||i_ledger);
    fnd_file.put_line(fnd_file.log,'Ledger value :'||x_ledger);
    fnd_file.put_line(fnd_file.output,'Ledger :'||i_ledger);
    fnd_file.put_line(fnd_file.log,'Company :'||x_company);
    fnd_file.put_line(fnd_file.output,'Company :'||i_company);
    fnd_file.put_line(fnd_file.log,'Period From :'||x_period_from);
    fnd_file.put_line(fnd_file.output,'Period From :'||x_period_from);
    fnd_file.put_line(fnd_file.log,'Period to :'||x_period_to);
    fnd_file.put_line(fnd_file.output,'Period to :'||x_period_to);
    --Directory Location
    /*SELECT value
    INTO x_directory_name
    FROM v$parameter
    WHERE name='utl_file_dir' ; */
    fnd_file.put_line(fnd_file.log,'Directory Name :'||x_directory_name);
    fnd_file.put_line(fnd_file.output,'Directory Name :'||x_directory_name);
    -- Retrieving the period year by passing period from to concatenate with file name
    SELECT period_year
    INTO x_period_year
    FROM gl_periods
    WHERE period_name = x_period_from;
    fnd_file.put_line(fnd_file.log,'Period From :'||x_period_from);
    fnd_file.put_line(fnd_file.output,'Period From :'||x_period_from);
    fnd_file.put_line(fnd_file.log,'Period Year :'||x_period_year);
    fnd_file.put_line(fnd_file.output,'Period Year :'||x_period_year);
    -- Retrieving the ledger name US or CA from the gl_sets_of_books table to concatenate with file name
    SELECT SUBSTR(name,1,2)
    INTO x_ledger_name
    FROM gl_sets_of_books
    WHERE set_of_books_id = x_ledger;
    --File name
    x_file_name := x_ledger_name||x_period_from||'-'||x_period_to||'-'||x_period_year||'.txt';
    -- Open file in Write mode
    file_handle := UTL_FILE.FOPEN(x_directory_name,x_file_name,'W',32000);
    fnd_file.put_line(fnd_file.output,'File_name :'||x_file_name);
    fnd_file.put_line(fnd_file.log,'File_name :'||x_file_name);
    BEGIN
      -- open and fetching cursor
      FOR rec_journal_entry IN cur_journal_entry(i_ledger ,i_company , i_period_from , i_period_to )
      LOOP
        x_count  := x_count+1;
        IF x_count>0 THEN
          FND_FILE.PUT_LINE(FND_FILE.LOG,'File Open Successful');
        END IF;
        utl_file.put_line(file_handle,RPAD(rec_journal_entry.JOURNAL_ENTRY,70)||         --1
                              RPAD(rec_journal_entry.ACCOUNT_NUMBER,10)||                --2
                              RPAD(rec_journal_entry.POSTING_DATE,12)||                   --3
                              RPAD(rec_journal_entry.EFFECTIVE_DATE,12)||                 --4
                              RPAD(rec_journal_entry.GL_AMOUNT,9)||                       --5
                              RPAD(rec_journal_entry.CURRENCY_CODE,15)||                  --6
                              RPAD(rec_journal_entry.posting_time,10)||                   --7
                              RPAD(rec_journal_entry.EFFECTIVE_PERIOD,15)||               --8
                              RPAD(rec_journal_entry.JOURNAL_ENTRY_MA,25)||               --9
                              RPAD(rec_journal_entry.HEADER_DESCR,100)||                  --10
                              RPAD(rec_journal_entry.LINE_DESCR,100)||                    --11
                              RPAD(rec_journal_entry.CREATED_BY,50)||                    --12
                              RPAD(rec_journal_entry.JE_SOURCE,25)||                      --13
                              RPAD(rec_journal_entry.BATCH_NUMBER,100)||                  --14
                              RPAD(rec_journal_entry.BATCH_DATE,12)||                     --15
                              RPAD(rec_journal_entry.BATCH_DESCR,100)||                   --16
                              RPAD(rec_journal_entry.JE_LINE_NUM,15)||                    --17
                              RPAD(rec_journal_entry.COST_CENTER,10)||                   --18
                              RPAD(rec_journal_entry.DOCUMENT_TYPE,25)||                  --19
                              RPAD(rec_journal_entry.FISCAL_YEAR,15)||                    --20
                              RPAD(rec_journal_entry.ENTRY_DOCU_TYPE,25)||                --21
                              RPAD(rec_journal_entry.CURRENCY_CONVERSION_RATE,9)||        --22
                              RPAD(rec_journal_entry.REVERSE_IND,2)||                     --23
                              RPAD(rec_journal_entry.REVERSE_DATE,12)||                   --24
                              RPAD(rec_journal_entry.CREATION_DATE,12)||                  --25
                              RPAD(rec_journal_entry.CREATION_TIME,10)||                  --26 
                              RPAD(rec_journal_entry.CHANGED_BY,50)||                    --27
                              RPAD(rec_journal_entry.CHANGED_BY_DATE,12)||                --28
                              RPAD(rec_journal_entry.CHANGED_BY_time,10)||                --29
                              RPAD(rec_journal_entry.APPROVER_EMPLOYEE_ID,50)||          --30
                              RPAD(rec_journal_entry.APPROVED_DATE,12));                  --31
        fnd_file.put_line(fnd_file.output,RPAD(rec_journal_entry.JOURNAL_ENTRY,130)||CHR(9)||
                              RPAD(rec_journal_entry.ACCOUNT_NUMBER,150)||CHR(9)||
                              RPAD(rec_journal_entry.POSTING_DATE,12)||CHR(9)||
                              RPAD(rec_journal_entry.EFFECTIVE_DATE,12)||CHR(9)||
                              RPAD(rec_journal_entry.GL_AMOUNT,9)||CHR(9)||
                              RPAD(rec_journal_entry.CURRENCY_CODE,15)||CHR(9)||
                              RPAD(rec_journal_entry.posting_time,10)||CHR(9)||
                              RPAD(rec_journal_entry.EFFECTIVE_PERIOD,15)||CHR(9)||
                              RPAD(rec_journal_entry.JOURNAL_ENTRY_MA,25)||CHR(9)||
                              RPAD(rec_journal_entry.HEADER_DESCR,240)||CHR(9)||
                              RPAD(rec_journal_entry.LINE_DESCR,240)||CHR(9)||
                              RPAD(rec_journal_entry.CREATED_BY,100)||CHR(9)||
                              RPAD(rec_journal_entry.JE_SOURCE,25)||CHR(9)||
                              RPAD(rec_journal_entry.BATCH_NUMBER,100)||CHR(9)||
                              RPAD(rec_journal_entry.BATCH_DATE,12)||CHR(9)||
                              RPAD(rec_journal_entry.BATCH_DESCR,240)||CHR(9)||
                              RPAD(rec_journal_entry.JE_LINE_NUM,15)||CHR(9)||
                              RPAD(rec_journal_entry.COST_CENTER,150)||CHR(9)||
                              RPAD(rec_journal_entry.DOCUMENT_TYPE,25)||CHR(9)||
                              RPAD(rec_journal_entry.FISCAL_YEAR,15)||CHR(9)||
                              RPAD(rec_journal_entry.ENTRY_DOCU_TYPE,25)||CHR(9)||
                              RPAD(rec_journal_entry.CURRENCY_CONVERSION_RATE,9)||CHR(9)||
                              RPAD(rec_journal_entry.REVERSE_IND,2)||CHR(9)||
                              RPAD(rec_journal_entry.REVERSE_DATE,12)||CHR(9)||
                              RPAD(rec_journal_entry.CREATION_DATE,12)||CHR(9)||
                              RPAD(rec_journal_entry.CREATION_TIME,10)||CHR(9)||
                              RPAD(rec_journal_entry.CHANGED_BY,100)||CHR(9)||
                              RPAD(rec_journal_entry.CHANGED_BY_DATE,12)||CHR(9)||
                              RPAD(rec_journal_entry.CHANGED_BY_time,10)||CHR(9)||
                              RPAD(rec_journal_entry.APPROVER_EMPLOYEE_ID,100)||CHR(9)||
                              RPAD(rec_journal_entry.APPROVED_DATE,12)||CHR(10));
      END LOOP;
    EXCEPTION
    WHEN no_data_found THEN
      fnd_file.put_line(fnd_file.output,'No Data Found'||sqlerrm);
      fnd_file.put_line(fnd_file.log,'No Data Found'||sqlerrm);
    END;
    -- Closing file
    utl_file.fclose(file_handle);
    fnd_file.put_line(fnd_file.output,'No of Records transferred to the data file :'||x_count);
    fnd_file.put_line(fnd_file.output,' ');
    fnd_file.put_line(fnd_file.output,'Submitted User name :'||fnd_profile.value('username'));
    fnd_file.put_line(fnd_file.output,' ');
    fnd_file.put_line(fnd_file.output,'Submitted Responsibility name :'||fnd_profile.value('RESP_NAME'));
    fnd_file.put_line(fnd_file.output,' ');
    fnd_file.put_line(fnd_file.output,'Submission Date :'||SYSDATE);
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    fnd_file.put_line(fnd_file.log , 'NO_DATA_FOUND');
    UTL_FILE.FCLOSE_all;
  WHEN utl_file.invalid_operation THEN
    fnd_file.put_line(fnd_file.log,'invalid operation');
    utl_file.fclose_all;
  WHEN utl_file.invalid_path THEN
    fnd_file.put_line(fnd_file.log,'invalid file path');
    utl_file.fclose_all;
  WHEN utl_file.invalid_mode THEN
    fnd_file.put_line(fnd_file.log,'invalid mode');
    utl_file.fclose_all;
  WHEN utl_file.invalid_filehandle THEN
    fnd_file.put_line(fnd_file.log,'invalid filehandle');
    utl_file.fclose_all;
  WHEN utl_file.read_error THEN
    fnd_file.put_line(fnd_file.log,'read error');
    utl_file.fclose_all;
  WHEN utl_file.internal_error THEN
    fnd_file.put_line(fnd_file.log,'internal error');
    utl_file.fclose_all;
  WHEN OTHERS THEN
    fnd_file.put_line(fnd_file.log,'other error');
    --Closing all file if open
    utl_file.fclose_all;
  end JOURNAL_AUDIT_PRC;
function ApproveDate(i_batch_id number) return date
as
x_date date;
x_batch varchar2(100);
begin

SELECT DISTINCT gjb.NAME batch,
wn.end_date approval_end_date
into x_batch,x_date
FROM wf_notifications wn, wf_items wi, gl_je_batches gjb
WHERE wn.CONTEXT LIKE
'GLBATCH%'
|| (SELECT item_key
FROM wf_items a
WHERE a.user_key = wi.user_key
AND a.item_type = 'GLBATCH'
AND ROWNUM = 1)
|| '%'
AND wi.item_type = wn.MESSAGE_TYPE
AND wi.user_key = gjb.NAME
AND gjb.je_batch_id = i_batch_id; --54626862

return (x_date);
exception
WHEN NO_DATA_FOUND THEN
  return null;
  fnd_file.put_line(fnd_file.log ,'NO_DATA_FOUND'||SQLERRM);
WHEN OTHERS THEN
  return null;
  fnd_file.put_line(fnd_file.log,'OTHER ERROR'||SQLERRM);
end ApproveDate;
end GL_RPT_01_PKG;

Tuesday, 13 June 2017

rvtptcontrol failed RVTTH-445: Subroutine Please define all applicable accounts. Cause: Accounts have not been correctly defined. Please verify that all accounts have been defined on the receiving parameter fo
This error is occured

solution :
Run below query and you will the PO distribution for which "Accrual Account" and "Variance Account" is null

select poh.segment1 PO_NUMBER, por.release_num, poll.shipment_num, ood.organization_name ORG_NAME,ood.organization_id,ood.organization_code,
pod.org_id OPERATING_UNIT, pod.po_distribution_id,
pod.accrual_account_id, pod.variance_account_id
from apps.po_headers_all poh,
apps.po_line_locations_all poll,
apps.po_distributions_all pod,
apps.po_releases_all por,
apps.org_organization_definitions ood
where (accrual_account_id is NULL
OR variance_account_id is NULL)
and poh.po_header_id = <PO_HEADER_ID>
and poh.po_header_id = pod.po_header_id
and poh.po_header_id = por.po_header_id
and poh.po_header_id = poll.po_header_id
and poll.line_location_id = pod.line_location_id
and por.po_release_id = poll.po_release_id
and ood.organization_id= pod.destination_organization_id  --org_id
and poh.approved_flag = 'Y';

Now open PO-Release
Navigation : Purchasing Super User > Purchase Orders > Purchase Order Summary
Enter PO number and Release number
Click on OPEN
then verify the distributions and enter the "Accrual Account" and "Variance Account" wherever it is null.

Tuesday, 30 May 2017

Step by step process of creating custom business event                                                                                                                                
To create the custom business event we need to use the SYSADMIN user credentials. Then only we can able to create the New Business Event.
  1. Creating a table
CREATE TABLE xx_temp (msg VARCHAR2 (4000));
/
  1. Creating package specification
CREATE OR REPLACE PACKAGE xxu_bes
    AS
       FUNCTION inv_po_matching (
          p_subscription_guid   IN     RAW,
          p_event               IN OUT wf_event_t
       )
          RETURN VARCHAR2;
    END xxu_bes;
/
show err;
  1. Creating package body
CREATE OR REPLACE PACKAGE BODY xxu_bes
    AS
       FUNCTION inv_po_matching (
          p_subscription_guid   IN     RAW,
          p_event               IN OUT wf_event_t
       )

RETURN VARCHAR2
       IS
          l_plist   wf_parameter_list_t := p_event.getparameterlist ();
       BEGIN
          IF p_event.geteventname () = 'xxu.oracle.apps.ap.inv.match'
          THEN
             INSERT INTO xx_temp (msg)
                  VALUES (
                               'Timestamp: '
                            || fnd_date.date_to_canonical (SYSDATE)
                            || ' | Event: '
                            || p_event.geteventname ()
                            || ' | Event Key: '
                            || p_event.geteventkey ()
                            || ' | SEND_DATE: '
                            || wf_event.getvalueforparameter (
                                  'SEND_DATE',
                                  l_plist
                               )
                            || ' | PO_NUMBER: '
                            || wf_event.getvalueforparameter (
                                  'PO_NUMBER',
                                  l_plist
                               )
                            || ' | event_data: '
                            || p_event.geteventdata ()
                         );
          END IF;
 
RETURN 'SUCCESS';
       EXCEPTION
          WHEN OTHERS
          THEN
             wf_core.context (
                'xxu_bes',
                'inv_po_matching',
                p_event.geteventname (),
                p_subscription_guid
             );
             wf_event.seterrorinfo (p_event, 'ERROR');
             RETURN 'ERROR';
       END inv_po_matching;
    END xxu_bes;
/
show err;
  
 4. And need to have the Workflow Administrator Web (New) responsibility. 
Navigation : Workflow Administrator Web (New) > Administrator Workflow > Business Events