Oracle EBS R12 PL/SQL 过程中的错误处理:ORA-29283 - 无效文件操作:不存在的文件或路径 [29434]

问题描述 投票:0回答:1

我创建了 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的参数如何获取。

oracle plsql oracle-ebs
1个回答
0
投票

如果您的公司拥有独立的数据库和应用程序/并发处理服务器,那么您使用这样的 plsql 程序的方法就无法工作,而他们应该拥有这些服务器。 plsql 代码作为数据库节点上的进程运行,该进程或 utl_file 只能访问数据库节点上的目录,而不能访问应用程序服务器上的目录 ($APPLCSF/$APPLOUT)。

要进行此类输出文件分发,您需要使用在应用程序服务器上运行的进程,例如执行方法 Host 或 Java Concurrent Program。

我们对 Blitz Report 做了非常类似的事情,使用主机并发程序,因为它的性能比 Java 更好。您可以下载并将其作为示例进行研究,或者如果您需要帮助,请联系我。

问候,安迪

© www.soinside.com 2019 - 2024. All rights reserved.