Noticed a few posts on Oracle forums about FND Attached Documents i.e. Oracle Applications/eBusiness Suite Attachments. Thought I'd post some unsupported code here just for reference, and a query for getting the attachments (text/documents) themselves.
How to attach a "Web Page" URL attachment to a Payables Invoice via FND Document Attachment Private API.
To use this code there are a few things that you'll need to change:
- In the fnd_global call change the variables to your required user_id, resp_id, resp_appl_id, or comment the call if not needed see my post if you're unsure of this
- The l_pk1_value which is ap_invoices_all.invoice_id
- The l_filename and l_description variables
- Possibly l_category_id: create an real example, check out examine and find the category_id you need to use.
- Remember to commit!
- Updated 6-Mar-2012: This code has been tested against 11.5.10.2, 12.0 and 12.1 (code differences noted in comments - only queries tested for R12.0/12.1), if you have a different version this may have changed. Note this is a customization via a private API so is unsupported.
declare
l_rowid rowid;
l_attached_document_id number;
l_document_id number;
l_media_id number;
l_category_id number := 291; -- Invoice Internal
l_pk1_value fnd_attached_documents.pk1_value%TYPE := '63227';
l_description fnd_documents_tl.description%TYPE := 'Gareth Document Attach Demo';
l_filename fnd_documents_tl.file_name%TYPE := 'http://www.oracle.com/index.html';
l_seq_num number;
begin
-- Setup applications session
-- User = OPERATIONS
-- Resp = Payables, Vision Operations
-- App = Payables
fnd_global.apps_initialize(1318,50554,200);
select FND_DOCUMENTS_S.nextval
into l_document_id
from dual;
select FND_ATTACHED_DOCUMENTS_S.nextval
into l_attached_document_id
from dual;
select nvl(max(seq_num),0) + 10
into l_seq_num
from fnd_attached_documents
where pk1_value = l_pk1_value
and entity_name = 'AP_INVOICES';
fnd_documents_pkg.insert_row
( X_ROWID => l_rowid
, X_DOCUMENT_ID => l_document_id
, X_CREATION_DATE => sysdate
, X_CREATED_BY => fnd_profile.value('USER_ID')
, X_LAST_UPDATE_DATE => sysdate
, X_LAST_UPDATED_BY => fnd_profile.value('USER_ID')
, X_LAST_UPDATE_LOGIN => fnd_profile.value('LOGIN_ID')
, X_DATATYPE_ID => 5 -- Web Page
, X_CATEGORY_ID => l_category_id
, X_SECURITY_TYPE => 2
, X_PUBLISH_FLAG => 'Y'
, X_USAGE_TYPE => 'O'
, X_LANGUAGE => 'US'
, X_DESCRIPTION => l_description
, X_FILE_NAME => l_filename
, X_MEDIA_ID => l_media_id
);
fnd_documents_pkg.insert_tl_row
( X_DOCUMENT_ID => l_document_id
, X_CREATION_DATE => sysdate
, X_CREATED_BY => fnd_profile.value('USER_ID')
, X_LAST_UPDATE_DATE => sysdate
, X_LAST_UPDATED_BY => fnd_profile.value('USER_ID')
, X_LAST_UPDATE_LOGIN => fnd_profile.value('LOGIN_ID')
, X_LANGUAGE => 'US'
, X_DESCRIPTION => l_description
, X_FILE_NAME => l_filename
, X_MEDIA_ID => l_media_id
);
fnd_attached_documents_pkg.insert_row
( X_ROWID => l_rowid
, X_ATTACHED_DOCUMENT_ID => l_attached_document_id
, X_DOCUMENT_ID => l_document_id
, X_CREATION_DATE => sysdate
, X_CREATED_BY => fnd_profile.value('USER_ID')
, X_LAST_UPDATE_DATE => sysdate
, X_LAST_UPDATED_BY => fnd_profile.value('USER_ID')
, X_LAST_UPDATE_LOGIN => fnd_profile.value('LOGIN_ID')
, X_SEQ_NUM => l_seq_num
, X_ENTITY_NAME => 'AP_INVOICES'
, X_COLUMN1 => null
, X_PK1_VALUE => l_pk1_value
, X_PK2_VALUE => null
, X_PK3_VALUE => null
, X_PK4_VALUE => null
, X_PK5_VALUE => null
, X_AUTOMATICALLY_ADDED_FLAG => 'N'
, X_DATATYPE_ID => 5
, X_CATEGORY_ID => l_category_id
, X_SECURITY_TYPE => 2
, X_PUBLISH_FLAG => 'Y'
, X_LANGUAGE => 'US'
, X_DESCRIPTION => l_description
, X_FILE_NAME => l_filename
, X_MEDIA_ID => l_media_id
);
end;
/
Where to the actual attachments/documents get stored for attachments?
Here are some queries to get back the Payables Invoice attachments of category "Invoice Internal" for a given invoice.
Attachments of type Web Page (URL or Filename)
select fad_f.seq_num
, fdt_f.file_name media_data_text
from fnd_attached_documents fad_f
, fnd_documents fd_f
, fnd_documents_tl fdt_f
, fnd_document_categories_tl fdct_f
where 1 = 1
and fad_f.document_id = fd_f.document_id
and fad_f.document_id = fdt_f.document_id
and fdct_f.category_id = fd_f.category_id
and fdct_f.user_name = 'Invoice Internal'
and fd_f.datatype_id = 5
and fad_f.entity_name = 'AP_INVOICES'
and fad_f.pk1_value = '63227';
Attachments of type "Long Text"
select fad_f.seq_num
, fdlt_f.media_id media_id
, fdlt_f.long_text media_data_text
from fnd_attached_documents fad_f
, fnd_documents fd_f
, fnd_documents_tl fdt_f
, fnd_document_categories_tl fdct_f
, fnd_documents_long_text fdlt_f
where 1 = 1
and fad_f.document_id = fd_f.document_id
and fad_f.document_id = fdt_f.document_id
and fdct_f.category_id = fd_f.category_id
and fdt_f.media_id = fdlt_f.media_id /* R11i */
-- and fd_f.media_id = fdlt_f.media_id /* R12 */
and fdct_f.user_name = 'Invoice Internal'
and fad_f.entity_name = 'AP_INVOICES'
and fad_f.pk1_value = '63227';
Attachments of type "Short Text"
select fad_f.seq_num
, fdst_f.media_id media_id
, fdst_f.short_text media_data_text
from fnd_attached_documents fad_f
, fnd_documents fd_f
, fnd_documents_tl fdt_f
, fnd_document_categories_tl fdct_f
, fnd_documents_short_text fdst_f
where 1 = 1
and fad_f.document_id = fd_f.document_id
and fad_f.document_id = fdt_f.document_id
and fdct_f.category_id = fd_f.category_id
and fdt_f.media_id = fdst_f.media_id /* R11i */
-- and fd_f.media_id = fdst_f.media_id /* R12 */
and fdct_f.user_name = 'Invoice Internal'
and fad_f.entity_name = 'AP_INVOICES'
and fad_f.pk1_value = '63227';
Attachments of type "File"
select fad_l.seq_num
, fl_l.file_id media_id
, fl_l.file_data media_data_blob
from fnd_attached_documents fad_l
, fnd_documents fd_l
, fnd_documents_tl fdt_l
, fnd_document_categories_tl fdct_l
, fnd_lobs fl_l
where 1 = 1
and fad_l.document_id = fd_l.document_id
and fad_l.document_id = fdt_l.document_id
and fdct_l.category_id = fd_l.category_id
and fdt_l.media_id = fl_l.file_id /* Release 11i */
-- and fd_l.media_id = fl_l.file_id /* Release 12 */
and fad_l.entity_name = 'AP_INVOICES'
and fdct_l.user_name = 'Invoice Internal'
and fad_l.pk1_value = '63227';
Update: Added extra line to file query for R12.
Update: In case anyone needs to delete any attachments here's an example (thanks to Mark L):
declare
l_entity_name varchar2(20):= 'PO_LINES'; -- This defines the PO_LINES entity
l_pk1_value varchar2 (20) := '200487'; -- PO_LINE_ID items are attached to
l_delete_document_flag varchar2 (1) := 'Y'; -- Delete the document
begin
--fnd_global.apps_initialize(0,20420,1); -- SYSADMIN System Administrator
fnd_attached_documents2_pkg.delete_attachments
( X_entity_name => l_entity_name
, X_pk1_value => l_pk1_value
, X_delete_document_flag => l_delete_document_flag
);
end;
/
commit;
Happy Attaching!