private void SoitConcernePar(CListeObjetsDonnees lstEquips) { if (m_relationToEquipSpv == null) { foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(CEquipementLogique.c_nomTable)) { if (info.TableParente == CEquipementLogique.c_nomTable && info.TableFille == CSpvEquip.c_nomTable) { m_relationToEquipSpv = info; break; } } } lstEquips.GetDependances(m_relationToEquipSpv).AssureLectureFaite(); foreach (CEquipementLogique eqpt in lstEquips) { CSpvEquip spvEquip = new CSpvEquip(eqpt.ContexteDonnee); if (spvEquip.ReadIfExists(new CFiltreData(CSpvEquip.c_champSmtEquipementLogique_Id + "=@1", eqpt.Id), false)) { m_dicEquipementsSpvConcernant[spvEquip.Id] = true; } } lstEquips = lstEquips.GetDependances("EquipementsLogiquesContenus"); if (lstEquips.Count > 0) { SoitConcernePar(lstEquips); } }
/// /////////////////////////////////////////////////////////////// private CResultAErreur ReadObjetEtDependances(CObjetDonneeAIdNumeriqueAuto source) { CResultAErreur result = CResultAErreur.True; //Charge tous les parents et tous les fils foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(source.GetNomTable())) { //Relation parente if (relation.TableFille == source.GetNomTable()) { CObjetDonneeAIdNumeriqueAuto parent = (CObjetDonneeAIdNumeriqueAuto)source.GetParent(relation.ChampsFille[0], CContexteDonnee.GetTypeForTable(relation.TableParente)); if (parent != null) { parent.AssureData(); } } else { if (relation.Composition) { CListeObjetsDonnees liste = source.GetDependancesListe(relation.TableFille, relation.ChampsFille[0]); foreach (CObjetDonneeAIdNumeriqueAuto objetFils in liste) { objetFils.AssureData(); ReadObjetEtDependances(objetFils); } } } } return(result); }
///////////////////////////////////////////////////////////////// //S'assure que les CInfoRelation vers les objets SPV sont bien connues private void AssureRelationsToSpv() { if (m_relationFromEquipementSpvToEquipement == null) { foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CEquipementLogique.c_nomTable)) { if (relation.TableParente == CEquipementLogique.c_nomTable && relation.TableFille == CSpvEquip.c_nomTable) { m_relationFromEquipementSpvToEquipement = relation; break; } } } if (m_relationFromLiaisonSpvToLiaison == null) { foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CLienReseau.c_nomTable)) { if (relation.TableParente == CLienReseau.c_nomTable && relation.TableFille == CSpvLiai.c_nomTable) { m_relationFromLiaisonSpvToLiaison = relation; break; } } } if (m_relationFromSiteSpvToSite == null) { foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CSite.c_nomTable)) { if (relation.TableParente == CSite.c_nomTable && relation.TableFille == CSpvSite.c_nomTable) { m_relationFromSiteSpvToSite = relation; break; } } } if (m_relationFromEquipementSpvToEquipement == null) { throw new Exception("Error in finding relation from site to Supervised site"); } if (m_relationFromLiaisonSpvToLiaison == null) { throw new Exception("Error in finding relation form link to Supervised link"); } if (m_relationFromSiteSpvToSite == null) { throw new Exception("Error in finding relation from site to supervised site"); } }
//Initialise la base des alarmes en cours avec les alarmes de la base et les acces concernant chaque élément private void LoadAlarmesEtLiensTransForElement(string strChampDansAcces, CDictionnaireConcerne dicConcernes) { //Récupère la relation entre CSpvLienAccesAlarme et CSpvLienAccesAlarmeRep if (m_relationFromLienAlarmeToLienAlarmeRep == null) { foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CSpvLienAccesAlarme.c_nomTable)) { if (relation.TableFille == CSpvLienAccesAlarme_Rep.c_nomTable && relation.TableParente == CSpvLienAccesAlarme.c_nomTable) { m_relationFromLienAlarmeToLienAlarmeRep = relation; break; } } } List <int> lstIdsElements = new List <int>(); lstIdsElements.AddRange(dicConcernes.Keys); int nSizePaquet = 100; for (int nPaquet = 0; nPaquet < lstIdsElements.Count; nPaquet += nSizePaquet) { int nMax = Math.Min(nPaquet + nSizePaquet, lstIdsElements.Count); StringBuilder bl = new StringBuilder(); for (int nId = 0; nId < nMax; nId++) { bl.Append(lstIdsElements[nId]); bl.Append(';'); } if (bl.Length > 0) { bl.Remove(bl.Length - 1, 1); //Charge tous les Liens d'alarme pour les éléments CListeObjetsDonnees lstLiensAccesAlarme = new CListeObjetsDonnees(m_contexteDonnee, typeof(CSpvLienAccesAlarme)); lstLiensAccesAlarme.Filtre = new CFiltreDataAvance(CSpvLienAccesAlarme.c_nomTable, CSpvAccesAlarme.c_nomTable + "." + strChampDansAcces + " in (" + bl.ToString() + ")"); lstLiensAccesAlarme.AssureLectureFaite(); // Chargement des acces correspondant CListeObjetsDonnees lstAcces = lstLiensAccesAlarme.GetDependances("AccesAlarmeOne"); lstAcces.InterditLectureInDB = true; CListeObjetsDonnees lstEtatAlarme = lstLiensAccesAlarme.GetDependances(m_relationFromLienAlarmeToLienAlarmeRep); lstEtatAlarme.Filtre = new CFiltreData(CSpvLienAccesAlarme_Rep.c_champALARM_ID + " is not null"); lstEtatAlarme.AssureLectureFaite(); lstEtatAlarme.InterditLectureInDB = true; // Chargement des données alarmes CListeObjetsDonnees listAlarmesDonnees = lstEtatAlarme.GetDependances("AlarmeDonnee"); listAlarmesDonnees.AssureLectureFaite(); listAlarmesDonnees.InterditLectureInDB = true; lstLiensAccesAlarme.InterditLectureInDB = true; lstEtatAlarme.InterditLectureInDB = true; foreach (CSpvAlarmeDonnee donneeAlarme in listAlarmesDonnees) { if (donneeAlarme != null) { CInfoAlarmeAffichee info = new CInfoAlarmeAffichee(donneeAlarme); //m_dicAlarmes[info.IdSpvEvtAlarme] = info; m_dicAlarmes[info.IdSpvAlarmeData] = info; StartAlarme(info); } } foreach (CSpvLienAccesAlarme lienAlarme in lstLiensAccesAlarme) { CSpvAcces acces = lienAlarme.AccesAlarmeOne; if (acces != null) { int?nId = acces.Row[strChampDansAcces] as int?; if (nId != null) { List <CInfoElementDeSchemaSupervise> lst = null; if (dicConcernes.TryGetValue(nId.Value, out lst)) { foreach (CInfoElementDeSchemaSupervise info in lst) { info.SetConcerneParAlarmes(); if (lienAlarme.MaskAdminDateMin != null && lienAlarme.MaskBriDateMin > DateTime.Now) { if (lienAlarme.MaskAdminDateMax == null || lienAlarme.MaskAdminDateMax < DateTime.Now) { info.SetMasquageAdministrateur(lienAlarme.Id, true); } } if (lienAlarme.MaskBriDateMin != null && lienAlarme.MaskBriDateMin > DateTime.Now) { if (lienAlarme.MaskBriDateMax == null || lienAlarme.MaskBriDateMax < DateTime.Now) { info.SetMasquageBrigadier(lienAlarme.Id, true); } } } } } } } if (m_infoSchemaRacine != null) { List <CInfoElementDeSchemaSupervise> lstTmp = new List <CInfoElementDeSchemaSupervise>(); m_infoSchemaRacine.RecalculeToutLeMasquage(lstTmp); } } } }
//----------------------------------------------------------------------- private CResultAErreur AjouteNouveauxFromSecondaire(CContexteDonnee ctxDonnee) { CUtilSynchronisation utilSync = new CUtilSynchronisation(IdSession); int nIdSyncSessionEnCours = utilSync.IdSyncSession; CResultAErreur result = CResultAErreur.True; DataTable tableLogsSynchroFromSecondaire = ctxDonnee.Tables[CEntreeLogSynchronisation.c_nomTable]; if (tableLogsSynchroFromSecondaire == null) { result.EmpileErreur(I.T("Synchro table missing|20003")); return(result); } Dictionary <CIdentifiantElement, int> dicNewIds = new Dictionary <CIdentifiantElement, int>(); ArrayList lstTables = ctxDonnee.GetTablesOrderInsert(); foreach (DataTable tableSource in lstTables) { if (tableSource.PrimaryKey.Length == 1 && m_mappeurTablesToClass.IsSynchronisable(tableSource.TableName)) { DataTable tableDest = GetTableSafe(tableSource.TableName); string strPrimKey = tableDest.PrimaryKey[0].ColumnName; //Identifie tous les ajouts DataRow[] rowsLogAjout = tableLogsSynchroFromSecondaire.Select( CEntreeLogSynchronisation.c_champTable + "='" + tableSource.TableName + "' and " + CEntreeLogSynchronisation.c_champType + "=" + (int)CEntreeLogSynchronisation.TypeModifLogSynchro.tAdd); foreach (DataRow rowLogAjout in rowsLogAjout) { //Cherche la DataRow dans la table source DataRow rowSource = tableSource.Rows.Find(rowLogAjout[CEntreeLogSynchronisation.c_champIdElement]); if (rowSource != null) { //Création d'une nouvelle ligne DataRow rowDest = tableDest.NewRow(); //copie de la ligne foreach (DataColumn col in tableSource.Columns) { if (rowDest.Table.Columns.Contains(col.ColumnName) && col.ColumnName != strPrimKey) { rowDest[col.ColumnName] = rowSource[col.ColumnName]; } } rowDest[CSc2iDataConst.c_champIdSynchro] = nIdSyncSessionEnCours; tableDest.Rows.Add(rowDest); m_mapRowsFromSecondaireToMain[rowSource] = rowDest; m_mapOldRowToOldId[rowSource] = (int)rowSource[strPrimKey]; dicNewIds[new CIdentifiantElement(tableDest.TableName, (int)rowSource[strPrimKey])] = (int)rowDest[strPrimKey]; //Change l'id dans la rowSource pour qu'il soit //répercuté sur les dépendances rowSource[strPrimKey] = rowDest[strPrimKey]; } } } } //change tous les anciens identifiants par les nouveaux foreach (KeyValuePair <CIdentifiantElement, int> kv in dicNewIds) { CIdentifiantElement ident = kv.Key; int nNewId = kv.Value; foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(ident.TableName)) { if (relation.TableParente == ident.TableName) { DataTable tableThis = Tables[relation.TableFille]; if (tableThis != null) { DataRow[] rows = tableThis.Select(relation.ChampsFille[0] + "=" + ident.IdElement); foreach (DataRow row in rows) { row[relation.ChampsFille[0]] = nNewId; } } DataTable tableSource = ctxDonnee.Tables[relation.TableFille]; if (tableSource != null) { DataRow[] rows = tableSource.Select(relation.ChampsFille[0] + "=" + ident.IdElement); foreach (DataRow row in rows) { row[relation.ChampsFille[0]] = nNewId; } } } } Type tp = CContexteDonnee.GetTypeForTable(ident.TableName); //Change les ids des relation typeid foreach (RelationTypeIdAttribute rel in RelationsTypeIds) { DataTable tableThis = Tables[rel.TableFille]; if (tableThis != null) { DataRow[] rows = tableThis.Select(rel.ChampId + "=" + ident.IdElement + " and " + rel.ChampType + "='" + tp.ToString() + "'"); foreach (DataRow row in rows) { row[rel.ChampId] = nNewId; } } DataTable tableSource = ctxDonnee.Tables[rel.TableFille]; if (tableSource != null) { DataRow[] rows = tableSource.Select(rel.ChampId + "=" + ident.IdElement + " and " + rel.ChampType + "='" + tp.ToString() + "'"); foreach (DataRow row in rows) { row[rel.ChampId] = nNewId; } } } } return(result); }
public bool IsUsed(int[] nIdsParametrages) { if (nIdsParametrages == null || nIdsParametrages.Length == 0) { return(false); } using (CContexteDonnee contexte = new CContexteDonnee(IdSession, true, false)) { C2iRequeteAvancee requete = new C2iRequeteAvancee(contexte.IdVersionDeTravail); string strIds = ""; foreach (int nId in nIdsParametrages) { strIds += nId.ToString() + ","; } strIds = strIds.Substring(0, strIds.Length - 1); lock (typeof(CLockerIsUsed)) { if (m_strRequeteParametrageInUse == "") { #region Construction de la requête foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(CParametrageSystemeCoordonnees.c_nomTable)) { if (relation.TableFille == CParametrageSystemeCoordonnees.c_nomTable) { string strTableObjetAFils = relation.TableParente; Type tp = CContexteDonnee.GetTypeForTable(strTableObjetAFils); if (typeof(IObjetASystemeDeCoordonnee).IsAssignableFrom(tp)) { IObjetASystemeDeCoordonnee objTmp = (IObjetASystemeDeCoordonnee)Activator.CreateInstance(tp, contexte); string strProprieteToObjetsAFils = objTmp.ProprieteVersObjetsAFilsACoordonneesUtilisantLeParametrage; if (strProprieteToObjetsAFils != "") { PropertyInfo info = objTmp.GetType().GetProperty(strProprieteToObjetsAFils); if (info == null) { throw new Exception(I.T("@1 does not have the property @2|242", tp.ToString(), strProprieteToObjetsAFils)); } object[] attributs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true); if (attributs == null || attributs.Length != 1) { throw new Exception(I.T("The property @1 of the @2 type have no 'ChildAttributeRelation'|243", strProprieteToObjetsAFils, objTmp.GetType().ToString())); } tp = ((RelationFilleAttribute)attributs[0]).TypeFille; } if (typeof(IObjetAFilsACoordonnees).IsAssignableFrom(tp)) { CStructureTable structure = CStructureTable.GetStructure(tp); //C'est un fils àcoordonnées //Cherche toutes les relations de ce fils avec des objets àcoordonnées foreach (CInfoRelation relationToObjetACoordonnee in structure.RelationsFilles) { if (relationToObjetACoordonnee.TableParente == strTableObjetAFils) { Type tpFils = CContexteDonnee.GetTypeForTable(relationToObjetACoordonnee.TableFille); if (typeof(IObjetACoordonnees).IsAssignableFrom(tpFils)) { string strPrefixe = strProprieteToObjetsAFils; if (strPrefixe != "") { strPrefixe += "."; } //On a une relation vers un fils m_strRequeteParametrageInUse += "has(" + strPrefixe + strTableObjetAFils + "." + relationToObjetACoordonnee.Propriete + "." + relationToObjetACoordonnee.ChampsFille[0] + ") or "; } } } } } } } if (m_strRequeteParametrageInUse != "") { m_strRequeteParametrageInUse = m_strRequeteParametrageInUse.Substring(0, m_strRequeteParametrageInUse.Length - 4); } #endregion } } if (m_strRequeteParametrageInUse == "") { return(false); } CListeObjetsDonnees liste = new CListeObjetsDonnees(contexte, typeof(CParametrageSystemeCoordonnees)); liste.Filtre = new CFiltreDataAvance( CParametrageSystemeCoordonnees.c_nomTable, CParametrageSystemeCoordonnees.c_champId + " in (" + strIds + ") and (" + m_strRequeteParametrageInUse + ")"); if (liste.CountNoLoad == 0) { return(false); } } return(true); }
//------------------------------------------------------------ public CResultAErreur PurgeEntites( Type typeObjets, int[] nIdsElementsTotal, CDonneeNotificationModificationContexteDonnee dataModifs) { CResultAErreur result = TestTypePurgeable(typeObjets); if (!result) { return(result); } //travaille par paquets de 100; for (int nPaquet = 0; nPaquet < nIdsElementsTotal.Length; nPaquet += 100) { List <int> lstTmp = new List <int>(); int nMin = Math.Min(nPaquet + 100, nIdsElementsTotal.Length); for (int n = nPaquet; n < nMin; n++) { lstTmp.Add(nIdsElementsTotal[n]); } int[] nIdsElements = lstTmp.ToArray(); if (nIdsElements.Count() == 0) { return(result); } string strNomTable = CContexteDonnee.GetNomTableForType(typeObjets); if (strNomTable == null) { result.EmpileErreur(I.T("Can not find table for type '@1'|20011"), DynamicClassAttribute.GetNomConvivial(typeObjets)); return(result); } CStructureTable structure = CStructureTable.GetStructure(typeObjets); StringBuilder blIds = new StringBuilder(); foreach (int nId in nIdsElements) { blIds.Append(nId); blIds.Append(','); } if (blIds.Length == 0) { return(result); } blIds.Remove(blIds.Length - 1, 1); //Si autoref, va tout chercher d'un coup if (typeof(IObjetDonneeAutoReference).IsAssignableFrom(typeObjets)) { HashSet <int> setIds = new HashSet <int>(); foreach (int nId in nIdsElements) { setIds.Add(nId); } //Va cherche toutes les dépendances int nNbLast = setIds.Count(); while (true) { foreach (CInfoRelation rel in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (rel.TableFille == rel.TableParente) { int[] idsFilles = null; CFiltreData filtre = new CFiltreData(rel.ChampsFille[0] + " in (" + blIds.ToString() + ")"); result = GetIdsFilles( typeObjets, filtre, out idsFilles); if (!result) { return(result); } foreach (int nId in idsFilles) { setIds.Add(nId); } } } nIdsElements = setIds.ToArray(); if (nNbLast == setIds.Count) { break; } blIds = new StringBuilder(); foreach (int nId in setIds) { blIds.Append(nId); blIds.Append(','); } blIds.Remove(blIds.Length - 1, 1); nNbLast = setIds.Count; } } //Suppression des relations filles foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (info.TableParente == strNomTable && info.TableFille != strNomTable) { Type typeFils = CContexteDonnee.GetTypeForTable(info.TableFille); int[] lstIdsFils = null; CFiltreData filtre = new CFiltreData( info.ChampsFille[0] + " in (" + blIds.ToString() + ")"); result = GetIdsFilles(typeFils, filtre, out lstIdsFils); if (!result) { return(result); } if (lstIdsFils.Count() > 0) { result = PurgeEntites(typeFils, lstIdsFils, dataModifs); } if (!result) { return(result); } } } //Suppression des relations TypeId if (typeObjets.GetCustomAttributes(typeof(NoRelationTypeIdAttribute), true).Length == 0) { foreach (RelationTypeIdAttribute rel in CContexteDonnee.RelationsTypeIds) { if (rel.IsAppliqueToType(typeObjets)) { Type typeFils = CContexteDonnee.GetTypeForTable(rel.TableFille); result = TestTypePurgeable(typeFils); if (!result) { return(result); } CFiltreData filtre = new CFiltreData( rel.ChampId + " in (" + blIds + ") and " + rel.ChampType + "=@1", typeObjets.ToString()); int[] lstIdsFils = null; result = GetIdsFilles( typeFils, filtre, out lstIdsFils); if (!result) { return(result); } if (lstIdsFils.Count() > 0) { result = PurgeEntites(typeFils, lstIdsFils, dataModifs); } if (!result) { return(result); } } } } //Suppression des valeurs de champs if (m_listeTypesValeursChamps == null) { m_listeTypesValeursChamps = new List <Type>(); foreach (Type tp in CContexteDonnee.GetAllTypes()) { if (typeof(CRelationElementAChamp_ChampCustom).IsAssignableFrom(tp)) { m_listeTypesValeursChamps.Add(tp); } } } foreach (Type tp in m_listeTypesValeursChamps) { CFiltreData filtre = new CFiltreData( CRelationElementAChamp_ChampCustom.c_champValeurInt + " in (" + blIds.ToString() + ") and " + CRelationElementAChamp_ChampCustom.c_champValeurString + "=@1", typeObjets.ToString()); int[] idsFils = null; result = GetIdsFilles(tp, filtre, out idsFils); if (!result) { return(result); } if (idsFils.Length > 0) { result = PurgeEntites(tp, idsFils, dataModifs); } if (!result) { return(result); } } //Prépare les notifications foreach (int nId in nIdsElements) { dataModifs.AddModifiedRecord(strNomTable, true, new object[] { nId }); } //supprime les éléments //Et c'est parti pour la requete de suppression IDatabaseConnexion con; con = CSc2iDataServer.GetInstance().GetDatabaseConnexion(IdSession, typeObjets); string strWhere = structure.ChampsId[0].NomChamp + " in (" + blIds + ")"; strWhere = COracleDatabaseConnexion.PasseLaLimiteDesMilleIn(strWhere); string strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(strNomTable); result = con.ExecuteScalar("delete from " + strNomTableInDb + " where " + strWhere); if (!result) { return(result); } } 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); }
///////////////////////////////////////////////////////////////// /// <summary> /// Ajoute la suppression de relationsTypeId qui sont des compositions /// </summary> /// <returns></returns> public static CResultAErreur DoDeleteInterneACObjetDonneeNePasUtiliserSansBonneRaison(CListeObjetsDonnees liste, bool bDansContexteCourant) { CResultAErreur result = CResultAErreur.True; if (liste.Count == 0) { return(result); } Type typeElements = liste.TypeObjets; int nTailleBloc = 500; //Travaille par bloc de 500 éléments int nCount = liste.Count; for (int nBloc = 0; nBloc < nCount; nBloc += nTailleBloc) { StringBuilder blIds = new StringBuilder(); int nMin = Math.Min(nBloc + nTailleBloc, nCount); for (int nElement = nBloc; nElement < nMin; nElement++) { if (((CObjetDonneeAIdNumerique)liste[nElement]).IsValide()) { blIds.Append(((CObjetDonneeAIdNumerique)liste[nElement]).Id); blIds.Append(','); } } if (blIds.Length > 0) { blIds.Remove(blIds.Length - 1, 1); { string strListeIds = blIds.ToString(); //Supprime tous les fils de relation TypeId foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds) { if (relation.Composition) { Type tpLiens = CContexteDonnee.GetTypeForTable(relation.TableFille); if (relation.IsAppliqueToType(typeElements)) { CListeObjetsDonnees listeTypeId = new CListeObjetsDonnees(liste.ContexteDonnee, tpLiens, false); CFiltreData filtre = new CFiltreData( relation.ChampType + "=@1 and " + relation.ChampId + " in (" + strListeIds + ")", typeElements.ToString()); listeTypeId.Filtre = filtre; listeTypeId.PreserveChanges = true; result = DoDeleteInterneACObjetDonneeNePasUtiliserSansBonneRaison(listeTypeId, bDansContexteCourant); if (!result) { return(result); } } } } } } } List <CInfoRelation> relationsAMettreANull = new List <CInfoRelation>(); string strNomTable = CContexteDonnee.GetNomTableForType(liste.TypeObjets); foreach (CInfoRelation info in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (info.PasserLesFilsANullLorsDeLaSuppression && info.TableParente == strNomTable) { relationsAMettreANull.Add(info); } } //Met à null ce qui doit l'être for (int nBloc = 0; nBloc < nCount; nBloc += nTailleBloc) { int nMin = Math.Min(nBloc + nTailleBloc, nCount); StringBuilder bl = new StringBuilder(); for (int nElt = nBloc; nElt < nMin; nElt++) { if (((CObjetDonneeAIdNumerique)liste[nElt]).IsValide()) { bl.Append(((CObjetDonneeAIdNumerique)liste[nElt]).Id); bl.Append(','); } } bl.Remove(bl.Length - 1, 1); if (bl.Length > 0) { foreach (CInfoRelation relationToNull in relationsAMettreANull) { CListeObjetsDonnees lstFils = new CListeObjetsDonnees(liste.ContexteDonnee, CContexteDonnee.GetTypeForTable(relationToNull.TableFille)); lstFils.Filtre = new CFiltreData(relationToNull.ChampsFille[0] + " in(" + bl.ToString() + ")"); lstFils.Filtre.IgnorerVersionDeContexte = true; lstFils.Filtre.IntegrerLesElementsSupprimes = true; lstFils.PreserveChanges = true; foreach (CObjetDonnee fils in lstFils.ToArrayList()) { fils.Row.Row.BeginEdit(); foreach (string strChamp in relationToNull.ChampsFille) { fils.Row.Row[strChamp] = DBNull.Value; } fils.Row.Row.EndEdit(); } } } } foreach (CObjetDonneeAIdNumerique objet in liste.ToArrayList()) { try { if (objet.Row.RowState != DataRowState.Deleted && objet.Row.RowState != DataRowState.Detached) { objet.Row.Row.Sc2iDelete(); } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); return(result); } } return(result); }
//////////////////////////////////////////////////////////// public static CResultAErreur CanDelete(CListeObjetsDonnees liste) { CResultAErreur result = CResultAErreur.True; if (liste.Count == 0) { return(result); } bool bPasObjetAIdNumeriqueAuto = false; foreach (CObjetDonnee objet in liste) { if (!(objet is CObjetDonneeAIdNumerique)) { bPasObjetAIdNumeriqueAuto = true; result = objet.CanDelete(); } else { result = ((CObjetDonneeAIdNumerique)objet).MyCanDelete(); } if (!result) { return(result); } } if (bPasObjetAIdNumeriqueAuto) { return(result); } Type typeElements = liste.TypeObjets; string strListeIds = ""; int nCount = liste.Count; int nTailleParBloc = 500; string strNomTable = CContexteDonnee.GetNomTableForType(liste.TypeObjets); //Copie de la liste, pour sécuriser le parcours List <CObjetDonneeAIdNumerique> lstElements = liste.ToList <CObjetDonneeAIdNumerique>(); //Travaille par bloc de 500 enregistrements pour les contrôles for (int nBloc = 0; nBloc < nCount; nBloc += nTailleParBloc) { StringBuilder bl = new StringBuilder(); int nMin = Math.Min(nBloc + nTailleParBloc, nCount); //Liste des éléments du bloc en cours for (int nElement = nBloc; nElement < nMin; nElement++) { bl.Append(lstElements[nElement].Id); bl.Append(','); } if (bl.Length > 0) { bl.Remove(bl.Length - 1, 1); //Liste des objets du bloc en cours CListeObjetsDonnees listePartielle = new CListeObjetsDonnees(liste.ContexteDonnee, liste.TypeObjets, false); listePartielle.Filtre = new CFiltreData( liste.ContexteDonnee.GetTableSafe(strNomTable).PrimaryKey[0].ColumnName + " in (" + bl.ToString() + ")");; listePartielle.InterditLectureInDB = true; //Pas besoin de lire car les éléments sont déjà dans le contexte de données listePartielle.Filtre.IntegrerLesElementsSupprimes = liste.Filtre != null? liste.Filtre.IntegrerLesElementsSupprimes: (liste.FiltrePrincipal != null?liste.FiltrePrincipal.IntegrerLesElementsSupprimes:false); listePartielle.Filtre.IgnorerVersionDeContexte = liste.Filtre != null ? liste.Filtre.IgnorerVersionDeContexte: (liste.FiltrePrincipal != null ? liste.FiltrePrincipal.IgnorerVersionDeContexte : false); strListeIds = bl.ToString(); foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (relation.TableParente == strNomTable) //Relation fille { if (!relation.Composition) //Ce n'est pas une composition, il ne faut pas qu'il y ait de fils { if (!relation.PasserLesFilsANullLorsDeLaSuppression) //Sinon, ce n'est pas grave ! { IObjetServeur objServeur = liste.ContexteDonnee.GetTableLoader(relation.TableFille); //Ceux pour lesquels les dépendances sont chargés n'ont pas besoin de regarder la base StringBuilder strIdsAVoirDansLaBase = new StringBuilder(); DataRelation dataRel = null; foreach (DataRelation childRel in liste.ContexteDonnee.GetTableSafe(relation.TableParente).ChildRelations) { bool bCestElle = false; if (childRel.ChildTable.TableName == relation.TableFille) { if (childRel.ChildColumns.Length == relation.ChampsFille.Length) { bCestElle = true; for (int nCol = 0; nCol < childRel.ChildColumns.Length; nCol++) { if (childRel.ChildColumns[nCol].ColumnName != relation.ChampsFille[nCol]) { bCestElle = false; break; } } } } if (bCestElle) { dataRel = childRel; break; } } if (dataRel != null) { foreach (CObjetDonneeAIdNumerique objetTmp in listePartielle) { string strFKName = objetTmp.ContexteDonnee.GetForeignKeyName(dataRel); if (objetTmp.IsDependanceChargee(strFKName)) { DataRow[] rowsFilles = objetTmp.Row.Row.GetChildRows(dataRel); if (rowsFilles.Length > 0) { result.EmpileErreur(I.T("Cannot delete element @1, @2 elements (@3) are linked|190", objetTmp.DescriptionElement, rowsFilles.Length.ToString(), relation.TableFille)); return(result); } } else { strIdsAVoirDansLaBase.Append(objetTmp.Id); strIdsAVoirDansLaBase.Append(','); } } if (strIdsAVoirDansLaBase.Length > 0) { strIdsAVoirDansLaBase.Remove(strIdsAVoirDansLaBase.Length - 1, 1); } } else { strIdsAVoirDansLaBase.Append(strListeIds); } if (strIdsAVoirDansLaBase.Length > 0) { CFiltreData filtre = new CFiltreData(relation.ChampsFille[0] + " in (" + strIdsAVoirDansLaBase.ToString() + ")"); int nNb = objServeur.CountRecords(relation.TableFille, filtre); if (nNb != 0) { Type tp = CContexteDonnee.GetTypeForTable(relation.TableFille); result.EmpileErreur(I.T("Cannot delete '@1' elements because '@2' elements are dependent|160", DynamicClassAttribute.GetNomConvivial(typeElements), DynamicClassAttribute.GetNomConvivial(tp))); return(result); } } } } else //C'est une composition { CListeObjetsDonnees listeDep = listePartielle.GetDependancesFilles(relation, liste.Filtre != null && liste.Filtre.IntegrerLesElementsSupprimes || liste.FiltrePrincipal != null && liste.FiltrePrincipal.IntegrerLesElementsSupprimes); result = CanDelete(listeDep); if (!result) { return(result); } } } } //Peut-on supprimer les relationsTypeId foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds) { Type tpLiens = CContexteDonnee.GetTypeForTable(relation.TableFille); if (relation.AppliquerContrainteIntegrite && !relation.CanDeleteToujours && relation.IsAppliqueToType(typeElements)) { CListeObjetsDonnees listeTypeId = new CListeObjetsDonnees(liste.ContexteDonnee, tpLiens, false); CFiltreData filtre = new CFiltreData( relation.ChampType + "=@1 and " + relation.ChampId + " in (" + strListeIds + ")", typeElements.ToString()); listeTypeId.Filtre = filtre; if (relation.Composition) { result = CanDelete(listeTypeId); if (!result) { return(result); } } else { int nNb = listeTypeId.CountNoLoad; if (nNb != 0) { Type tp = CContexteDonnee.GetTypeForTable(relation.TableFille); result.EmpileErreur(I.T("Cannot delete the required elements because elements @1 exist in database|161", DynamicClassAttribute.GetNomConvivial(tpLiens))); return(result); } } } } if (IsUtiliseDansVersionFuture(liste, strListeIds)) { result.EmpileErreur(I.T("Cannot delete these elements because they will be used in future versions|187")); return(result); } } } return(result); }
//////////////////////////////////////////////////////////// public static CResultAErreur DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(CListeObjetsDonnees liste, bool bDansContexteCourant) { CResultAErreur result = CResultAErreur.True; bool bOldEnforce = liste.ContexteDonnee.EnforceConstraints; StringBuilder bl = new StringBuilder(); foreach (CObjetDonneeAIdNumerique objetTmp in liste) { if (objetTmp.IsValide()) { bl.Append(objetTmp.Id); bl.Append(','); } } if (bl.Length == 0) { return(result); } bl.Remove(bl.Length - 1, 1); if (IsUtiliseDansVersionFuture(liste, bl.ToString())) { result.EmpileErreur(I.T("Cannot delete these elements because they will be used in future versions|187")); return(result); } try { liste.ContexteDonnee.EnforceConstraints = false; if (liste.Count == 0) { return(result); } foreach (CObjetDonneeAIdNumerique objet in liste) { if (objet.IsValide()) { result = objet.MyCanDelete(); if (!result) { return(result); } } } Type typeElements = liste.TypeObjets; string strListeIds = ""; foreach (CObjetDonneeAIdNumerique objet in liste) { if (objet.IsValide()) { strListeIds += objet.Id.ToString() + ","; } } strListeIds = strListeIds.Substring(0, strListeIds.Length - 1); string strNomTable = CContexteDonnee.GetNomTableForType(liste.TypeObjets); foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(strNomTable)) { if (relation.TableParente == strNomTable) { //Car la dépendance doit être lue pour la suppression CListeObjetsDonnees listeDep = liste.GetDependancesFilles(relation); result = DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(listeDep, bDansContexteCourant); if (!result) { return(result); } } } if (typeElements.GetCustomAttributes(typeof(NoRelationTypeIdAttribute), true).Length == 0) { //Peut-on supprimer les relationsTypeId foreach (RelationTypeIdAttribute relation in CContexteDonnee.RelationsTypeIds) { Type tpLiens = CContexteDonnee.GetTypeForTable(relation.TableFille); CListeObjetsDonnees listeTypeId = new CListeObjetsDonnees(liste.ContexteDonnee, tpLiens, false); CFiltreData filtre = new CFiltreData( relation.ChampType + "=@1 and " + relation.ChampId + " in (" + strListeIds + ")", typeElements.ToString()); listeTypeId.Filtre = filtre; listeTypeId.PreserveChanges = true; result = DeleteAvecCascadeSansControleDoncIlFautEtreSurDeSoi(listeTypeId, bDansContexteCourant); } } foreach (CObjetDonneeAIdNumerique objet in liste.ToArrayList()) { if (objet.IsValide()) { result = objet.DoDeleteInterneACObjetDonneeNePasUtiliserSansBonneRaison(bDansContexteCourant); if (!result) { return(result); } } } } catch (Exception e) { result.EmpileErreur(new CErreurException(e)); } finally { try { liste.ContexteDonnee.EnforceConstraints = bOldEnforce; } catch { if (liste.ContexteDonnee.HasErrors) { foreach (DataTable table in liste.ContexteDonnee.Tables) { if (table.HasErrors) { foreach (DataRow row in table.Rows) { if (row.HasErrors) { string strKey = ""; foreach (DataColumn col in table.PrimaryKey) { strKey += row[col].ToString() + "/"; } result.EmpileErreur("Error while deleting (" + table.TableName + "[" + strKey + "] : " + row.RowError); } } } } } } } return(result); }