//------------------------------------------------------------ public CResultAErreur PurgeEntites(Type typeObjets, int[] lstIds) { CResultAErreur result = CResultAErreur.True; CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); IInfoUtilisateur info = session != null?session.GetInfoUtilisateur() : null; if (info == null) { result.EmpileErreur(I.T("Invalid session in Purge entities|20014")); return(result); } if (info.GetDonneeDroit(CDroitDeBaseSC2I.c_droitAdministrationSysteme) == null) { result.EmpileErreur(I.T("Purge entity is allowed to administrators only|20015")); return(result); } result = session.BeginTrans(); if (!result) { return(result); } CDonneeNotificationModificationContexteDonnee dataModif = new CDonneeNotificationModificationContexteDonnee(IdSession); result = PurgeEntites(typeObjets, lstIds, dataModif); if (result) { CEnvoyeurNotification.EnvoieNotifications(new IDonneeNotification[] { dataModif }); result = session.CommitTrans(); } else { session.RollbackTrans(); } return(result); }
//---------------------------------------------------- private CResultAErreur SauvegardeOptimisee(CContexteDonnee ctxEdition) { CResultAErreur result = CResultAErreur.True; m_sessionClient.BeginTrans(); try { CAlarmeServeur serveur = new CAlarmeServeur(m_sessionClient.IdSession); serveur.TraitementAvantSauvegarde(ctxEdition); CDonneeNotificationModificationContexteDonnee donneeNotif = new CDonneeNotificationModificationContexteDonnee(m_sessionClient.IdSession); CListeRestrictionsUtilisateurSurType lst = new CListeRestrictionsUtilisateurSurType(); CContexteSauvegardeObjetsDonnees ctx = new CContexteSauvegardeObjetsDonnees(ctxEdition, donneeNotif, lst); result = serveur.SaveAll(ctx, DataRowState.Modified | DataRowState.Added); if (result) { CRelationAlarme_ChampCustomServeur chServeur = new CRelationAlarme_ChampCustomServeur(m_sessionClient.IdSession); result = chServeur.SaveAll(ctx, DataRowState.Modified | DataRowState.Added); } if (result) { result = serveur.TraitementApresSauvegarde(ctxEdition, true); } if (result) { CEnvoyeurNotification.EnvoieNotifications(new IDonneeNotification[] { ctx.DonneeNotification }); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { if (result) { result = m_sessionClient.CommitTrans(); } else { m_sessionClient.RollbackTrans(); } } return(result); }
//--------------------------------------------------------------------------- public System.Data.DataSet RollbackTrans(int nIdSession) { CInfoSessionTiag.RenouvelleSession(nIdSession); CResultDataSet result = new CResultDataSet(); CResultAErreur resErreur = new CResultAErreur(); CSessionClient session = GetSession(nIdSession, result); if (session == null) { return(result); } resErreur = session.BeginTrans(); if (!resErreur) { return(GetResultDS(resErreur)); } return(result); }
//------------------------------------------------------------------------------- //Annule les modifications réalisées sur l'objet public CResultAErreur AnnuleModificationsPrevisionnelles(int nIdVersionObjet) { CResultAErreur result = CResultAErreur.True; using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false)) { CSessionClient session = CSessionClient.GetSessionForIdSession(IdSession); result = session.BeginTrans(); if (!result) { return(result); } CVersionDonneesObjet versionObjet = new CVersionDonneesObjet(contexte); if (!versionObjet.ReadIfExists(nIdVersionObjet)) { return(result); //Rien à annuler } CVersionDonnees versionPrev = versionObjet.VersionDonnees; if (versionPrev.TypeVersion.Code != CTypeVersion.TypeVersion.Previsionnelle) { result.EmpileErreur(I.T("Cannot cancel archive operation|220")); return(result); } result = AnnuleModificationPrevisionnelle(versionObjet); if (result) { result = contexte.SaveAll(true); if (result) { result = session.CommitTrans(); } else { result = session.RollbackTrans(); } } } return(result); }
//------------------------------------------------------------------------- private void m_lnkTester_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) { CResultAErreur result = CResultAErreur.True; //Débute une transaction pour tester dans le vide !!! CSessionClient session = CTimosApp.SessionClient; result = session.BeginTrans(); if (result) { try { CInfoDeclencheurProcess info = new CInfoDeclencheurProcess(TypeEvenement.Manuel); result = CProcessEnExecutionInDb.StartProcess( Process.Process, info, CTimosApp.SessionClient.IdSession, Process.ContexteDonnee.IdVersionDeTravail, null); } catch (Exception ep) { result.EmpileErreur(new CErreurException(ep)); } finally { session.RollbackTrans(); } } if (!result) { CFormAlerte.Afficher(result.Erreur); } else { CFormAlerte.Afficher(I.T("Execution successful|30226")); } }
private void m_btnTesterImport_Click(object sender, EventArgs e) { CConfigMappagesSmartImport config = null; DataTable table = null; CResultAErreur result = PrepareImport(ref config, ref table); if (!result || table == null) { CFormAlerte.Afficher(result.Erreur); return; } DialogResult dr = MessageBox.Show(I.T("Would you like to save configuration first ?|20225"), "", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (dr == DialogResult.Cancel) { return; } if (dr == DialogResult.Yes) { if (!SaveConfig()) { return; } } if (!CFormOptionsSimulation.EditeOptions(m_optionsSimulation)) { return; } using (CContexteDonnee ctx = new CContexteDonnee(CSc2iWin32DataClient.ContexteCourant.IdSession, true, false)) { CContexteImportDonnee contexteImport = new CContexteImportDonnee(ctx); contexteImport.StartLine = m_optionsSimulation.StartLine; contexteImport.EndLine = m_optionsSimulation.EndLine; contexteImport.BestEffort = true; IIndicateurProgression indicateur = null; indicateur = CFormProgression.GetNewIndicateurAndPopup(I.T("Testing import|20246")); result = config.ImportTable(table, contexteImport, indicateur); CFormProgression.EndIndicateur(indicateur); indicateur = null; if (!result) { CFormAlerte.Afficher(result.Erreur); return; } if (m_optionsSimulation.TestDbWriting) { CSessionClient session = CSessionClient.GetSessionForIdSession(ctx.IdSession); session.BeginTrans(); result = ctx.SaveAll(false); session.RollbackTrans(); if (!result) { if (CFormAlerte.Afficher(result.Erreur, EFormAlerteBoutons.ContinuerAnnuler, EFormAlerteType.Info) == System.Windows.Forms.DialogResult.Cancel) { return; } } } if (CFormResultatSmartImport.ShowImportResult(ctx, contexteImport, config, m_rootValues, table)) { result = ctx.SaveAll(true); if (!result) { CFormAlerte.Afficher(result.Erreur); return; } } } }
//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); } } }
public CResultAErreur Execute(int nIdSession, System.Collections.Hashtable valeursParametres) { CResultAErreur result = CResultAErreur.True; using (CContexteDonnee contexte = new CContexteDonnee(nIdSession, true, false)) { CSessionClient session = CSessionClient.GetSessionForIdSession(nIdSession); session.BeginTrans(); try { CHandlerEvenementServeur.SuspendGestionnaire(true); IDatabaseConnexion connexion = CSc2iDataServer.GetInstance().GetDatabaseConnexion(nIdSession, typeof(CVersionDonneesObjetServeur)); //Supprime les versions string strRequete = "delete from " + CVersionDonneesObjetOperation.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } strRequete = "delete from " + CVersionDonneesObjet.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(CVersionDonnees.c_nomTable)) { if (info.TableParente == CVersionDonnees.c_nomTable) { strRequete = "update " + info.TableFille + " set " + info.ChampsFille[0] + "=null where " + info.ChampsFille[0] + " is not null"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } } strRequete = "delete from " + CVersionDonnees.c_nomTable; result = connexion.RunStatement(strRequete); if (!result) { return(result); } contexte.SetVersionDeTravail(-1, false); //Charge toutes les tables List <Type> typesAChamps = new List <Type>(); foreach (Type tp in CContexteDonnee.GetAllTypes()) { contexte.GetTableSafe(CContexteDonnee.GetNomTableForType(tp)); if (typeof(IObjetDonneeAChamps).IsAssignableFrom(tp)) { typesAChamps.Add(tp); } } /*Problème sur les champs custom : parfois (c'est rare, mais ça arrive * les valeurs de champs ne sont pas supprimées alors que l'entité est bien * supprimée. On ne sait pas pourquoi, mais les lignes suivantes * règlent le problème*/ foreach (Type tp in typesAChamps) { string strNomTable = CContexteDonnee.GetNomTableForType(tp); IObjetDonneeAChamps elt = (IObjetDonneeAChamps)Activator.CreateInstance(tp, new object[] { contexte }); string strTableValeurs = elt.GetNomTableRelationToChamps(); strRequete = "Update " + strTableValeurs + " set " + CSc2iDataConst.c_champIsDeleted + "=1 where " + elt.GetChampId() + " in (select " + elt.GetChampId() + " from " + strNomTable + " where " + CSc2iDataConst.c_champIsDeleted + "=1)"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } ArrayList lstTables = CContexteDonnee.GetTableOrderDelete(contexte); DataTable tableChampsCustomEnDernier = null; foreach (DataTable table in lstTables) { /* J'ai un problème avec la table Champs Custom * La requête suivante ne passe pas même directement dans SQL Server * DELETE FROM CUSTOM_FIELD WHERE (SC2I_VERSION IS NOT NULL) OR (SC2I_DELETED = 1) * Si je ne traite pas cette table, la purge se passe bien * */ if (table.TableName == CChampCustom.c_nomTable) { tableChampsCustomEnDernier = table; continue; } if (table.Columns.Contains(CSc2iDataConst.c_champIdVersion)) { strRequete = "delete from " + table.TableName + " where " + CSc2iDataConst.c_champIdVersion + " is not null or " + CSc2iDataConst.c_champIsDeleted + "=1"; result = connexion.RunStatement(strRequete); if (!result) { return(result); } } } //if (tableChampsCustomEnDernier != null) //{ // if (tableChampsCustomEnDernier.Columns.Contains(CSc2iDataConst.c_champIdVersion)) // { // strRequete = "delete from " + tableChampsCustomEnDernier.TableName + " where " + // CSc2iDataConst.c_champIdVersion + " is not null or " + // CSc2iDataConst.c_champIsDeleted + "=1"; // result = connexion.RunStatement(strRequete); // if (!result) // return result; // } //} } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { CHandlerEvenementServeur.SuspendGestionnaire(false); if (!result) { session.RollbackTrans(); } else { result = session.CommitTrans(); } } } return(result); }