我创建了 2 个并发程序:一个负责使用 XDODTEXE 可执行文件、RTF 模板和 XML 数据定义生成 PDF 输出。另一个执行第一个并发程序,然后将 PDF 文件从 APPLOUT 目录复制到 PEDIDOS 目录。最后,它应该发送一封电子邮件。
这是我的:
CREATE OR REPLACE PROCEDURE REPORTS_DETAILS(
ERRBUF OUT VARCHAR2,
RETCODE OUT VARCHAR2,
P_ORG_ID IN NUMBER,
P_USER_ID IN NUMBER,
P_RESP_ID IN NUMBER,
P_RESP_APPL_ID IN NUMBER
) AUTHID CURRENT_USER AS
--
v_request_id NUMBER;
v_layout BOOLEAN;
l_phase VARCHAR2(100);
l_status VARCHAR2(100);
l_dev_phase VARCHAR2(100);
l_dev_status VARCHAR2(100);
l_messase VARCHAR2(32767);
l_smts VARCHAR2(32767);
l_wait_for_request BOOLEAN;
v_newfile VARCHAR2(100);
v_oldfile VARCHAR2(100);
vfecha1 VARCHAR2(50) := TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS');
P_html VARCHAR2(32767);
l_correos VARCHAR2(32767);
p_text VARCHAR2(1000);
p_subjects VARCHAR2(2000);
p_to VARCHAR2(2000) := '[email protected]'; -- Cambia el correo aquí
l_error VARCHAR2(32767) := NULL;
v_numero_linea VARCHAR2(50);
--
CURSOR cEmails IS
SELECT '[email protected]' email
FROM DUAL;
BEGIN
-- Configuración de NLS
l_smts := 'ALTER SESSION SET NLS_LANGUAGE= ''' || 'AMERICAN' || ''' NLS_TERRITORY= ''' || 'AMERICA' || ''' NLS_CURRENCY= ''' || '$' || '''' ||
' NLS_ISO_CURRENCY= ''' || 'AMERICA' || ''' NLS_NUMERIC_CHARACTERS= ''' || '.,' || '''' ||
' NLS_CALENDAR= ''' || 'GREGORIAN' || ''' NLS_DATE_FORMAT= ''' || 'DD-MON-RR' || '''' ||
' NLS_DATE_LANGUAGE= ''' || 'AMERICAN' || ''' NLS_SORT= ''' || 'BINARY' || '''';
EXECUTE IMMEDIATE l_smts;
-- Inicialización de variables EBS
mo_global.init('AR');
fnd_global.apps_initialize(user_id => P_USER_ID,
resp_id => P_RESP_ID,
resp_appl_id => P_RESP_APPL_ID);
mo_global.set_policy_context('S', P_ORG_ID);
dbms_application_info.set_client_info(P_ORG_ID);
apps.fnd_profile.put('ORG_ID', P_ORG_ID);
-- Reporte XML Publisher
v_layout := FND_REQUEST.ADD_LAYOUT(template_appl_name => '',
template_code => '',
template_language => '',
template_territory => '',
output_format => 'PDF');
IF v_layout THEN
v_request_id := apps.FND_REQUEST.SUBMIT_REQUEST
(application => '',
program => '',
start_time => NULL,
sub_request => FALSE,
argument1 => p_org_id,
argument2 => NULL,
argument3 => NULL,
argument4 => NULL,
argument5 => NULL,
argument6 => p_id_cliente,
argument7 => '2024/02/01 00:00:00',
argument8 => '2024/02/01 00:00:00'
);
COMMIT;
IF v_request_id <> 0 THEN
l_wait_for_request := apps.fnd_concurrent.wait_for_request(request_id => v_request_id,
interval => 20,
max_wait => 0,
phase => l_phase,
status => l_status,
dev_phase => l_dev_phase,
dev_status => l_dev_status,
message => l_messase);
COMMIT;
END IF;
END IF;
fnd_file.put_line(fnd_file.output, '== CREACIÓN DEL ARCHIVO EN APPLOUT ==');
-- Envío de reporte por correo
fnd_file.put_line(fnd_file.output, '== MOVER ARCHIVOS A CARPETAS ==');
v_newfile := 'Report___Detalle_de_Movim_' || TO_CHAR(SYSDATE, 'DDMONYYYY') || '.pdf';
v_oldfile := 'XXReport___Detalle_de_Movim_' || v_request_id || '_1.pdf';
BEGIN
UTL_FILE.FCOPY ('APPLOUT', v_oldfile, 'PEDIDOS', v_newfile);
EXCEPTION
WHEN UTL_FILE.invalid_path THEN
fnd_file.put_line (fnd_file.LOG,'Invalid Path al Crear Archivo. '||v_newfile||' Error invalid_path: '|| SQLERRM);
WHEN UTL_FILE.invalid_mode THEN
fnd_file.put_line (fnd_file.LOG,'Invalid Mode al Crear Archivo. '||v_newfile||' Error invalid_mode: '|| SQLERRM);
WHEN UTL_FILE.invalid_operation THEN
fnd_file.put_line (fnd_file.LOG,'Invalid Operation al Crear Archivo. '||v_newfile||' Error invalid_operation: '|| SQLERRM);
WHEN UTL_FILE.invalid_filehandle THEN
fnd_file.put_line (fnd_file.LOG,'Invalid Filehandle al Crear Archivo. '||v_newfile||' Error invalid_filehandle: '|| SQLERRM);
WHEN UTL_FILE.read_error THEN
fnd_file.put_line (fnd_file.LOG,'Invalid Read al Crear Archivo. '||v_newfile||' Error read_error: '|| SQLERRM);
WHEN OTHERS THEN
fnd_file.put_line (fnd_file.LOG,'Exception no controlada al Crear Archivo. '||v_newfile||'- Error Others : ' || SQLERRM);
END;
FOR c IN cEmails LOOP
BEGIN
IF l_correos IS NULL THEN
l_correos := '[email protected]';
ELSE
l_correos := l_correos || ';' || c.email;
END IF;
END;
END LOOP;
fnd_file.put_line (fnd_file.output,'== ENVIO DE CORREOS ==');
-- EMAIL
p_text := 'Detalle de movimientos ' || vfecha1;
p_subjects := 'Detalle de movimientos ' || vfecha1;
P_html := '<html><head></head><body> Saludos Cordiales,<br>' || CHR (13);
P_html := P_html || '<p>Se Adjunta Detalle de movimientos al '|| vfecha1|| '</p>'|| CHR (13);
P_html := P_html || '<br></br>' || CHR (13);
l_correos := NULL;
fnd_file.put_line (fnd_file.output,'== COMIENZA ITERACION ==');
P_html := P_html || '<br><br><br>Atentamente,<br><br><br><br><b><i>Este correo es generado automaticamente, favor no responder.</i></b> </body></html>' || CHR (13);
P_html := P_html || ' ';
BEGIN
pits_send_mail.send_email (p_directory => 'PEDIDOS'
p_sender => p_to,
p_recipient => '[email protected]',
p_cc => NULL,
p_bcc => NULL,
p_subject => p_subjects,
p_body => P_html,
p_attachment1 => v_newfile,
p_attachment2 => NULL,
p_attachment3 => NULL,
p_attachment4 => NULL,
p_error => l_error);
apps.fnd_file.put_line(fnd_file.LOG, 'l_error - ' || l_error);
EXCEPTION
WHEN OTHERS THEN
Fnd_file.Put_line(Fnd_file.LOG,'Exception no controlada Email - ' || SQLERRM);
END;
COMMIT;
P_html := NULL;
apps.fnd_file.put_line (fnd_file.LOG,'===================================================================================');
END REPORTS_DETAILS;
如何获取FND_REQUEST.ADD_LAYOUT的参数?
如何获取mo_global.init?
有疑问吗?因为要获取该数据,我依赖于生成 PDF 输出的第一个并发的屏幕。
如何获取FND_REQUEST.ADD_LAYOUT?
FND_REQUEST.SUBMIT_REQUEST 生成 PDF 输出,问题在于复制文件并作为附件发送。
我已验证 APPLOUT 目录中的文件名,它是正确的,并且源目录和目标目录存在于 Oracle 中。
我已经验证了我的用户的权限,并且它具有主动执行、读取、写入权限。
我测试了用其他并发过程的数据更改我的存储过程的数据,并且输出成功。所以问题就在于FND_REQUEST.ADD_LAYOUT、mo_global.init的参数如何获取。
如果您的公司拥有独立的数据库和应用程序/并发处理服务器,那么您使用这样的 plsql 程序的方法就无法工作,而他们应该拥有这些服务器。 plsql 代码作为数据库节点上的进程运行,该进程或 utl_file 只能访问数据库节点上的目录,而不能访问应用程序服务器上的目录 ($APPLCSF/$APPLOUT)。
要进行此类输出文件分发,您需要使用在应用程序服务器上运行的进程,例如执行方法 Host 或 Java Concurrent Program。
我们对 Blitz Report 做了非常类似的事情,使用主机并发程序,因为它的性能比 Java 更好。您可以下载并将其作为示例进行研究,或者如果您需要帮助,请联系我。
问候,安迪