Esempio n. 1
0
        //---------------------------------------------------------------------
        public CResultAErreur AppliqueValeur(int?nIdVersion, IChampPourVersion champ, CObjetDonneeAIdNumerique objet, object valeur)
        {
            CResultAErreur result = CResultAErreur.True;

            if (objet.Row.Table.Columns.Contains(champ.FieldKey))
            {
                try
                {
                    if (valeur is byte[])
                    {
                        CDonneeBinaireInRow data = new CDonneeBinaireInRow(objet.ContexteDonnee.IdSession, objet.Row.Row, champ.FieldKey);
                        data.Donnees = (byte[])valeur;
                        objet.Row[champ.FieldKey] = data;
                    }
                    else if (valeur is IDifferencesBlob)
                    {
                        CContexteDonnee ctx = new CContexteDonnee(objet.ContexteDonnee.IdSession, true, false);

                        result = ctx.SetVersionDeTravail(nIdVersion, false);
                        if (!result)
                        {
                            return(result);
                        }
                        CObjetDonneeAIdNumerique objetDansVersion = (CObjetDonneeAIdNumerique)Activator.CreateInstance(objet.GetType(), new object[] { ctx });
                        if (objetDansVersion.ReadIfExists(objet.Id))
                        {
                            CDonneeBinaireInRow dataInVersion = new CDonneeBinaireInRow(ctx.IdSession, objetDansVersion.Row.Row, champ.FieldKey);

                            CDonneeBinaireInRow data = new CDonneeBinaireInRow(objet.ContexteDonnee.IdSession, objet.Row.Row, champ.FieldKey);
                            data.Donnees = dataInVersion.Donnees;
                            objet.Row[champ.FieldKey] = data;
                        }
                        else
                        {
                            throw new Exception(I.T("Error|199"));
                        }
                    }
                    else
                    {
                        objet.Row[champ.FieldKey] = valeur == null ? DBNull.Value : valeur;
                    }
                }
                catch
                {
                    try
                    {
                        bool bOldEnforce = objet.ContexteDonnee.EnforceConstraints;
                        objet.ContexteDonnee.EnforceConstraints = false;
                        objet.Row[champ.FieldKey] = valeur == null ? DBNull.Value : valeur;
                        objet.ContexteDonnee.AssureParents(objet.Row.Row);
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                        result.EmpileErreur(I.T("Error while applying value for field @1|189", champ.NomConvivial));
                    }
                }
            }
            return(result);
        }
Esempio n. 2
0
        //---------------------------------------------
        protected override CResultAErreur MyCanDelete()
        {
            CResultAErreur result = base.MyCanDelete();

            if (!result)
            {
                return(result);
            }
            if (VersionDonnees.CodeTypeVersion != (int)CTypeVersion.TypeVersion.Previsionnelle)
            {
                return(result);
            }
            //Vérifie qu'il n'y a pas d'objet dans la base associé à la version et
            //à cet objet
            CObjetDonneeAIdNumerique objet = Element;

            if (objet != null)
            {
                CListeObjetsDonnees liste = new CListeObjetsDonnees(ContexteDonnee, Element.GetType());
                liste.Filtre = new CFiltreData(
                    "(" + Element.GetChampId() + "=@1 or " +
                    CSc2iDataConst.c_champOriginalId + "=@1) and " +
                    CSc2iDataConst.c_champIdVersion + "=@2",
                    IdElement,
                    VersionDonnees.Id);
                liste.Filtre.IgnorerVersionDeContexte = true;
                liste.PreserveChanges = true;
                if (liste.Count > 0)
                {
                    result.EmpileErreur(I.T("You should cancel the modifications before deleting this version|188"));
                    return(result);
                }
            }
            return(result);
        }
        /// <summary>
        /// Retourne vrai si l'objet est utilisé dans une version future
        /// </summary>
        /// <param name="objet"></param>
        /// <returns></returns>
        public bool IsUtiliseDansVersionFuture(CObjetDonneeAIdNumerique objet)
        {
            CListeObjetsDonnees liste = new CListeObjetsDonnees(objet.ContexteDonnee, objet.GetType(), false);

            liste.Filtre = new CFiltreData(objet.GetChampId() + "=@1", objet.Id);
            liste.InterditLectureInDB = true;
            return(IsUtiliseDansVersionFuture(liste, objet.Id.ToString()));
        }
