//---------------------------------------------------- public static string GetIdUniverselFromId(Type typeElement, int nId) { string strNomTable = CContexteDonnee.GetNomTableForType(typeElement); CStructureTable structure = CStructureTable.GetStructure(typeElement); C2iRequeteAvancee rq = new C2iRequeteAvancee(); rq.TableInterrogee = strNomTable; rq.FiltreAAppliquer = new CFiltreData( structure.ChampsId[0].NomChamp + "=@1", nId); rq.ListeChamps.Add(new C2iChampDeRequete( "UniversalId", new CSourceDeChampDeRequete(CObjetDonnee.c_champIdUniversel), typeof(string), OperationsAgregation.None, true)); CResultAErreur result = rq.ExecuteRequete(0); if (result && result.Data is DataTable) { DataTable table = result.Data as DataTable; if (table.Rows.Count > 0) { return((string)table.Rows[0][0]); } } return(""); }
public static List <CInfoTypeElementInDb> GetInfosInDatabase(int nIdSession) { List <CInfoTypeElementInDb> lst = new List <CInfoTypeElementInDb>(); foreach (Type tp in CContexteDonnee.GetAllTypes()) { CStructureTable structure = CStructureTable.GetStructure(tp); C2iRequeteAvancee requete = new C2iRequeteAvancee(); requete.TableInterrogee = CContexteDonnee.GetNomTableForType(tp); requete.ListeChamps.Add(new C2iChampDeRequete("NBELEMENTS", new CSourceDeChampDeRequete(structure.Champs[0].NomChamp), typeof(int), OperationsAgregation.Number, false)); CInfoTypeElementInDb info = new CInfoTypeElementInDb(tp); CResultAErreur result = requete.ExecuteRequete(nIdSession); if (result && result.Data is DataTable) { info.NbElements = (int)((DataTable)result.Data).Rows[0][0]; } if (!typeof(IObjetSansVersion).IsAssignableFrom(tp)) { requete.FiltreAAppliquer = new CFiltreData(CSc2iDataConst.c_champIdVersion + " is not null and " + CSc2iDataConst.c_champIsDeleted + "=@1", false); requete.FiltreAAppliquer.IgnorerVersionDeContexte = true; result = requete.ExecuteRequete(nIdSession); if (result && result.Data is DataTable) { info.NbElementsPrevisionnels = (int)((DataTable)result.Data).Rows[0][0]; } requete.FiltreAAppliquer = new CFiltreData(CSc2iDataConst.c_champIsDeleted + "=@1", true); requete.FiltreAAppliquer.IgnorerVersionDeContexte = true; result = requete.ExecuteRequete(nIdSession); if (result && result.Data is DataTable) { info.NbElementsSupprimes = (int)((DataTable)result.Data).Rows[0][0]; } } lst.Add(info); } return(lst); }
///////////////////////////////////////////////////////// /// <summary> /// Retourne la liste des versions à lire pour lire une version, /// il s'agit des version précédentes et de la version elle même /// </summary> /// <param name="nIdVersion"></param> /// <returns></returns> public static int[] GetVersionsToRead(int nIdSession, int nIdVersion) { List <int> idsVersions = new List <int>(); int? nIdToRead = nIdVersion; while (nIdToRead != null) { idsVersions.Add((int)nIdToRead); C2iRequeteAvancee requete = new C2iRequeteAvancee(-1); requete.TableInterrogee = CVersionDonnees.c_nomTable; requete.FiltreAAppliquer = new CFiltreData(CVersionDonnees.c_champId + "=@1", nIdToRead); requete.FiltreAAppliquer.IgnorerVersionDeContexte = true; requete.ListeChamps.Add(new C2iChampDeRequete("Id", new CSourceDeChampDeRequete(CVersionDonnees.c_champIdVersionParente), typeof(int), OperationsAgregation.None, true)); CResultAErreur result = requete.ExecuteRequete(nIdSession); if (result) { object val = ((DataTable)result.Data).Rows[0][0]; if (val == DBNull.Value) { nIdToRead = null; } else { nIdToRead = (int)val; } } else { nIdToRead = null; } } return(idsVersions.ToArray()); }
//--------------------------------------------- /// <summary> /// Retourne un dictionnaire contenant tous les champs modifiés pour /// des versions données et des objets donnés /// </summary> /// <returns></returns> public Dictionary <int, Dictionary <int, Dictionary <CReferenceChampPourVersion, bool> > > GetDictionnaireChampsModifies( int nIdSession, string strIdsVersionsConcernees, Type typeElements, DataRow[] rows) { CResultAErreur result = CResultAErreur.True; if (rows.Length == 0) { return(new Dictionary <int, Dictionary <int, Dictionary <CReferenceChampPourVersion, bool> > >()); } //Crée la liste des ids string strPrimKey = rows[0].Table.PrimaryKey[0].ColumnName; StringBuilder blIds = new StringBuilder(); foreach (DataRow row in rows) { //Les modifications portent toujours sur l'élément le plus proche du référentiel, //Donc sur l'original Id ou l'id s'il n'y a pas d'original if (row[CSc2iDataConst.c_champOriginalId] == DBNull.Value) { blIds.Append(row[strPrimKey].ToString()); } else { blIds.Append(row[CSc2iDataConst.c_champOriginalId].ToString()); } blIds.Append(","); } blIds.Remove(blIds.Length - 1, 1); C2iRequeteAvancee requete = new C2iRequeteAvancee(-1); requete.TableInterrogee = CVersionDonneesObjetOperation.c_nomTable; requete.ListeChamps.Add(new C2iChampDeRequete("Id", new CSourceDeChampDeRequete(CVersionDonneesObjet.c_nomTable + "." + CVersionDonneesObjet.c_champIdElement), typeof(int), OperationsAgregation.None, true)); requete.ListeChamps.Add(new C2iChampDeRequete("IdVersion", new CSourceDeChampDeRequete(CVersionDonneesObjet.c_nomTable + "." + CVersionDonnees.c_champId), typeof(int), OperationsAgregation.None, true)); requete.ListeChamps.Add(new C2iChampDeRequete("Field", new CSourceDeChampDeRequete(CVersionDonneesObjetOperation.c_champChamp), typeof(string), OperationsAgregation.None, true)); requete.ListeChamps.Add(new C2iChampDeRequete("FieldType", new CSourceDeChampDeRequete(CVersionDonneesObjetOperation.c_champTypeChamp), typeof(string), OperationsAgregation.None, true)); CFiltreData filtre = new CFiltreDataAvance(CVersionDonneesObjetOperation.c_nomTable, CVersionDonneesObjet.c_nomTable + "." + CVersionDonnees.c_champId + " in (" + strIdsVersionsConcernees + ") and " + CVersionDonneesObjet.c_nomTable + "." + CVersionDonneesObjet.c_champIdElement + " in (" + blIds.ToString() + ") and " + CVersionDonneesObjet.c_nomTable + "." + CVersionDonneesObjet.c_champTypeElement + "=@1 and " + CVersionDonneesObjetOperation.c_champTypeChamp + "=@2", typeElements.ToString(), CChampPourVersionInDb.c_TypeChamp); filtre.IgnorerVersionDeContexte = true; requete.FiltreAAppliquer = filtre; Dictionary <int, Dictionary <int, Dictionary <CReferenceChampPourVersion, bool> > > dicoChampsModifies = new Dictionary <int, Dictionary <int, Dictionary <CReferenceChampPourVersion, bool> > >(); result = requete.ExecuteRequete(nIdSession); if (!result) { return(dicoChampsModifies); } foreach (DataRow rowModif in ((DataTable)result.Data).Rows) { int nIdVersion = (int)rowModif["IdVersion"]; Dictionary <int, Dictionary <CReferenceChampPourVersion, bool> > dicoChampsDeVersion = null; if (!dicoChampsModifies.TryGetValue(nIdVersion, out dicoChampsDeVersion)) { dicoChampsDeVersion = new Dictionary <int, Dictionary <CReferenceChampPourVersion, bool> >(); dicoChampsModifies[nIdVersion] = dicoChampsDeVersion; } Dictionary <CReferenceChampPourVersion, bool> dicoChampsDeId = null; if (!dicoChampsDeVersion.TryGetValue((int)rowModif["Id"], out dicoChampsDeId)) { dicoChampsDeId = new Dictionary <CReferenceChampPourVersion, bool>(); dicoChampsDeVersion[(int)rowModif["Id"]] = dicoChampsDeId; } dicoChampsDeId[ new CReferenceChampPourVersion((string)rowModif["FieldType"], (string)rowModif["Field"])] = true; } return(dicoChampsModifies); }
//------------------------------------- /// <summary> /// Retourne tous les fils qui étaient affecté à l'objet à l'époque /// </summary> /// <param name="objet"></param> /// <param name="relationFille"></param> /// <returns></returns> public int[] GetIdsChildsHistoriques(CObjetDonneeAIdNumerique objet, CInfoRelation relationFille) { Type tpFils = CContexteDonnee.GetTypeForTable(relationFille.TableFille); if (!typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpFils)) { return(new int[0]); } CChampPourVersionInDb champFille = new CChampPourVersionInDb(relationFille.ChampsFille[0], ""); //Recherche toutes les modifications de la propriété fille CListeObjetsDonnees listeModifsFilles = new CListeObjetsDonnees(objet.ContexteDonnee, typeof(CVersionDonneesObjetOperation)); listeModifsFilles.Filtre = new CFiltreDataAvance( CVersionDonneesObjetOperation.c_nomTable, CVersionDonneesObjetOperation.c_champChamp + "=@1 and " + CVersionDonneesObjetOperation.c_champTypeChamp + "=@2 and " + CVersionDonneesObjet.c_nomTable + "." + CVersionDonneesObjet.c_champTypeElement + "=@3 and " + CVersionDonneesObjet.c_nomTable + "." + CVersionDonnees.c_nomTable + "." + CVersionDonnees.c_champTypeVersion + "=@4 and " + CVersionDonneesObjet.c_nomTable + "." + CVersionDonnees.c_champId + ">=@5", champFille.FieldKey, champFille.TypeChampString, tpFils.ToString(), (int)CTypeVersion.TypeVersion.Archive, Id); listeModifsFilles.Tri = CVersionDonneesObjetOperation.c_champId + " desc"; listeModifsFilles.ReadDependances("VersionObjet"); ArrayList lstFils = new ArrayList(); //Remplit la liste des fils avec les fils actuels //Récupère la liste de tous les fils actuels //et supprimés depuis. En effet, un element supprimé depuis cette version mais qui est //toujours lié à l'objet était donc lié à l'objet à l'époque C2iRequeteAvancee requete = new C2iRequeteAvancee(-1); requete.TableInterrogee = relationFille.TableFille; C2iChampDeRequete champDeRequete = new C2iChampDeRequete("ID", new CSourceDeChampDeRequete(objet.ContexteDonnee.GetTableSafe(relationFille.TableFille).PrimaryKey[0].ColumnName), typeof(int), OperationsAgregation.None, true); requete.ListeChamps.Add(champDeRequete); CFiltreData filtre = new CFiltreData(relationFille.ChampsFille[0] + "=@1 and (" + CSc2iDataConst.c_champIdVersion + " is null or " + CSc2iDataConst.c_champIdVersion + ">=@2)", objet.Id, Id); filtre.IgnorerVersionDeContexte = true; requete.FiltreAAppliquer = filtre; CResultAErreur result = requete.ExecuteRequete(objet.ContexteDonnee.IdSession); if (result) { foreach (DataRow row in ((DataTable)result.Data).Rows) { lstFils.Add(row[0]); } } foreach (CVersionDonneesObjetOperation data in listeModifsFilles) { if (data.GetValeur() is int && (int)data.GetValeur() == objet.Id) { if (!lstFils.Contains(data.VersionObjet.IdElement)) { lstFils.Add(data.VersionObjet.IdElement); } } else { lstFils.Remove(data.VersionObjet.IdElement); } } //Toutes les entités créées après la version ont également été ajoutées, //Donc n'y étaient pas if (lstFils.Count > 0) { StringBuilder builder = new StringBuilder(); foreach (int nId in lstFils) { builder.Append(nId.ToString()); builder.Append(","); } string strIds = builder.ToString(); strIds = strIds.Substring(0, strIds.Length - 1); requete = new C2iRequeteAvancee(-1); requete.TableInterrogee = CVersionDonneesObjet.c_nomTable; requete.FiltreAAppliquer = new CFiltreData( CVersionDonneesObjet.c_champIdElement + " in (" + strIds + ") and " + CVersionDonneesObjet.c_champTypeElement + "=@1 and " + CVersionDonneesObjet.c_champTypeOperation + "=@2 and " + CVersionDonnees.c_champId + ">=@3", tpFils.ToString(), CTypeOperationSurObjet.TypeOperation.Ajout, Id); requete.FiltreAAppliquer.IgnorerVersionDeContexte = true; requete.ListeChamps.Add(new C2iChampDeRequete("Id", new CSourceDeChampDeRequete(CVersionDonneesObjet.c_champIdElement), typeof(int), OperationsAgregation.None, true)); result = requete.ExecuteRequete(ContexteDonnee.IdSession); if (result) { foreach (DataRow row in ((DataTable)result.Data).Rows) { lstFils.Remove(row[0]); } } } return((int[])lstFils.ToArray(typeof(int))); }