14 de diciembre de 2012

Oracle eBs: Código para esperar a que termine una solicitud (concurrent) - Oracle eBS apps


Algunas cando realizamos desarrollos Oracle en e-Business Suite veces en nuestros programas necesitamos lanzar alguna solicitud pero es necesario esperar para ver como termina.

Aquí os adjuntamos un código para solucionarlo.

BEGIN
   fnd_file.put_line (fnd_file.output,
                      '*** Call The XXXX Import Program  ***');
   fnd_global.apps_initialize (
      user_id             => fnd_profile.VALUE ('USER_ID'),
      resp_id             => fnd_profile.VALUE ('RESP_ID'),
      resp_appl_id        => fnd_profile.VALUE ('RESP_APPL_ID'),
      security_group_id   => 0);
   fnd_file.put_line (fnd_file.LOG, 'Batch ID:' || ln_group_id);
   ln_req_id :=
      fnd_request.submit_request ('--',              -- Sustituir por el codigo de la aplicacion
                                  '----',---Sustituir por SHORT CODE de nuestro programa
                                  NULL,
                                  SYSDATE,
                                  FALSE,
                                  'BATCH',
                                  ln_group_id);
   COMMIT;

   IF ln_req_id = 0
   THEN
      fnd_file.put_line (
         fnd_file.LOG,
         'Error al ejecutar "' || fnd_message.get || '".');
   ELSE
      fnd_file.put_line (
         fnd_file.LOG,
         'El programa se generó correctamente. Solicitud id :' || ln_req_id);
   END IF;

   IF ln_req_id > 0
   THEN
      LOOP
         lv_req_return_status :=
            fnd_concurrent.wait_for_request (ln_req_id,
                                             60,
                                             0,
                                             lv_req_phase,
                                             lv_req_status,
                                             lv_req_dev_phase,
                                             lv_req_dev_status,
                                             lv_req_message);
         EXIT WHEN UPPER (lv_req_phase) = 'COMPLETED'
                   OR UPPER (lv_req_status) IN
                         ('CANCELLED', 'ERROR', 'TERMINATED');
      END LOOP;

      IF UPPER (lv_req_phase) = 'COMPLETED'
         AND UPPER (lv_req_status) = 'ERROR'
      THEN
         fnd_file.put_line (
            fnd_file.LOG,
            'El programa termino con error. Ver el log para el request_id');
         fnd_file.put_line (fnd_file.LOG, SQLERRM);
      ELSIF UPPER (lv_req_phase) = 'COMPLETED'
            AND UPPER (lv_req_status) = 'NORMAL'
      THEN
         Fnd_File.PUT_LINE (
            Fnd_File.LOG,
            'El programa terminó correctamente. Id de la solicitud: '
            || ln_req_id);
      ELSE
         Fnd_File.PUT_LINE (
            Fnd_File.LOG,
            'Error en el programa ');
         Fnd_File.PUT_LINE (Fnd_File.LOG, SQLERRM);
      END IF;
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      fnd_file.put_line (
         fnd_file.LOG,
         'WHEN OTHERS ERROR: '
         || SQLERRM);
END;


No hay comentarios:

Publicar un comentario