Esempio n. 4
0
        public static object GetValeur(
            DataRow row,
            string strChampString,
            string strChampBlob,
            string strChampType,
            CContexteDonnee ctx)
        {
            Type t = CActivatorSurChaine.GetType((string)row[strChampType]);

            if (t == typeof(IDifferencesBlob))
            {
                CDonneeBinaireInRow    blob       = GetBlob(row, strChampBlob, ctx);
                MemoryStream           stream     = new MemoryStream(blob.Donnees);
                BinaryReader           reader     = new BinaryReader(stream);
                CSerializerReadBinaire serializer = new CSerializerReadBinaire(reader);
                I2iSerializable        objet      = null;
                CResultAErreur         result     = serializer.TraiteObject(ref objet);

                reader.Close();
                stream.Close();

                if (result)
                {
                    return(objet);
                }
                System.Console.WriteLine(I.T("Error while deserializing blob diffs|30000"));
                return(null);
            }
            else if (t == typeof(byte[]))
            {
                CDonneeBinaireInRow blob = GetBlob(row, strChampBlob, ctx);
                if (blob != null)
                {
                    return(blob.Donnees);
                }
                else
                {
                    return(null);
                }
            }
            else if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(t))
            {
                int nId = Int32.Parse((string)row[strChampString]);
                CObjetDonneeAIdNumerique obj = (CObjetDonneeAIdNumerique)Activator.CreateInstance(t, new object[] { ctx });
                if (obj.ReadIfExists(nId))
                {
                    return(obj);
                }
                return(null);
            }
            else if (t != null && row[strChampString] != DBNull.Value)
            {
                return(CUtilTexte.FromUniversalString((string)row[strChampString], t));
            }
            return(null);
        }
        /// /////////////////////////////////////////////////////////////
        public CObjetDonneeAIdNumerique GetObjet( )
        {
            if (TypeModif == TypeModifLogSynchro.tDelete)
            {
                return(null);
            }
            CObjetDonneeAIdNumerique objet = (CObjetDonneeAIdNumerique)ContexteDonnee.GetNewObjetForTable(ContexteDonnee.GetTableSafe(TableConcernee));

            objet.Id = IdElement;
            return(objet);
        }
Esempio n. 6
0
        public CResultAErreur AppliqueModifications(CObjetDonneeAIdNumerique objetDest)
        {
            CResultAErreur result = CResultAErreur.True;

            foreach (CVersionDonneesObjetOperation data in Modifications)
            {
                result = data.AppliqueModification(objetDest);
                if (!result)
                {
                    return(result);
                }
            }
            return(result);
        }
Esempio n. 7
0
        //-------------------------------------------------------
        public CResultAErreur AppliqueModification(CObjetDonneeAIdNumerique objet)
        {
            CResultAErreur            result       = CResultAErreur.True;
            IJournaliseurDonneesChamp journaliseur = CGestionnaireAChampPourVersion.GetJournaliseur(TypeChamp);

            if (journaliseur == null)
            {
                result.EmpileErreur(I.T("Can not apply modifications for field @1 (@2)|30002",
                                        FieldKey, TypeChamp));
                return(result);
            }
            result = journaliseur.AppliqueValeur(VersionObjet.VersionDonnees.Id, Champ, objet, GetValeur());
            return(result);
        }
