/// //////////////////////////////////////////////////////// protected override CResultAErreur MyExecute(CContexteExecutionAction contexte) { CBrancheProcess branche = new CBrancheProcess(m_processFils); branche.IsModeAsynchrone = false; //TESTDBKEYOK branche.KeyUtilisateur = contexte.Branche.KeyUtilisateur; branche.ConfigurationImpression = contexte.Branche.ConfigurationImpression; CContexteExecutionAction contexteExecution = new CContexteExecutionAction( contexte.ProcessEnExecution, branche, contexte.ObjetCible, contexte.ContexteDonnee, contexte.IndicateurProgression); contexteExecution.SauvegardeContexteExterne = true; CAction pointEntree = m_processFils.GetActionDebut(); CResultAErreur result = CResultAErreur.True; result = branche.ExecuteAction(pointEntree, contexteExecution, contexte.ObjetCible, false); foreach (CContexteExecutionAction.CParametreServiceALancerALaFin p in contexteExecution.ServicesALancerALaFin) { contexte.AddServiceALancerALaFin(p); } contexteExecution.ClearServicesALancerALaFin(); return(result); }
public static CResultAErreur StartProcessClient( CProcess leProcessAExecuter, object objetCible, CContexteDonnee contexte, IIndicateurProgression indicateur) { System.Console.WriteLine("Démarrage process" + leProcessAExecuter.Libelle); leProcessAExecuter.ContexteDonnee = contexte; //Fin Stef 2/4/08 CResultAErreur result = CResultAErreur.True; if (!leProcessAExecuter.PeutEtreExecuteSurLePosteClient) { result.EmpileErreur(I.T("Cannot start this process in client mode|20004")); return(result); } 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 = false; branche.ExecutionSurContexteClient = true; CSessionClient sessionSource = CSessionClient.GetSessionForIdSession(contexte.IdSession); //TESTDBKEYTODO branche.KeyUtilisateur = sessionSource.GetInfoUtilisateur().KeyUtilisateur; branche.ConfigurationImpression = sessionSource.ConfigurationsImpression; CContexteExecutionAction contexteExecution = new CContexteExecutionAction( processEnExec, branche, objetCible, contexte, indicateur); string strOldContextuel = contexte.IdModificationContextuelle; contexteExecution.SauvegardeContexteExterne = true; processEnExec.BrancheEnCours = branche; CAppelleurFonctionAsynchrone appeleur = new CAppelleurFonctionAsynchrone(); CResultAErreur defaultResult = CResultAErreur.True; defaultResult.EmpileErreur(I.T("Asynchronous call error @1|20032", "ExecuteAction")); result = appeleur.StartFonctionAndWaitAvecCallback(branche.GetType(), branche, "ExecuteAction", "", defaultResult, leProcessAExecuter.GetActionDebut(), contexteExecution, true) as CResultAErreur; //result = branche.ExecuteAction ( leProcessAExecuter.GetActionDebut(), contexteExecution, true ); if (leProcessAExecuter.VariableDeRetour != null) { result.Data = leProcessAExecuter.GetValeurChamp(leProcessAExecuter.VariableDeRetour.IdVariable); } contexte.IdModificationContextuelle = strOldContextuel; return(result); }
/// <summary> /// Crée un process fils à partir des actions d'un process. /// Les actions listées sont mises dans le process fils /// </summary> /// <param name="process"></param> /// <param name="actions"></param> /// <returns>Le data du result contient le process fils créé</returns> public static CResultAErreur CreateForSelection(CAction[] actions) { CResultAErreur result = CResultAErreur.True; if (actions.Length == 0) { result.EmpileErreur(I.T("Can not create action group from empty selection|20035")); return(result); } CProcess process = actions[0].Process; //Vérifie qu'il n'y a qu'un seul lien sortant et un seul lien entrant HashSet <CAction> dicActionsInSel = new HashSet <CAction>(); foreach (CAction action in actions) { dicActionsInSel.Add(action); } CLienAction lienEntrant = null; Rectangle rctEnglobant = actions[0].RectangleAbsolu; List <CLienAction> liensSortants = new List <CLienAction>(); foreach (CAction action in actions) { foreach (CLienAction lien in action.GetLiensArrivant()) { if (!dicActionsInSel.Contains(lien.ActionDepart)) { if (lienEntrant == null) { lienEntrant = lien; break; } else { result.EmpileErreur(I.T("Selection should contains only one ingoing link|20036")); return(result); } } if (!dicActionsInSel.Contains(lien.ActionArrivee)) { if (lien.GetType() != typeof(CLienAction)) { result.EmpileErreur(I.T("Can not group actions with complex outgoing link|20037")); } } } foreach (CLienAction lien in action.GetLiensSortant()) { if (!dicActionsInSel.Contains(lien.ActionArrivee)) { liensSortants.Add(lien); } } CActionProcessFils pf = action as CActionProcessFils; if (pf != null) { foreach (IVariableDynamique variable in pf.ProcessFils.ListeVariables) { if (!pf.ProcessFils.IsVariableDeProcessParent(variable)) { result.EmpileErreur(I.T("Can not group a group with variables|20039")); return(result); } } } Rectangle rctAction = action.RectangleAbsolu; rctEnglobant.Location = new Point( Math.Min(rctEnglobant.Left, rctAction.Left), Math.Min(rctEnglobant.Top, rctAction.Top)); rctEnglobant.Size = new Size( Math.Max(rctEnglobant.Width, rctAction.Right - rctEnglobant.Left), Math.Max(rctEnglobant.Height, rctAction.Bottom - rctEnglobant.Top)); } //Crée le process fils CActionProcessFils actionFils = new CActionProcessFils(process); actionFils.Position = new Point(rctEnglobant.Left + (rctEnglobant.Width - actionFils.Size.Width) / 2, rctEnglobant.Top + (rctEnglobant.Height - actionFils.Size.Height) / 2); CProcess processFils = actionFils.ProcessFils; Dictionary <CAction, CAction> dicCorrespondanceActions = new Dictionary <CAction, CAction>(); int nOffsetX = processFils.GetActionDebut().Position.X - rctEnglobant.Left; int nOffsetY = processFils.GetActionDebut().Position.Y + 40 - rctEnglobant.Top; foreach (CAction action in actions) { CAction newAction = Activator.CreateInstance(action.GetType(), new object[] { processFils }) as CAction; CCloner2iSerializable.CopieTo(action, newAction); newAction.Position = new Point(newAction.Position.X + nOffsetX, newAction.Position.Y + nOffsetY); dicCorrespondanceActions[action] = newAction; processFils.AddAction(newAction); } //copie des liens HashSet <CLienAction> hashLiens = new HashSet <CLienAction>(); //Crée la liste de tous les liens foreach (CAction action in actions) { foreach (CLienAction lien in action.GetLiensSortant()) { if (!liensSortants.Contains(lien) && !hashLiens.Contains(lien)) { hashLiens.Add(lien); } } foreach (CLienAction lien in action.GetLiensArrivant()) { if (lien != lienEntrant && !hashLiens.Contains(lien)) { hashLiens.Add(lien); } } } foreach (CLienAction lien in hashLiens) { CAction actionDepart = null; CAction actionArrivee = null; if (!dicCorrespondanceActions.TryGetValue(lien.ActionDepart, out actionDepart)) { result.EmpileErreur(I.T("An error occured during grouping process|20038")); return(result); } if (!dicCorrespondanceActions.TryGetValue(lien.ActionArrivee, out actionArrivee)) { result.EmpileErreur(I.T("An error occured during grouping process|20038")); return(result); } CLienAction newLien = Activator.CreateInstance(lien.GetType(), new object[] { processFils }) as CLienAction; CCloner2iSerializable.CopieTo(lien, newLien); newLien.ActionArrivee = actionArrivee; newLien.ActionDepart = actionDepart; processFils.AddLien(newLien); } //Crée le lien de départ if (lienEntrant != null) { CLienAction newLienDepart = new CLienAction(processFils); newLienDepart.ActionDepart = processFils.GetActionDebut(); newLienDepart.ActionArrivee = dicCorrespondanceActions[lienEntrant.ActionArrivee]; processFils.AddLien(newLienDepart); CAction action1 = newLienDepart.ActionArrivee; CAction actionStart = newLienDepart.ActionDepart; actionStart.Position = new Point( action1.Position.X + (action1.Size.Width - actionStart.Size.Width) / 2, actionStart.Position.Y); } process.AddAction(actionFils); //Modifie le lien de départ if (lienEntrant != null) { lienEntrant.ActionArrivee = actionFils; } foreach (CLienAction lien in liensSortants) { lien.ActionDepart = actionFils; } foreach (CAction action in actions) { process.RemoveAction(action); } result.Data = actionFils; return(result); }
/// //////////////////////////////////////////////////////// protected override CResultAErreur MyExecute(CContexteExecutionAction contexte) { CResultAErreur result = CResultAErreur.False; CProcessInDb processInDB = new CProcessInDb(contexte.ContexteDonnee); if (!processInDB.ReadIfExists(m_dbKeyProcess)) { result.EmpileErreur(I.T("The @1 action doesn't exist|194", m_dbKeyProcess.ToString())); result.EmpileErreur(I.T("Error in an action execution from an action|195")); return(result); } string strOldContextuel = contexte.ContexteDonnee.IdModificationContextuelle; CContexteDonnee contexteDonneeSousAction = contexte.ContexteDonnee; if (ModeAsynchrone || LancerDansUnProcessSepare) { contexteDonneeSousAction = new CContexteDonnee(contexte.IdSession, true, true); } //Si synchrone, s'execute dans le même contexte de données if (!ModeAsynchrone) { CProcessEnExecutionInDb processEnExec = new CProcessEnExecutionInDb(contexteDonneeSousAction); processEnExec.CreateNewInCurrentContexte(); CProcess process = processInDB.Process; process.ContexteDonnee = contexteDonneeSousAction; object elementCible = contexte.ObjetCible; //Remplit les variables du process foreach (string strIdVariable in m_mapVariablesProcessToFormule.Keys) { IVariableDynamique variable = process.GetVariable(strIdVariable); //Evalue la formule C2iExpression expression = (C2iExpression)m_mapVariablesProcessToFormule[strIdVariable]; CContexteEvaluationExpression contexteEval = new CContexteEvaluationExpression(Process); contexteEval.AttacheObjet(typeof(CContexteDonnee), contexte.ContexteDonnee); result = expression.Eval(contexteEval); if (!result) { result.EmpileErreur(I.T("Error during the variables assignment in sub action|197")); result.EmpileErreur(I.T("@1 variable error|196", variable.Nom)); return(result); } CObjetDonnee objDonnee = result.Data as CObjetDonnee; if (objDonnee != null) { result.Data = objDonnee.GetObjetInContexte(contexteDonneeSousAction); } process.SetValeurChamp(variable.IdVariable, result.Data); if (variable.IdVariable == CProcess.c_strIdVariableElement && result.Data is CObjetDonneeAIdNumerique) { elementCible = result.Data; } } if (elementCible is CObjetDonneeAIdNumerique) { processEnExec.ElementLie = (CObjetDonneeAIdNumerique)elementCible; } else { processEnExec.ElementLie = null; } processEnExec.Libelle = process.Libelle; CBrancheProcess branche = new CBrancheProcess(process); branche.IsModeAsynchrone = ModeAsynchrone; //TESTDBKEYOK branche.KeyUtilisateur = contexte.Branche.KeyUtilisateur; branche.ConfigurationImpression = contexte.Branche.ConfigurationImpression; CContexteExecutionAction contexteExecution = new CContexteExecutionAction( processEnExec, branche, elementCible, ModeAsynchrone ? null : contexteDonneeSousAction, contexte.IndicateurProgression); CAction pointEntree = null; if (IdPointEntree >= 0) { pointEntree = process.GetActionFromId(IdPointEntree); if (pointEntree == null) { result.EmpileErreur(I.T("Can not find entry point|20018")); return(result); } } else { pointEntree = process.GetActionDebut(); } if (!ModeAsynchrone) { contexteExecution.SauvegardeContexteExterne = !m_bLancerDansContexteSepare; result = branche.ExecuteAction(pointEntree, contexteExecution, elementCible, true); foreach (CContexteExecutionAction.CParametreServiceALancerALaFin s in contexteExecution.ServicesALancerALaFin) { contexte.AddServiceALancerALaFin(s); } contexteExecution.ClearServicesALancerALaFin(); if (m_bSansTrace) { processEnExec.Table.Rows.Remove(processEnExec.Row.Row); } if (VariableResultat != null && process.VariableDeRetour != null) { object valeur = process.GetValeurChamp(process.VariableDeRetour); if (valeur != null) { valeur = valeur.ToString(); } Process.SetValeurChamp(VariableResultat.IdVariable, valeur.ToString()); } } else { //Ouvre une nouvelle session pour éxecuter le process CSessionProcessServeurSuivi sessionAsync = new CSessionProcessServeurSuivi(); result = sessionAsync.OpenSession(new CAuthentificationSessionProcess(), I.T("Process @1|198", processInDB.Libelle), CSessionClient.GetSessionForIdSession(contexte.IdSession)); if (!result) { return(result); } contexteExecution.ChangeIdSession(sessionAsync.IdSession); contexteExecution.HasSessionPropre = true; m_brancheToExecute = branche; m_actionToExecute = pointEntree; m_elementCible = elementCible; m_contexteExecutionProcess = contexteExecution; Thread th = new Thread(new ThreadStart(DemarreProcess)); th.Start(); return(result); } } contexte.ContexteDonnee.IdModificationContextuelle = strOldContextuel; return(result); }