/// ////////////////////////////////////////////////// public CResultAErreur StartProcessMultiples(CValise2iSerializable valiseProcess, CReferenceObjetDonnee[] refsCible, int?nIdVersion, IIndicateurProgression indicateur) { using (C2iSponsor sponsor = new C2iSponsor()) { sponsor.Register(indicateur); CResultAErreur result = CResultAErreur.True; //Stef 08/12/2007 : le contexte ne reçoit plus les notifications using (CContexteDonnee contexteDeSession = new CContexteDonnee(IdSession, true, false)) { result = valiseProcess.GetObjet(typeof(CContexteDonnee), contexteDeSession); if (!result) { result.EmpileErreur(I.T("Error while process recovering|30014")); return(result); } CProcess leProcessAExecuter = (CProcess)result.Data; CObjetDonneeAIdNumerique objetCible = null; ///Stef, 290808 : ouvre une session spécifique pour le process ///Pour pouvoir gérer le changement d'utilisateur proprement CSousSessionClient session = CSousSessionClient.GetNewSousSession(contexteDeSession.IdSession); session.OpenSession(new CAuthentificationSessionSousSession(contexteDeSession.IdSession), leProcessAExecuter.Libelle, ETypeApplicationCliente.Process); CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(contexteDeSession.IdSession); //TESTDBKEYOK if (sessionOriginale.GetInfoUtilisateur() != null) { session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur); } try { //Charge les éléments pour la nouvelle session; //Stef 08/12/2007 : le contexte ne reçoit plus les notifications using (CContexteDonnee contexte = new CContexteDonnee(session.IdSession, true, false)) { result = contexte.SetVersionDeTravail(nIdVersion, true); if (!result) { return(result); } if (leProcessAExecuter.SurTableauDeTypeCible) { ArrayList lst = new ArrayList(); foreach (CReferenceObjetDonnee refCibleTmp in refsCible) { object tmp = refCibleTmp.GetObjet(contexte); if (tmp != null) { lst.Add(tmp); } } return(ExecuteProcess(session, lst, leProcessAExecuter, contexte, false, indicateur)); } try { if (!leProcessAExecuter.ModeAsynchrone) { session.BeginTrans(IsolationLevel.ReadCommitted); } foreach (CReferenceObjetDonnee refCible in refsCible) { bool bShouldStart = true; if (refCible != null) { objetCible = (CObjetDonneeAIdNumerique)refCible.GetObjet(contexte); if (objetCible == null) { ///Stef 26/1//2009 : si l'objet n'existe pas, c'est qu'il n'y a rien à déclenché. ///cela résoud un problème : si un process avant celui-ci a supprimé le targetElement ///il ne faut pas lancer ce process là ! /*result.EmpileErreur(I.T("Target object @1 does not exist|30015", refCible.ToString())); * return result;*/ bShouldStart = false; } } if (bShouldStart) { result = ExecuteProcess( session, objetCible, leProcessAExecuter, contexte, true, indicateur); if (!result) { result.EmpileErreur(I.T("Execution error on element @1|30016", objetCible.DescriptionElement)); return(result); } } } if (result) { result = contexte.SaveAll(true); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { if (result) { result = session.CommitTrans(); } if (!result) { session.RollbackTrans(); } } } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { try { session.CloseSession(); } catch { } } return(result); } } }
/// ////////////////////////////////////////////////// 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 public CResultAErreur StartProcess(CValise2iSerializable valiseProcess, CReferenceObjetDonnee refCible, int?nIdVersion, IIndicateurProgression indicateur) { using (C2iSponsor sponsor = new C2iSponsor()) { sponsor.Register(indicateur); CResultAErreur result = CResultAErreur.True; //Stef 08/12/2007 : le contexte ne reçoit plus les notifications using (CContexteDonnee contexteDeSession = new CContexteDonnee(IdSession, true, false)) { result = valiseProcess.GetObjet(typeof(CContexteDonnee), contexteDeSession); if (!result) { result.EmpileErreur(I.T("Error while recovering process|30014")); return(result); } CProcess leProcessAExecuter = (CProcess)result.Data; CObjetDonneeAIdNumerique objetCible = null; ///Stef, 290808 : ouvre une session spécifique pour le process ///Pour pouvoir gérer le changement d'utilisateur proprement CSousSessionClient session = CSousSessionClient.GetNewSousSession(contexteDeSession.IdSession); session.OpenSession(new CAuthentificationSessionSousSession(contexteDeSession.IdSession), leProcessAExecuter.Libelle, ETypeApplicationCliente.Process); CSessionClient sessionOriginale = CSessionClient.GetSessionForIdSession(contexteDeSession.IdSession); if (sessionOriginale.GetInfoUtilisateur() != null) { session.ChangeUtilisateur(sessionOriginale.GetInfoUtilisateur().KeyUtilisateur); } try { //Charge les éléments pour la nouvelle session; //Stef 08/12/2007 : le contexte ne reçoit plus les notifications //Stef le 9/2/2011, si, le contexte reçoit les notifications, //sinon, si un sous process modifie quelque chose, on ne le sait pas //et on a des problèmes de violation d'accès concurentiel using (CContexteDonnee contexte = new CContexteDonnee(session.IdSession, true, true)) { result = contexte.SetVersionDeTravail(nIdVersion, true); if (!result) { return(result); } if (refCible != null) { objetCible = (CObjetDonneeAIdNumerique)refCible.GetObjet(contexte); if (objetCible == null) { ///Stef 26/1//2009 : si l'objet n'existe pas, c'est qu'il n'y a rien à déclencher. ///cela résoud un problème : si un process avant celui-ci a supprimé le targetElement ///il ne faut pas lancer ce process là ! //result.EmpileErreur(I.T("Target object @1 does not exist|30015",refCible.ToString())); return(result); } } result = ExecuteProcess( session, objetCible, leProcessAExecuter, contexte, false, indicateur); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { try { session.CloseSession(); } catch { } } } return(result); } }