Esempio n. 8
0
        public object GetValeur(CObjetDonneeAIdNumerique obj, IChampPourVersion champ)
        {
            if (obj.Row.Table.Columns[champ.FieldKey].DataType == typeof(CDonneeBinaireInRow))
            {
                if (obj.Row[champ.FieldKey] == DBNull.Value)
                {
                    CDonneeBinaireInRow donnee = new CDonneeBinaireInRow(obj.ContexteDonnee.IdSession, obj.Row.Row, champ.FieldKey);
                    CContexteDonnee.ChangeRowSansDetectionModification(obj.Row.Row, champ.FieldKey, donnee);
                }

                /*DataRow row = obj.Row;
                 * DataTable tb = row.Table;
                 * IObjetServeur loader = ((CContexteDonnee)tb.DataSet).GetTableLoader(tb.TableName);
                 * CFiltreData filtre = CFiltreData.CreateFiltreAndSurRow(tb.PrimaryKey, row);
                 * ArrayList lstKeys = new ArrayList();
                 * foreach (DataColumn col in tb.PrimaryKey)
                 *      lstKeys.Add(row[col]);
                 * CResultAErreur result = loader.ReadBlob(champ.FieldKey, lstKeys.ToArray());
                 * if ( result )*/
            }
            return(obj.Row[champ.FieldKey] == DBNull.Value ? null : obj.Row[champ.FieldKey]);
        }
Esempio n. 9
0
        public List <IChampPourVersion> GetChampsJournalisables(CObjetDonneeAIdNumerique objet)
        {
            List <IChampPourVersion> champs = null;

            if (!m_dicTypeToChamps.TryGetValue(objet.GetType(), out champs))
            {
                champs = new List <IChampPourVersion>();

                CStructureTable   structure = CStructureTable.GetStructure(objet.GetType());
                CInfoChampTable[] allchamps = structure.Champs;

                List <string> lstChampsSys = CSc2iDataConst.GetNomsChampsSysteme();
                foreach (CInfoChampTable c in allchamps)
                {
                    if (c.m_bIsInDB && !lstChampsSys.Contains(c.NomChamp))
                    {
                        champs.Add(new CChampPourVersionInDb(c.NomChamp, c.NomConvivial));
                    }
                }
                m_dicTypeToChamps[objet.GetType()] = champs;
            }
            return(champs);
        }
Esempio n. 10
0
        /// //////////////////////////////////////////
        ///<summary>
        ///Charge les données de la table qui vont devoir être mise à jour
        ///à partir des données modifiées dans la table source
        ///</summary>
        public CResultAErreur ChargeDonneesAMettreAJour(DataSet donneesSources)
        {
            CResultAErreur result = CResultAErreur.True;

            ArrayList lstTables = CContexteDonnee.GetTablesOrderInsert(donneesSources);

            foreach (DataTable table in lstTables)
            {
                DataTable tableDest = null;
                //S'assure que la table est bien chargée
                try
                {
                    tableDest = GetTableSafe(table.TableName);
                }
                catch
                {
                    //La table n'existe pas
                }
                if (tableDest != null && m_mappeurTablesToClass.IsSynchronisable(table.TableName) && table.Rows.Count != 0)
                {
                    IObjetServeur serveur         = CContexteDonnee.GetTableLoader(tableDest.TableName, null, IdSession);
                    string        strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(tableDest.TableName);
                    if (serveur.CountRecords(strNomTableInDb, new CFiltreData("1=1")) != 0)                    //Première maj : copie complète
                    {
                        string strColPrim = table.PrimaryKey[0].ColumnName;
                        string strFiltre  = "";
                        foreach (DataRow row in table.Rows)
                        {
                            strFiltre += row[strColPrim].ToString() + ",";
                        }
                        if (strFiltre.Length != 0)
                        {
                            //Supprime la dernière virgule;
                            strFiltre = strFiltre.Substring(0, strFiltre.Length - 1);
                            strFiltre = strColPrim += " in (" + strFiltre + ")";
                            IObjetServeur loader   = GetTableLoader(table.TableName);
                            DataTable     tableNew = loader.Read(new CFiltreData(strFiltre));
                            if (table == null)
                            {
                                result.EmpileErreur(I.T("Error while reading table @1|128", table.TableName));
                                return(result);
                            }
                            IntegreTable(tableNew, false);
                        }
                    }
                }
            }
            //Charge les éléments à supprimer
            CContexteDonnee contexteForListe = new CContexteDonnee(IdSession, true, false);
            DataTable       tableSync        = donneesSources.Tables[CEntreeLogSynchronisation.c_nomTable];
            DataTable       tableCopie       = CUtilDataSet.AddTableCopie(donneesSources.Tables[CEntreeLogSynchronisation.c_nomTable], contexteForListe);

            foreach (DataRow row in tableSync.Rows)
            {
                tableCopie.ImportRow(row);
            }
            CListeObjetsDonnees liste = new CListeObjetsDonnees(contexteForListe, typeof(CEntreeLogSynchronisation));

            liste.InterditLectureInDB = true;
            liste.Filtre = new CFiltreData(CEntreeLogSynchronisation.c_champType + "=@1", (int)CEntreeLogSynchronisation.TypeModifLogSynchro.tDelete);
            foreach (CEntreeLogSynchronisation entree in liste)
            {
                DataTable table = GetTableSafe(entree.TableConcernee);
                CObjetDonneeAIdNumerique objet = (CObjetDonneeAIdNumerique)GetNewObjetForTable(table);
                objet.ReadIfExists(entree.IdElement);
            }
            return(result);
        }
