//------------------------------------------------------------------- public override CResultAErreur TraitementAvantSauvegarde(CContexteDonnee contexte) { CResultAErreur result = CResultAErreur.True; try { result = base.TraitementAvantSauvegarde(contexte); } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); return(result); } if (!result) { return(result); } DataTable table = contexte.Tables[GetNomTable()]; if (table == null) { return(result); } HashSet <CProjet> projetsARecalculer = new HashSet <CProjet>(); HashSet <CMetaProjet> metaProjetsARecalculer = new HashSet <CMetaProjet>(); bool bIsCalculatingAsynchrones = CGestionnaireProjetsAsynchrones.IsModeCalculProjet(contexte); List <int> lstProjetsAsynchrones = new List <int>(); List <int> lstMetasProjetsAsynchrones = new List <int>(); foreach (DataRow row in new ArrayList(table.Rows)) { if (!bIsCalculatingAsynchrones) { GereProjetAsynchrone(row); } if (row.RowState == DataRowState.Modified || row.RowState == DataRowState.Added) { CProjet projet = new CProjet(row); if (projet.ModeCalculDatesParentes == (int)EModeCalculDatesProjet.Suspended) { projet.ModeCalculDatesParentes = (int)EModeCalculDatesProjet.Automatic; } if (projet.IsNew()) { result = CreateVersionRecursif(projet); if (!result) { return(result); } projetsARecalculer.Add(projet); } // Si les dates réelles (Début ou fin ) sont renseignées, alors on mes le flag Dates Auto à False if ((projet.DateDebutReel != null || projet.DateFinRelle != null) && !projet.HasChilds()) { projet.DateDebutAuto = false; } // Si les dates planifiées on changées, force le Parent de plus haut niveau à recalculer ses dates if (!row.HasVersion(DataRowVersion.Original) || (row[CProjet.c_champDateDebutPlanifiee] != row[CProjet.c_champDateDebutPlanifiee, DataRowVersion.Original] || row[CProjet.c_champDateFinPlanifiee] != row[CProjet.c_champDateFinPlanifiee, DataRowVersion.Original] || row[CProjet.c_champDateDebutReel] != row[CProjet.c_champDateDebutReel, DataRowVersion.Original] || row[CProjet.c_champDateFinReel] != row[CProjet.c_champDateFinReel, DataRowVersion.Original] || row[CProjet.c_champPctAvancement] != row[CProjet.c_champPctAvancement, DataRowVersion.Original] || row[CProjet.c_champPoids] != row[CProjet.c_champPoids, DataRowVersion.Original]) ) { foreach (CRelationMetaProjet_Projet rel in projet.RelationsMetaProjets) { if (rel.IsValide() && rel.MetaProjet.IsValide()) { if (rel.MetaProjet.ModeUpdateAsynchrone && rel.MetaProjet.Row.RowState != DataRowState.Added || bIsCalculatingAsynchrones) { lstMetasProjetsAsynchrones.Add(rel.MetaProjet.Id); } else { metaProjetsARecalculer.Add(rel.MetaProjet); } } } if (projet.IsNew() && !projet.HasChilds()) { projet.CalcWeight(false); projet.CalcProgress(false); } projet = projet.Projet; while (projet != null && projet.IsValide()) { if (!projet.ModeUpdateAsynchrone || projet.Row.RowState == DataRowState.Added || bIsCalculatingAsynchrones) { projetsARecalculer.Add(projet); projet = projet.Projet; } else { lstProjetsAsynchrones.Add(projet.Id); break; } } } } if (row.RowState == DataRowState.Deleted) { CProjet projet = new CProjet(row); projet.VersionToReturn = DataRowVersion.Original; if (projet.Projet != null && projet.Projet.IsValide()) { projetsARecalculer.Add(projet.Projet); } } } //Tri les projets par profondeur (du plus profond au moins profond) List <CProjet> lstProjetsTries = new List <CProjet>(); foreach (CProjet projet in projetsARecalculer) { if (projet.Row.RowState != DataRowState.Deleted) { lstProjetsTries.Add(projet); } } try { lstProjetsTries.Sort(delegate(CProjet x, CProjet y) { return(-x.CodeSystemeComplet.Length.CompareTo(y.CodeSystemeComplet.Length)); }); } catch (Exception ex) { result.EmpileErreur(new CErreurException(ex)); return(result); } // Recalcul les dates PLANIFIEES des projets marqués A recalculés, et leur Avancement foreach (CProjet projet in lstProjetsTries) { if (projet.HasChilds()) { projet.UpdateDateDebutPlanifieeCalculeeFromChilds(); projet.UpdateDateFinPlanifieeCalculeeFromChilds(); projet.UpdateDateDebutReelleFromFils(); projet.UpdateDateFinReelleFromFils(); } projet.UpdateWeight(); projet.UpdateProgress(); } foreach (CMetaProjet meta in metaProjetsARecalculer) { meta.UpdateDateDebutPlanifieeFromChilds(true); meta.UpdateDateFinPlanifieeFromChilds(true); meta.UpdateDateDebutReelleFromChilds(true); meta.UpdateDateFinReelleFromChilds(true); meta.CalcProgress(false); } if (!bIsCalculatingAsynchrones) { CGestionnaireProjetsAsynchrones.ASyncCalc(IdSession, lstProjetsAsynchrones, lstMetasProjetsAsynchrones); } return(result); }