/// //////////////////////////////////////////////////////// protected override CResultAErreur ExecuteAction(CContexteExecutionAction contexte) { CResultAErreur result = CResultAErreur.True; //Calcule le message string strMessage = ""; CContexteEvaluationExpression contexteEval = new CContexteEvaluationExpression(contexte.Branche.Process); contexteEval.AttacheObjet(typeof(CContexteDonnee), contexte.ContexteDonnee); result = FormuleMessage.Eval(contexteEval); if (!result) { result = CResultAErreur.True; strMessage = FormuleMessage.GetString(); } else { strMessage = result.Data == null?"":result.Data.ToString(); } string strCodeAttente = ""; if (FormuleCodeAttente != null) { result = FormuleCodeAttente.Eval(contexteEval); if (!result || result.Data == null) { strCodeAttente = ""; } else { strCodeAttente = result.Data.ToString(); } } //TESTDBKEYOK (SC) CDbKey keyUtilisateur = contexte.Branche.KeyUtilisateur; if (m_formuleIdUtilisateur != null) { //TESTDBKEYOK result = m_formuleIdUtilisateur.Eval(contexteEval); if (result) { if (result.Data is int) { keyUtilisateur = CUtilInfosUtilisateur.GetKeyUtilisateurFromId((int)result.Data); } if (result.Data is string) { keyUtilisateur = CDbKey.CreateFromStringValue((string)result.Data); } if (result.Data is CDbKey) { keyUtilisateur = (CDbKey)result.Data; } if (keyUtilisateur != null) { contexte.Branche.KeyUtilisateur = keyUtilisateur; } } } //Si le code d'attente n'est pas null et qu'il y a déjà une attente, //il faut la supprimer if (strCodeAttente != null && strCodeAttente.Trim() != "") { CFiltreData filtre = new CFiltreData( CBesoinInterventionProcess.c_champCodeAttente + "=@1", strCodeAttente); CListeObjetsDonnees listeToDelete = new CListeObjetsDonnees(contexte.ContexteDonnee, typeof(CBesoinInterventionProcess)); listeToDelete.Filtre = filtre; if (listeToDelete.Count != 0) { CObjetDonneeAIdNumerique.Delete(listeToDelete); } } CBesoinInterventionProcess intervention = new CBesoinInterventionProcess(contexte.ContexteDonnee); intervention.CreateNewInCurrentContexte(); intervention.ProcessEnExecution = contexte.ProcessEnExecution; //TESTDBKEYOK intervention.KeyUtilisateur = keyUtilisateur; intervention.DateDemande = DateTime.Now; intervention.CodeAttente = strCodeAttente; intervention.Libelle = strMessage; CLienAction[] liens = GetLiensSortantHorsErreur(); if (liens.Length == 1) { intervention.IdAction = liens[0].ActionArrivee.IdObjetProcess; } else { intervention.IdAction = -1; } //Mise du process en pause ! result.Data = new CMetteurDeProcessEnPause( ); return(result); }
/// <summary> /// Execute une action /// </summary> /// <param name="action"></param> /// <param name="contexte"></param> /// <param name="bIsActionPrincipaleProcess">Si vrai, considère que le process en execution est fermé en sortie, /// si non, il s'agit d'une action appelée dans une boucle par exemple</param> /// <returns></returns> public CResultAErreur ExecuteAction( CAction action, CContexteExecutionAction contexte, object objetCible, bool bIsActionPrincipaleProcess) { CResultAErreur result = CResultAErreur.True; m_pile.Add(new CInfoPileExecution(null, action)); m_nIdActionEnCours = action.IdObjetProcess; action.Process.SetValeurChamp(CProcess.c_strIdVariableElement, objetCible); bool bFermerLaSessionEnSortant = IsModeAsynchrone && bIsActionPrincipaleProcess; CSessionClient sessionClient = CSessionClient.GetSessionForIdSession(contexte.IdSession); CConfigurationsImpression oldConf = null; contexte.SetInfoProgression(action.Libelle); try { if (contexte.IndicateurProgression != null && contexte.IndicateurProgression.CancelRequest) { result.EmpileErreur(I.T("User cancellation|182")); result.Data = null; return(result); } } catch { } if (sessionClient != null) { oldConf = sessionClient.ConfigurationsImpression; } try { if (sessionClient != null) { sessionClient.ConfigurationsImpression = ConfigurationImpression; } action.Process.ContexteExecution = contexte; result = action.Execute(contexte); while (result.Data != null && result) { //retourne un lien : on continue if (result.Data is CLienAction) { m_nIdActionEnCours = action.IdObjetProcess; CLienAction lien = (CLienAction)result.Data; m_pile.Add(new CInfoPileExecution(lien, lien.ActionArrivee)); contexte.ProcessEnExecution.LibelleActionEnCours = lien.ActionArrivee.Libelle; if (lien is CLienAsynchrone && !IsModeAsynchrone) { IsModeAsynchrone = true; //Execution de l'action en mode asynchrone et fin m_actionAsynchroneAExecuter = lien.ActionArrivee; m_contexteAsynchrone = contexte; Thread th = new Thread(new ThreadStart(ExecuteActionAsynchrone)); th.Start(); bFermerLaSessionEnSortant = false; result.Data = null; return(result); } else { action = ((CLienAction)result.Data).ActionArrivee; action.Process.ContexteExecution = contexte; contexte.SetInfoProgression(action.Libelle); try { if (contexte.IndicateurProgression != null && contexte.IndicateurProgression.CancelRequest) { result.EmpileErreur(I.T("User cancellation|182")); result.Data = null; return(result); } } catch { } result = action.Execute(contexte); } } else if (result.Data is CMetteurDeProcessEnPause) { //Mise en pause du process result = contexte.ProcessEnExecution.PauseProcess(contexte); result.Data = null; return(result); } else { result.Data = null; } } if (bIsActionPrincipaleProcess && result) { CResultAErreur resultTmp = contexte.ProcessEnExecution.EnProcess(contexte); if (!resultTmp) { result.Erreur += resultTmp.Erreur; result.Result = false; } } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { if (sessionClient != null) { sessionClient.ConfigurationsImpression = oldConf; } if (!result && bIsActionPrincipaleProcess) { //Pour ne modifier que le process et ne surtout pas faire les sauvegardes autres contexte.ProcessEnExecution.BeginEdit(); contexte.ProcessEnExecution.Etat = EtatProcess.Erreur; contexte.ProcessEnExecution.BrancheEnCours = this; contexte.ProcessEnExecution.InfoEtat = result.Erreur.ToString(); if (IsModeAsynchrone) { //Notifie l'utilisateur qu'un erreur est survenue CBesoinInterventionProcess intervention = new CBesoinInterventionProcess(contexte.ProcessEnExecution.ContexteDonnee); intervention.CreateNewInCurrentContexte(); intervention.Libelle = I.T("@1 action error|259", contexte.ProcessEnExecution.Libelle); intervention.DateDemande = DateTime.Now; //Crée une boite de message pour afficher l'erreur CProcess process = contexte.Branche.Process; CActionMessageBox actionNotif = new CActionMessageBox(process); actionNotif.FormuleMessage = new sc2i.expression.C2iExpressionConstante(intervention.Libelle + "\r\n" + result.Erreur.ToString()); actionNotif.Libelle = I.T("Error notification|260"); process.AddAction(actionNotif); intervention.IdAction = actionNotif.IdObjetProcess; //TESTDBKEYOK intervention.KeyUtilisateur = KeyUtilisateur; intervention.ProcessEnExecution = contexte.ProcessEnExecution; contexte.ProcessEnExecution.BrancheEnCours = contexte.Branche; } contexte.ProcessEnExecution.CommitEdit(); } if (IsModeAsynchrone && bFermerLaSessionEnSortant) { //Ferme la session try { CSessionClient session = CSessionClient.GetSessionForIdSession(contexte.IdSession); session.CloseSession(); } catch {} } } result.Data = null; return(result); }