Esempio n. 11
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)));
        }
Esempio n. 12
0
        //-------------------------------------
        /// <summary>
        /// Retourne toutes les valeurs qui ont été modifiées
        /// </summary>
        /// <param name="objet"></param>
        /// <returns></returns>
        public CValeursHistorique GetValeursModifiees(CObjetDonneeAIdNumerique objet, CVersionDonnees versionButoire)
        {
            CListeObjetsDonnees listeVersions = new CListeObjetsDonnees(objet.ContexteDonnee, typeof(CVersionDonneesObjet));
            CValeursHistorique  listeValeurs  = new CValeursHistorique();

            if (TypeVersion.Code != CTypeVersion.TypeVersion.Previsionnelle)
            {
                listeVersions.Filtre = new CFiltreDataAvance(
                    CVersionDonneesObjet.c_nomTable,
                    CVersionDonneesObjet.c_champIdElement + "=@1 and " +
                    CVersionDonneesObjet.c_champTypeElement + "=@2 and " +
                    CVersionDonnees.c_nomTable + "." +
                    CVersionDonnees.c_champTypeVersion + "=@3 and " +
                    CVersionDonnees.c_champId + ">=@4",
                    objet.Id,
                    objet.GetType().ToString(),
                    (int)CTypeVersion.TypeVersion.Archive,
                    Id);
                listeVersions.Tri = CVersionDonneesObjet.c_champId + " desc";
            }
            else
            {
                CVersionDonnees versionDerivee = this;
                if (versionButoire != null)
                {
                    if (versionButoire.Id > versionDerivee.Id)
                    {
                        CVersionDonnees versionTmp = versionButoire;
                        versionButoire = versionDerivee;
                        versionDerivee = versionTmp;
                    }
                }
                StringBuilder blIds = new StringBuilder();
                blIds.Append(versionDerivee.Id);
                CVersionDonnees versionParente = versionDerivee.VersionParente;
                while (VersionParente != null && versionButoire != null && !versionParente.Equals(versionButoire))
                {
                    blIds.Append(",");
                    blIds.Append(versionParente.Id);
                    versionParente = versionParente.VersionParente;
                }
                listeVersions.Filtre = new CFiltreData(
                    CVersionDonnees.c_champId + " in (" + blIds + ") and " +
                    CVersionDonneesObjet.c_champIdElement + "=@1 and " +
                    CVersionDonneesObjet.c_champTypeElement + "=@2",
                    objet.Id,
                    objet.GetType().ToString());
                listeVersions.Tri = CVersionDonnees.c_champId + " asc";
            }

            foreach (CVersionDonneesObjet version in listeVersions)
            {
                foreach (CVersionDonneesObjetOperation data in version.Modifications)
                {
                    IChampPourVersion champ = data.Champ;
                    if (champ != null)
                    {
                        listeValeurs[champ] = data.GetValeur();
                    }
                }
            }
            return(listeValeurs);
        }