Beispiel #1
0
        //----------------------------------------------------
        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);
        }
Beispiel #3
0
        /////////////////////////////////////////////////////////
        /// <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);
        }
Beispiel #5
0
        //-------------------------------------
        /// <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)));
        }