mercredi 27 juillet 2016

Relance WF dans GTS spécifique

Paramétrage d'un GTS Spécifique (Notes)


Malheureusement, toutes les images semblent avoir sautées !

Utile pour ne pas bloquer les demandes des utilisateurs lorsqu'un traitement en cours lance de nombreux sous-traitements.


1 - Définir le GTS



Responsabilité : Administrateur système

Gestionnaire de Traitement Simultanés (GTS) à définir 



GTS

XXZZZ_GTS

Application

Spécifiques

Description

GTS Spécifique   ZZZ

Type

GTS

Primaire/Noeud

Machine_Serveur

Bibliothèque de programmes

FNDLIBR



2 - Règles de spécialisation


Inclure les traitements qui sont exclus du GTS standards (important pour éviter un conflit).



Gestionnaire de Traitement Simultanés Définir (Règles de spécialisation)




Règles de spécialisation : Inclure le traitement spécifique « Traitement de relance du WF »


Programme : Traitement de relance du WF
Nom abrégé : RELANCE_WF
Nom fichier d’exécution : xxXXX_validation_ap_pkg.xxXXX_relance_wf_p
 
Ø  Processus Workflow en arrière-plan
Après duplication du traitement standard,
Rajout des paramètres :
- Type d'élément : Demande d'approvisionnement
- Traitement différé : Oui
- Traitement en pause : Oui
- Traitement bloqué : Oui  
CREATE OR REPLACE PACKAGE BODY APPS.xxXXX_validation_ap_pkg
AS 

   g_version VARCHAR2(5) := '1.1';
   g_retcode NUMBER := 0;
   g_request_id NUMBER := fnd_global.conc_request_id;
   g_nom_traitement VARCHAR2(60);
   g_concurrent_program_name fnd_concurrent_programs.concurrent_program_name%TYPE;
   g_date_dif DATE;
   g_ins_differe BOOLEAN := FALSE;
   g_user_id NUMBER := fnd_global.user_id;
   g_login_id NUMBER := fnd_global.login_id;
   g_debug INTEGER := 5;
   g_ligne VARCHAR2(2000);
   g_sob_id NUMBER;
   g_org_id NUMBER;
  
  PROCEDURE xxXXX_submit_p (p_type_wf IN VARCHAR2,
                            p_item_key IN VARCHAR2,
                            p_notification_id IN NUMBER,
                            p_value IN VARCHAR2)
  IS

    l_request_id NUMBER;

  BEGIN

    l_request_id := apps.fnd_request.submit_request('XXXXX', -- application IN  varchar2 default NULL
                                                    'XXX_RELANCE_WF', -- program IN varchar2 default NULL
                                                    NULL, -- description IN varchar2 default NULL
                                                    SYSDATE, -- start_time IN varchar2 default NULL
                                                    FALSE, -- sub_request IN boolean default FALSE
                                                    p_type_wf, -- argument1 IN varchar2 default CHR(0) - Type de workflow
                                                    p_item_key, -- argument2 IN varchar2 default CHR(0) - item_key du workflow
                                                    p_notification_id, -- argument3 IN varchar2 default CHR(0) - Identifiant notification
                                                    p_value -- argument4 IN varchar2 default CHR(0) - Valeur activité
                                                    );

  END xxXXX_submit_p;

  PROCEDURE xxXXX_relance_wf_p (errbuf OUT NOCOPY VARCHAR2,
                                retcode OUT NOCOPY NUMBER,
                                p_type_wf IN VARCHAR2,
                                p_item_key IN VARCHAR2,
                                p_notification_id IN NUMBER,
                                p_value IN VARCHAR2)
  IS

    l_request_id NUMBER;
    l_process_activity NUMBER; -- activité notification
    l_pntfstatus VARCHAR2 (500);
    l_pntfresult VARCHAR2 (500);
    l_recipient_role wf_notifications.recipient_role%TYPE;

  BEGIN

    SELECT ias.process_activity
      INTO l_process_activity
      FROM wf_item_activity_statuses ias
     WHERE ias.item_type = p_type_wf
       AND ias.end_date IS NULL
       AND ias.activity_status = 'NOTIFIED'
       AND ias.item_key = p_item_key;
   
    SELECT recipient_role
      INTO l_recipient_role
      FROM wf_notifications
     WHERE notification_id = p_notification_id;

    wf_engine_util.complete_activity (p_type_wf, p_item_key, l_process_activity, p_value);
   
    -- Relance du workflow
    wf_engine_util.execute_post_ntf_function (p_type_wf,
                                              p_item_key,
                                              l_process_activity,
                                              'RUN',
                                              l_pntfstatus,
                                              l_pntfresult
                                              );

    -- MAJ du status de la notification
    UPDATE wf_notifications wn
       SET wn.status = 'CLOSED',
           wn.responder = l_recipient_role
     WHERE wn.notification_id = p_notification_id;

  END xxXXX_relance_wf_p;

  PROCEDURE xxXXX_wf_erreur_p (errbuf IN OUT NOCOPY VARCHAR2,
                               retcode IN OUT NOCOPY NUMBER,
                               p_date_dif IN VARCHAR2,
                               p_type_wf IN VARCHAR2)
  IS

    LV_param XXXXX.XXXXX_PARAMETRES%ROWTYPE;
    LV_Ok BOOLEAN;
    l_process_activity NUMBER; -- activité notification
    l_result VARCHAR2 (500);
   
  BEGIN

    retcode := 0;

    -- Récupération du nom du traitement agrégé
    SELECT prg.concurrent_program_name, lib.USER_CONCURRENT_PROGRAM_NAME
      INTO g_concurrent_program_name, g_nom_traitement
      FROM fnd_concurrent_programs prg, fnd_concurrent_requests req,   
           fnd_concurrent_programs_tl lib
     WHERE req.concurrent_program_id = prg.concurrent_program_id
       AND prg.CONCURRENT_PROGRAM_ID = lib.CONCURRENT_PROGRAM_ID
       AND lib.LANGUAGE = 'F'
       AND req.request_id = g_request_id;

    xxXXX_commun_pkg.log_entete_p(g_nom_traitement, g_version);

   BEGIN

      g_date_dif := TO_DATE (p_date_dif, 'YYYYMMDD');

    EXCEPTION
      WHEN OTHERS THEN
       retcode := 3;
       errbuf := SQLERRM;
       xxXXX_commun_pkg.log_trace_p (g_nom_traitement,'Chargement date différé', errbuf, retcode);
       g_date_dif := trunc(sysdate);
       RAISE;

    END;

    LV_param.TRAITEMENT := g_concurrent_program_name;
    LV_param.ID := p_type_wf;
    LV_Ok := xxXXX_traitement_pkg.trait_OK (retcode, g_date_dif, LV_param);
    g_debug := LV_param.debug;

    IF LV_Ok then
      
      FOR wf in (SELECT * FROM applsys.wf_item_activity_statuses ias
                  WHERE ias.ITEM_TYPE = p_type_wf
                  -- and ias.ITEM_KEY = '507277_1'
                    AND ias.activity_status = 'ERROR')
      LOOP

        g_ligne:= 'Relance WF :>' || p_type_wf || '-' || wf.item_key || '-' || wf.process_activity || '<';
        fnd_file.put_line (1, g_ligne);
       
        wf_engine_util.execute_activity (p_type_wf, wf.item_key,wf.process_activity,'RUN');

      END LOOP;

    END IF;

    IF retcode = 0 THEN

      fnd_file.put_line (1, ' Fin du traitement (Ok)');

    ELSE

      ROLLBACK;
      fnd_file.put_line (1, ' Fin du traitement (Ko)');

      IF retcode = 1 THEN

        INSERT INTO xxXXX.xxXXX_cr_differe
           (request_id, nom_traitement
           ,creation_date, date_differe
           ,message, statut
           )
        VALUES (g_request_id, g_concurrent_program_name
          ,SYSDATE, g_date_dif
          ,'Problème dans traitement (Voir log)', 'AVE'
          );

        g_ins_differe := TRUE;
        COMMIT;
     
      ELSE

        retcode := 1;
     
        INSERT INTO xxXXX.xxXXX_cr_differe
          (request_id, nom_traitement
          ,creation_date, date_differe
          ,message, statut
          )
        VALUES (g_request_id, g_concurrent_program_name
          ,SYSDATE, g_date_dif
          ,'Problème dans traitement (Voir log)', 'ERR'
          );

        COMMIT;

      END IF;

    END IF;

    xxXXX_commun_pkg.log_fin_p (g_nom_traitement);

  EXEPTION
 
   WHEN OTHERS THEN
     ROLLBACK;
     --Ajout d'une ligne dans la Log avec un message d'erreur
     retcode := 2;
     errbuf := SQLERRM;
     xxXXX_commun_pkg.log_trace_p (g_nom_traitement, 'Erreur grave dans le traitement', errbuf, retcode);
    
     -- Ajout d'une ligne dans la table des traitements différés avec un message d'erreur
     IF not g_ins_differe THEN
       INSERT INTO xxXXX.xxXXX_cr_differe
          (request_id, nom_traitement
          ,creation_date, date_differe
          ,message, statut
          )
       VALUES (g_request_id, g_concurrent_program_name
         ,SYSDATE, g_date_dif
         ,'Problème survenu lors du traitement', 'ERR'
         );
     END IF;
     COMMIT;
     xxXXX_commun_pkg.log_fin_p (g_nom_traitement);
     retcode := 1;

  END xxXXX_wf_erreur_p;

END  xxXXX_validation_ap_pkg;

 

3 - Plage de travail

 Gestionnaire de Traitement Simultanés (Plage de travail)

4 - Administrer le GTS


Gestionnaire de Traitement Simultanés
Vérifier que le statut est actif sinon utilisation du bouton "Activer".

5 - Planification du traitement

Responsabilité : Administrateur du système
Planifier  le traitement (ici XXX : Processus Workflow en arrière-plan)