/// ////////////////////////////////////////////////// public CResultAErreur RepriseProcess(int nIdProcessEnExecution, int nIdAction, IIndicateurProgression indicateur) { using (C2iSponsor sponsor = new C2iSponsor()) { sponsor.Register(indicateur); CResultAErreur result = CResultAErreur.True; ///Stef, 290808 : ouvre une session spécifique pour le process ///Pour pouvoir gérer le changement d'utilisateur proprement CSousSessionClient session = CSousSessionClient.GetNewSousSession(IdSession); session.OpenSession(new CAuthentificationSessionSousSession(IdSession), "Continue process " + nIdProcessEnExecution, ETypeApplicationCliente.Process); CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(IdSession); //TESTDBKEYTODO if (sessionOriginale.GetInfoUtilisateur() != null) { session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur); } try { //Stef 08/12/2007 : le contexte ne reçoit plus les notifications using (CContexteDonnee contexteDonnee = new CContexteDonnee(session.IdSession, true, false)) { CProcessEnExecutionInDb processEnExecution = new CProcessEnExecutionInDb(contexteDonnee); if (!processEnExecution.ReadIfExists(nIdProcessEnExecution)) { result.EmpileErreur(I.T("Current action @1 doesn't exist|30012", nIdProcessEnExecution.ToString())); return(result); } result = contexteDonnee.SetVersionDeTravail(processEnExecution.IdVersionExecution, true); if (!result) { return(result); } CBrancheProcess branche = processEnExecution.BrancheEnCours; CContexteExecutionAction contexteExecution = new CContexteExecutionAction( processEnExecution, branche, branche.Process.GetValeurChamp(CProcess.c_strIdVariableElement), contexteDonnee, indicateur); CAction action = branche.Process.GetActionFromId(nIdAction); if (action == null) { result.EmpileErreur(I.T("Impossible to resume the processing : the action @1 doesn't exist|30013", nIdAction.ToString())); return(result); } bool bTrans = false; if (branche.Process.ModeTransactionnel) { session.BeginTrans(); bTrans = true; } try { result = branche.ExecuteAction(action, contexteExecution, true); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { if (bTrans) { if (result) { result = session.CommitTrans(); if (result) { contexteExecution.OnEndProcess(); } } else { session.RollbackTrans(); } } } } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { try { session.CloseSession(); } catch { } } return(result); } }
//Le data du result contient la valeur de retour du process protected CResultAErreur ExecuteProcess( CSessionClient session, object objetCible, CProcess leProcessAExecuter, CContexteDonnee contexte, bool bSauvegardeDuContexteExecutionExterne, IIndicateurProgression indicateur) { using (C2iSponsor sponsor = new C2iSponsor()) { sponsor.Register(indicateur); /// Stef, le 2/4/08 : pb rencontré : leProcessAExecuter peut être /// lié à un autre CContexteDonnee que celui dans lequel on execute l'action /// en effet, il est alloué dans un CContexteDonnee, mais un autre CContexteDonnee /// peut être recréé pour que l'execution. /// OR, dans ce cas, les variables calculées évaluées par le CProcess se trouvent dans /// le contexte du process, donc, pas dans le contexte d'execution et les modifs /// sur ces variables ne sont donc pas sauvegardées ! /// d'où la ligne suivante : leProcessAExecuter.ContexteDonnee = contexte leProcessAExecuter.ContexteDonnee = contexte; //Fin Stef 2/4/08 CResultAErreur result = CResultAErreur.True; CProcessEnExecutionInDb processEnExec = new CProcessEnExecutionInDb(contexte); processEnExec.CreateNewInCurrentContexte(); if (objetCible is CObjetDonneeAIdNumerique) { processEnExec.ElementLie = (CObjetDonneeAIdNumerique)objetCible; } else { processEnExec.ElementLie = null; } processEnExec.Libelle = leProcessAExecuter.Libelle; processEnExec.DbKeyEvennementDeclencheur = leProcessAExecuter.InfoDeclencheur.DbKeyEvenementDeclencheur; processEnExec.IdVersionExecution = contexte.IdVersionDeTravail; CBrancheProcess branche = new CBrancheProcess(leProcessAExecuter); branche.IsModeAsynchrone = leProcessAExecuter.ModeAsynchrone; CSessionClient sessionSource = CSessionClient.GetSessionForIdSession(IdSession); //TESTDBKEYTODO branche.KeyUtilisateur = sessionSource.GetInfoUtilisateur().KeyUtilisateur; branche.ConfigurationImpression = sessionSource.ConfigurationsImpression; CContexteExecutionAction contexteExecution = new CContexteExecutionAction( processEnExec, branche, objetCible, contexte, leProcessAExecuter.ModeAsynchrone ? null : indicateur); contexteExecution.SauvegardeContexteExterne = bSauvegardeDuContexteExecutionExterne; //Mode synchrone if (!leProcessAExecuter.ModeAsynchrone) { bool bTrans = false; if (!bSauvegardeDuContexteExecutionExterne && leProcessAExecuter.ModeTransactionnel) { contexte.SaveAll(true);//Sauve le contexte en execution avant démarrage session.BeginTrans(); bTrans = true; } try { result = branche.ExecuteAction(leProcessAExecuter.GetActionDebut(), contexteExecution, true); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { if (bTrans) { if (result) { result = session.CommitTrans(); if (result) { contexteExecution.OnEndProcess(); } } else { session.RollbackTrans(); } } } if (!result) { result.EmpileErreur(I.T("Erreur in @1 process|20001", leProcessAExecuter.Libelle)); } if (leProcessAExecuter.VariableDeRetour != null) { result.Data = leProcessAExecuter.GetValeurChamp(leProcessAExecuter.VariableDeRetour.IdVariable); } return(result); } else { //Ouvre une nouvelle session pour éxecuter le process if (leProcessAExecuter.ModeAsynchrone) { CSessionProcessServeurSuivi sessionAsync = new CSessionProcessServeurSuivi(); result = sessionAsync.OpenSession(new CAuthentificationSessionProcess(), "Process " + leProcessAExecuter.Libelle, session); if (!result) { return(result); } session = sessionAsync; } contexteExecution.ChangeIdSession(session.IdSession); contexteExecution.HasSessionPropre = true; m_brancheToExecute = branche; m_actionToExecute = leProcessAExecuter.GetActionDebut(); m_contexteExecutionProcess = contexteExecution; Thread th = new Thread(new ThreadStart(DemarreProcess)); th.Start(); return(result); } } }