////////////////////////////////////////////////////////////////////////////////////
        private void AssureDonnees()
        {
            if (m_bLoaded)
            {
                return;
            }
            IObjetServeur loader  = ((CContexteDonnee)m_row.Table.DataSet).GetTableLoader(m_row.Table.TableName);
            CFiltreData   filtre  = CFiltreData.CreateFiltreAndSurRow(m_row.Table.PrimaryKey, m_row);
            ArrayList     lstKeys = new ArrayList();

            foreach (DataColumn col in m_row.Table.PrimaryKey)
            {
                lstKeys.Add(m_row[col]);
            }
            CResultAErreur result = loader.ReadBlob(m_strChamp, lstKeys.ToArray());

            if (!result)
            {
                throw new CExceptionErreur(result.Erreur);
            }
            m_donnees = (byte[])result.Data;
            if (m_donnees != null)
            {
                m_donneesOriginales = (byte[])m_donnees.Clone();
            }
            else
            {
                m_donneesOriginales = null;
            }
            m_bLoaded = true;
        }
Beispiel #2
0
        //////////////////////////////////////////////////
        /// <summary>
        /// Crée un filtre and à partir des données d'une DataRow
        /// </summary>
        /// <param name="strChamps">
        /// Liste des champs
        /// </param>
        /// <param name="row">
        /// Ligne contenant les données
        /// </param>
        /// <returns></returns>
        public static CFiltreData CreateFiltreAndSurValeurs(string[] strChamps, object[] valeurs)
        {
            CFiltreData filtre = new CFiltreData( );
            int         nIndex = 1;

            foreach (string strChamp in strChamps)
            {
                filtre.Filtre += strChamp + "=@" + nIndex + " and ";
                filtre.Parametres.Add(valeurs[nIndex - 1]);
                nIndex++;
            }
            filtre.Filtre = filtre.Filtre.Substring(0, filtre.Filtre.Length - 5);
            return(filtre);
        }
Beispiel #3
0
        //////////////////////////////////////////////////
        /// <summary>
        /// Crée un filtre and à partir des données d'une DataRow
        /// </summary>
        /// <param name="strChamps">
        /// Liste des champs
        /// </param>
        /// <param name="row">
        /// Ligne contenant les données
        /// </param>
        /// <returns></returns>
        public static CFiltreData CreateFiltreAndSurRow(string[] strChamps, DataRow row, DataRowVersion version)
        {
            CFiltreData filtre = new CFiltreData( );
            int         nIndex = 1;

            foreach (string strChamp in strChamps)
            {
                filtre.Filtre += strChamp + "=@" + nIndex + " and ";
                filtre.Parametres.Add(row[strChamp, version]);
                nIndex++;
            }
            filtre.Filtre = filtre.Filtre.Substring(0, filtre.Filtre.Length - 5);
            return(filtre);
        }
Beispiel #4
0
 //////////////////////////////////////////////////
 protected void CopyTo(CFiltreData filtre)
 {
     filtre.Filtre = m_strFiltre;
     foreach (object param in Parametres)
     {
         filtre.Parametres.Add(param);
     }
     filtre.m_strSortOrder               = m_strSortOrder;
     filtre.IgnorerVersionDeContexte     = IgnorerVersionDeContexte;
     filtre.IntegrerLesElementsSupprimes = IntegrerLesElementsSupprimes;
     filtre.IdsDeVersionsALire           = IdsDeVersionsALire;
     filtre.IntergerParentsHierarchiques = IntergerParentsHierarchiques;
     filtre.IntegrerFilsHierarchiques    = IntegrerFilsHierarchiques;
     filtre.NeConserverQueLesRacines     = NeConserverQueLesRacines;
 }
Beispiel #5
0
        ////////////////////////////////////////////////////////
        public string GetString(CFiltreData filtre)
        {
            if (filtre is CFiltreDataAvance)
            {
                return(GetStringAvance((CFiltreDataAvance)filtre));
            }
            string strFiltre = filtre.Filtre;

            //Remplace le & (operateur binaire) qui n'est pas implémenté
            strFiltre = RemplaceEtOuBinaire(strFiltre, 0);

            int nNumParametre = 1;

            foreach (object obj in filtre.Parametres)
            {
                string strReplace = obj.ToString();
                if (obj is String)
                {
                    strReplace = strReplace.Replace("'", "''");
                    strReplace = "'" + strReplace + "'";
                }
                if (obj is DateTime)
                {
                    DateTime dt = (DateTime)obj;
                    strReplace = "#" + dt.ToString("MM/dd/yyyy HH:mm:ss") + "#";
                }
                if (obj is bool)
                {
                    strReplace = ((bool)obj)?"1":"0";
                }

                /*if ( strFiltre.IndexOf("@"+nNumParametre.ToString()) >= 0 )
                 *      strFiltre = strFiltre.Replace("@"+nNumParametre.ToString(), strReplace );
                 * else*/
                Regex ex = new Regex("(@" + nNumParametre.ToString() + ")(?<SUITE>[^0123456789]{1})");
                //stef 29/05/2012, les $ sont mals gérés dans une chaine de remplacement, et
                //ça met le bronx dans le replace.
                //On remplace donc les $ par une chaine improbables pour qu'il n'y ait
                //Plus de $ dans la chaine de replace
                strReplace = strReplace.Replace("$", "#~é&,解");
                strFiltre  = ex.Replace(strFiltre + " ", strReplace + "${SUITE}");
                strFiltre  = strFiltre.Replace("#~é&,解", "$");
                //strFiltre = strFiltre.Replace("@"+nNumParametre.ToString(), strReplace );
                nNumParametre++;
            }
            return(strFiltre);
        }
        //-----------------------------------------------------------------------
        //////////////////////////////////////////////////
        public static bool IsUnique(CObjetDonnee objet, string strChamp, string strValeurChamp)
        {
            if (objet == null)
            {
                return(true);
            }
            CFiltreData filtre = CFiltreData.CreateFiltreAndSurRow(objet.GetChampsId(), objet.Row);

            filtre.Filtre = strChamp + " like @" + (filtre.Parametres.Count + 1) + " and not(" + filtre.Filtre + ")";
            filtre.Parametres.Add(strValeurChamp);
            CListeObjetsDonnees liste = new CListeObjetsDonnees(objet.ContexteDonnee, objet.GetType());

            liste.Filtre = filtre;
            if (liste.CountNoLoad != 0)
            {
                return(false);
            }
            return(true);
        }
Beispiel #7
0
        /// <summary>
        /// Vérifie qu'une dataRow vérifie ses règles d'unicité
        /// </summary>
        /// <param name="row"></param>
        /// <returns></returns>
        private static CResultAErreur VerifieUnicite(DataRow row, List <CInfoFiltreUnique> listeFiltres, Type typeObjet)
        {
            CResultAErreur result = CResultAErreur.True;

            if (row.RowState == DataRowState.Detached ||
                row.RowState == DataRowState.Deleted)
            {
                return(result);
            }

            foreach (CInfoFiltreUnique info in listeFiltres)
            {
                CFiltreData filtre = new CFiltreData(info.Filtre.Filtre);
                filtre.Parametres.Add(row[row.Table.PrimaryKey[0]]);
                int           nIndex     = 2;
                List <string> lstValeurs = new List <String>();
                foreach (string strChamp in info.Attribute.Champs)
                {
                    if (!row.Table.Columns.Contains(strChamp))
                    {
                        return(result);
                    }
                    if (row[strChamp] == DBNull.Value)
                    {
                        filtre.Filtre.Replace("=@" + nIndex, " is null");
                        filtre.Parametres.Add("");
                    }
                    else
                    {
                        filtre.Parametres.Add(row[strChamp]);
                    }
                    lstValeurs.Add(row[strChamp].ToString());
                }
                CListeObjetsDonnees liste = new CListeObjetsDonnees((CContexteDonnee)row.Table.DataSet, typeObjet);
                liste.Filtre = filtre;
                if (liste.Count > 0)
                {
                    result.EmpileErreur(I.TT(typeObjet, info.Attribute.Message, lstValeurs.ToArray()));
                    return(result);
                }
            }
            return(result);
        }
Beispiel #8
0
        //-------------------------------------------------------------------------------------------
        private static CFiltreData GetFiltreSynchro(int nIdSession, int nIdSynchroDebut, int nIdSynchroFin, CFiltresSynchronisation filtres, DataTable table)
        {
            CFiltreData filtreSynchro = null;

            if (filtres != null)
            {
                filtreSynchro = filtres.GetFiltreForTable(nIdSession, table.TableName);
            }
            if (filtreSynchro == null)
            {
                filtreSynchro = new CFiltreData();
            }
            int    nNumParametreIdSync = filtreSynchro.Parametres.Count + 1;
            string strFiltre           = filtreSynchro.Filtre;

            filtreSynchro.Filtre = "(" + CSc2iDataConst.c_champIdSynchro + ">=@" + nNumParametreIdSync.ToString() + " and " +
                                   CSc2iDataConst.c_champIdSynchro + "<=@" + (nNumParametreIdSync + 1).ToString();
            if (nIdSynchroDebut == -1)
            //C'est la première synchro, intègre les éléments modifiés avant prise en charge
            //des synchros
            {
                if (filtreSynchro is CFiltreDataAvance)
                {
                    filtreSynchro.Filtre += " or hasno(" + CSc2iDataConst.c_champIdSynchro + ")";
                }
                else
                {
                    filtreSynchro.Filtre += " or " + CSc2iDataConst.c_champIdSynchro + " is null";
                }
            }
            filtreSynchro.Filtre += ")";
            if (strFiltre != "")
            {
                filtreSynchro.Filtre += " and (" + strFiltre + ")";
            }
            filtreSynchro.Parametres.Add(nIdSynchroDebut);
            filtreSynchro.Parametres.Add(nIdSynchroFin);
            return(filtreSynchro);
        }
        ////////////////////////////////////////////////////////////
        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);
        }
Beispiel #10
0
 public CListeObjetDonneeGenerique(CContexteDonnee contexte, CFiltreData filtrePrincipal)
     : base(contexte, typeof(TypeObjets), filtrePrincipal)
 {
 }
Beispiel #11
0
 public CInfoFiltreUnique(UniqueAttribute attr, CFiltreData filtre)
 {
     Attribute = attr;
     Filtre    = filtre;
 }
        /////////////////////////////////////////////////////////////////
        /// <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);
        }
Beispiel #13
0
 ///////////////////////////////////////////////////
 public static CFiltreData GetOrFiltre(CFiltreData filtre1, CFiltreData filtre2)
 {
     return(CombineFiltres(filtre1, filtre2, "OR"));
 }
        /// <summary>
        /// Retourne un filtre de recherche rapide pour le type demandé
        ///
        /// </summary>
        /// <param name="tp"></param>
        /// <param name="bContient">Indique que le filtre est un filtre 'Contient' et non 'Commence par'</param>
        /// <returns></returns>
        public static CFiltreData GetFiltreRapideForType(Type tp)
        {
            if (tp == null)
            {
                return(null);
            }
            CFiltreData filtreRetour = null;

            if (m_filtreRapideDelegate != null)
            {
                m_filtreRapideDelegate.Invoke(tp, ref filtreRetour);
            }
            if (filtreRetour != null)
            {
                return(filtreRetour);
            }
            bool      bAvance   = false;
            ArrayList lstChamps = new ArrayList();

            foreach (PropertyInfo prop in tp.GetProperties())
            {
                if (prop.PropertyType == typeof(string))
                {
                    bool bPrendre = false;
                    if (prop.Name.ToUpper() == "LIBELLE" || prop.Name.ToUpper() == "NOM")
                    {
                        bPrendre = true;
                    }
                    else
                    {
                        object[] attribs = prop.GetCustomAttributes(typeof(RechercheRapideAttribute), true);
                        bPrendre = attribs.Length > 0;
                    }
                    if (bPrendre)
                    {
                        //Cherche le nom du champ correspondant
                        object[] attribs = prop.GetCustomAttributes(typeof(TableFieldPropertyAttribute), true);
                        if (attribs.Length > 0)
                        {
                            TableFieldPropertyAttribute attr = (TableFieldPropertyAttribute)attribs[0];
                            lstChamps.Add(attr.NomChamp);
                        }
                    }
                }
            }
            object[] attribsClasse = tp.GetCustomAttributes(typeof(RechercheRapideAttribute), true);
            foreach (RechercheRapideAttribute attr in attribsClasse)
            {
                if (attr.ChampFiltre != "")
                {
                    lstChamps.Add(attr.ChampFiltre);
                }
                if (attr.ChampFiltre.IndexOf('.') >= 0)
                {
                    bAvance = true;
                }
            }
            if (lstChamps.Count == 0)
            {
                return(null);
            }
            string strFiltre = "";

            foreach (string strChamp in lstChamps)
            {
                strFiltre += strChamp + " like @1 or ";
            }
            strFiltre = strFiltre.Substring(0, strFiltre.Length - 4);
            if (bAvance)
            {
                return(new CFiltreDataAvance(
                           CContexteDonnee.GetNomTableForType(tp),
                           strFiltre, ""));
            }
            return(new CFiltreData(strFiltre, ""));
        }
Beispiel #15
0
        ////////////////////////////////////////////////////////
        public string GetStringExpression(IExpression expression, CFiltreData filtre)
        {
            string strRetour = "";

            if (expression is CComposantFiltre)
            {
                expression = ((CComposantFiltre)expression).GetComposantFiltreFinal(filtre);
            }

            if (expression is CComposantFiltreChamp)
            {
                CComposantFiltreChamp champ = (CComposantFiltreChamp)expression;
                foreach (CInfoRelationComposantFiltre info in champ.Relations)
                {
                    strRetour += "Parent(" + info.RelationKey + ").";
                }
                strRetour += champ.NomChamp;
            }


            else if (expression is CComposantFiltreConstante)
            {
                CComposantFiltreConstante constante = (CComposantFiltreConstante)expression;
                if (constante.Valeur is String)
                {
                    strRetour = "'" + constante.Valeur.ToString().Replace("'", "''") + "'";
                }
                else if (constante.Valeur is DateTime)
                {
                    strRetour += ((DateTime)constante.Valeur).ToShortDateString();
                }
                else
                {
                    strRetour += constante.Valeur.ToString();
                }
            }


            else if (expression is CComposantFiltreListe)
            {
                CComposantFiltreListe liste = (CComposantFiltreListe)expression;
                strRetour = "";
                foreach (IExpression expDeListe in liste.Liste)
                {
                    strRetour += GetStringExpression(expDeListe, filtre) + ",";
                }
                if (strRetour.Length > 0)
                {
                    strRetour = strRetour.Substring(0, strRetour.Length - 1);
                }
                strRetour = "(" + strRetour + ")";
            }


            else if (expression is CComposantFiltreOperateur)
            {
                COperateurAnalysable operateur = ((CComposantFiltreOperateur)expression).Operateur;
                string strTexteOperateur       = operateur.Texte;
                if (operateur.Niveau > 0 && operateur.Niveau != 4)
                {
                    if (operateur.Texte.Length > 3 && operateur.Texte.Substring(0, 3).ToUpper() == "NOT")
                    {
                        strTexteOperateur = operateur.Texte.Substring(0, 3) + " " + operateur.Texte.Substring(3);
                    }

                    strRetour = GetStringExpression((IExpression)expression.Parametres[0], filtre) +
                                " " + strTexteOperateur +
                                " " + GetStringExpression((IExpression)expression.Parametres[1], filtre);
                }
                else
                {
                    strRetour = strTexteOperateur + "(";
                    foreach (IExpression exp in expression.Parametres)
                    {
                        strRetour += GetStringExpression(exp, filtre) + ",";
                    }
                    if (expression.Parametres.Count > 0)
                    {
                        strRetour = strRetour.Substring(0, strRetour.Length - 1);
                    }
                    strRetour += ")";
                }
            }

            return(strRetour);
        }
Beispiel #16
0
        //------------------------------------------------------------------------------------
        private CResultAErreur IntegreModif(
            ref bool bHasData,
            DataTable table,
            IObjetServeur loader,
            CFiltreData filtreSynchro,
            int nIdSyncStart,
            int nIdSyncEnd)
        {
            CResultAErreur result   = CResultAErreur.True;
            DataTable      newTable = loader.Read(filtreSynchro);

            if (newTable.Rows.Count != 0)
            {
                bHasData = true;
            }

            foreach (DataRow row in newTable.Rows)
            {
                if (nIdSyncStart == -1)
                {
                    row.AcceptChanges();
                    row.SetAdded();
                }
                else
                {
                    int?nIdSessionRow = row[CSc2iDataConst.c_champIdSynchro] as int?;
                    if (nIdSessionRow == null &&
                        nIdSessionRow.Value >= nIdSyncStart)
                    {
                        row.AcceptChanges();
                        row.SetModified();
                    }
                }
            }

            IntegreTable(newTable, false);



            //Synchronisation des blobs
            if (loader.HasBlobs())
            {
                string strPrim = table.PrimaryKey[0].ColumnName;
                foreach (DataColumn col in table.Columns)
                {
                    if (col.DataType == typeof(CDonneeBinaireInRow))
                    {
                        foreach (DataRow row in table.Rows)
                        {
                            result = loader.ReadBlob(col.ColumnName, new object[] { row[strPrim] });
                            if (result)
                            {
                                CDonneeBinaireInRow donnee = new CDonneeBinaireInRow(IdSession, row, col.ColumnName);
                                donnee.Donnees      = (byte[])result.Data;
                                row[col.ColumnName] = donnee;
                            }

                            if (!result)
                            {
                                return(result);
                            }
                        }
                    }
                }
            }

            //Gestion des ajouts et suppressions
            CListeObjetDonneeGenerique <CEntreeLogSynchronisation> lst = new CListeObjetDonneeGenerique <CEntreeLogSynchronisation>(this);

            if (nIdSyncStart == -1)
            {
                lst.Filtre = new CFiltreData(CEntreeLogSynchronisation.c_champTable + "=@1 and " +
                                             CSc2iDataConst.c_champIdSynchro + "<=@2",
                                             table.TableName,
                                             nIdSyncEnd);
            }
            else
            {
                lst.Filtre = new CFiltreData(CEntreeLogSynchronisation.c_champTable + "=@1 and " +
                                             CSc2iDataConst.c_champIdSynchro + "<=@2 and " +
                                             CSc2iDataConst.c_champIdSynchro + ">=@3",
                                             table.TableName,
                                             nIdSyncEnd,
                                             nIdSyncStart);
            }
            lst.Tri = CEntreeLogSynchronisation.c_champType;
            foreach (CEntreeLogSynchronisation log in lst)
            {
                if (log.TypeModif == CEntreeLogSynchronisation.TypeModifLogSynchro.tAdd)
                {
                    DataRow row = table.Rows.Find(log.IdElement);
                    if (row != null && row.RowState != DataRowState.Added)
                    {
                        row.AcceptChanges();
                        row.SetAdded();
                    }
                }
                if (log.TypeModif == CEntreeLogSynchronisation.TypeModifLogSynchro.tDelete)
                {
                    DataRow row = table.Rows.Find(log.IdElement);
                    if (row != null)
                    {
                        if (row.RowState == DataRowState.Added)
                        {
                            table.Rows.Remove(row);
                        }
                        else
                        {
                            row.Delete();
                        }
                    }
                }
            }
            return(result);
        }
Beispiel #17
0
        protected CResultAErreur FillWithModifsFromVersion(
            int nIdSynchroDebut,
            int nIdSynchroFin,
            ref bool bHasData,
            CFiltresSynchronisation filtres,
            bool bOnlyTablesIndiqueesDansFiltresSynchro,
            bool bNePasLireLesDonnées)
        {
            m_nIdSynchro = nIdSynchroDebut;
            CResultAErreur result = CResultAErreur.True;

            Clear();

            //Crée la structure
            string[] strTables = m_mappeurTablesToClass.GetListeTables();
            if (bOnlyTablesIndiqueesDansFiltresSynchro)
            {
                strTables = filtres.TablesDefinies;
            }
            foreach (string strTable in strTables)
            {
                try
                {
                    GetTableSafe(strTable);
                }
                catch
                {
                    //La table n'existe pas, elle n'est probablement pas dans la structure secondaire
                }
            }

            //va chercher les informations dans la base pour chaque table
            ArrayList lst         = GetTablesOrderInsert();
            int       nTable      = 0;
            bool      bOldEnforce = EnforceConstraints;

            EnforceConstraints = false;
            List <CModifSynchronisation> lstModifs = new List <CModifSynchronisation>();

            foreach (DataTable table in lst)
            {
                if (m_mappeurTablesToClass.IsSynchronisable(table.TableName))
                {
                    IObjetServeur loader        = GetTableLoader(table.TableName);
                    CFiltreData   filtreSynchro = GetFiltreSynchro(IdSession, nIdSynchroDebut, nIdSynchroFin, filtres, table);
                    if (bNePasLireLesDonnées)
                    {
                        int nCount = loader.CountRecords(table.TableName, filtreSynchro);
                        if (nCount > 0)
                        {
                            CModifSynchronisation modif = new CModifSynchronisation(
                                table.TableName,
                                nCount,
                                filtreSynchro,
                                nIdSynchroDebut,
                                nIdSynchroFin);
                            lstModifs.Add(modif);
                        }
                    }
                    else
                    {
                        nTable++;
                        result = IntegreModif(
                            ref bHasData,
                            table,
                            loader,
                            filtreSynchro,
                            nIdSynchroDebut,
                            nIdSynchroFin);
                        if (!result)
                        {
                            return(result);
                        }
                    }
                }
            }
            if (!bNePasLireLesDonnées)
            {
                //Intègre la table des synclog
                CListeObjetDonneeGenerique <CEntreeLogSynchronisation> lstLogs = new CListeObjetDonneeGenerique <CEntreeLogSynchronisation>(this);
                if (nIdSynchroDebut >= 0)
                {
                    lstLogs.Filtre = new CFiltreData(CSc2iDataConst.c_champIdSynchro + ">=@1 and " +
                                                     CSc2iDataConst.c_champIdSynchro + "<=@2",
                                                     nIdSynchroDebut,
                                                     nIdSynchroFin);
                }
                else
                {
                    lstLogs.Filtre = new CFiltreData(CSc2iDataConst.c_champIdSynchro + ">=@1",
                                                     nIdSynchroFin);
                }
                lstLogs.AssureLectureFaite();
            }

            EnforceConstraints = bOldEnforce;


            Hashtable tableRowAdd     = new Hashtable();        //Liste des éléments ajoutés
            ArrayList listRowToDelete = new ArrayList();

            //Les éléments sont supprimés s'ils ont été ajoutés et supprimés ensuite

            /*//Charge les logs de données ajoutées et supprimées
             * CListeObjetsDonnees lstEntrees = new CListeObjetsDonnees ( this, typeof(CEntreeLogSynchronisation));
             * lstEntrees.Filtre = new CFiltreData ( CSc2iDataConst.c_champIdSynchro+">=@1 and "+
             *      CSc2iDataConst.c_champIdSynchro+"<=@2", nIdSynchroDebut, nIdSynchroFin);
             * if ( bOnlyTablesIndiqueesDansFiltresSynchro )
             * {
             * StringBuilder bl = new StringBuilder();
             * foreach ( string strTable in strTables )
             * bl.Append("'"+strTable+"',");
             * bl.Remove ( bl.Length-1, 1);
             * lstEntrees.Filtre = CFiltreData.GetAndFiltre ( lstEntrees.Filtre,
             * new CFiltreData ( CEntreeLogSynchronisation.c_champTable+" in ("+
             * bl.ToString()+")"));
             * }
             * foreach ( CEntreeLogSynchronisation entree in lstEntrees )
             * {
             *      if ( entree.TypeModif == CEntreeLogSynchronisation.TypeModifLogSynchro.tAdd )
             *      {
             *              DataTable table = GetTableSafe ( entree.TableConcernee );
             *              CObjetDonneeAIdNumerique obj = (CObjetDonneeAIdNumerique)GetNewObjetForTable ( table );
             *              obj.Id = entree.IdElement;
             *              tableRowAdd[entree.TableConcernee+"_"+entree.IdElement] = entree.Row;
             *              bHasData = true;
             *      }
             *      else
             *      {
             *              if ( tableRowAdd[entree.TableConcernee+"_"+entree.IdElement] != null )
             *              {
             *                      listRowToDelete.Add ( entree.Row );
             *                      listRowToDelete.Add ( tableRowAdd[entree.TableConcernee+"_"+entree.IdElement] );
             *                      bHasData = true;
             *              }
             *      }
             * }
             *
             * foreach ( DataRow row in listRowToDelete )
             * {
             *      row.Delete();
             * }*/

            if (bNePasLireLesDonnées)
            {
                result.Data = lstModifs;
            }
            return(result);
        }
Beispiel #18
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)));
        }
Beispiel #19
0
        /*///////////////////////////////////////////////////
         * public void AddAndFiltre ( CFiltreData filtre )
         * {
         *      if ( filtre == null || !filtre.HasFiltre )
         *              return;
         *      if ( m_strFiltre.Trim() != "" )
         *              m_strFiltre = "("+m_strFiltre+") and ";
         *      string strNewFiltre = filtre.Filtre+" ";
         *      int nNumNewParam = Parametres.Count +1;
         *      for ( int nParam = 0; nParam < filtre.Parametres.Count; nParam++ )
         *      {
         *              strNewFiltre = strNewFiltre.Replace("@"+(nParam+1).ToString()+" ", "@"+nNumNewParam.ToString()+" ");
         *              Parametres.Add ( filtre.Parametres[nParam] );
         *              nNumNewParam++;
         *      }
         *      m_strFiltre += strNewFiltre;
         * }*/

        ///////////////////////////////////////////////////
        protected static CFiltreData CombineFiltres(CFiltreData filtre1, CFiltreData filtre2, string strOperateur)
        {
            if ((filtre1 == null || !filtre1.HasFiltre) && (filtre2 == null || !filtre2.HasFiltre))
            {
                return(null);
            }
            if (filtre1 == null || !filtre1.HasFiltre)
            {
                return(filtre2.GetClone());
            }
            if (filtre2 == null || !filtre2.HasFiltre)
            {
                return(filtre1.GetClone());
            }
            if (filtre1 is CFiltreDataImpossible || filtre2 is CFiltreDataImpossible)
            {
                return(new CFiltreDataImpossible());
            }
            CFiltreData filtreResult = null;

            if (filtre1 is CFiltreDataAvance || filtre2 is CFiltreDataAvance)
            {
                string strTable;
                if (filtre1 is CFiltreDataAvance)
                {
                    strTable = ((CFiltreDataAvance)filtre1).TablePrincipale;
                    if (filtre2 is CFiltreDataAvance &&
                        ((CFiltreDataAvance)filtre2).TablePrincipale != strTable)
                    {
                        throw new Exception(I.T("Cannot combine @1 filter on different tables|133", strOperateur));
                    }
                }
                else
                {
                    strTable = ((CFiltreDataAvance)filtre2).TablePrincipale;
                }


                filtreResult = new CFiltreDataAvance(strTable, "");


                if (!(filtre1 is CFiltreDataAvance))
                {
                    filtre1 = CFiltreDataAvance.ConvertFiltreToFiltreAvance(strTable, filtre1);
                }
                if (!(filtre2 is CFiltreDataAvance))
                {
                    filtre2 = CFiltreDataAvance.ConvertFiltreToFiltreAvance(strTable, filtre2);
                }


                CResultAErreur    result        = CResultAErreur.True;
                CFiltreDataAvance filtre1Avance = filtre1 as CFiltreDataAvance;
                CComposantFiltre  composant1    = filtre1Avance.ComposantPrincipal;
                if (composant1 == null)
                {
                    result = CAnalyseurSyntaxiqueFiltre.AnalyseFormule(filtre1.Filtre, strTable);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error while analyzing filter @1|134", filtre1.Filtre));
                        throw new CExceptionErreur(result.Erreur);
                    }
                    composant1 = result.Data as CComposantFiltre;
                }

                CFiltreDataAvance copie = filtre2.GetClone() as CFiltreDataAvance;
                copie.RenumerotteParameters(filtre1.Parametres.Count + 1);

                CComposantFiltre composant2 = copie.ComposantPrincipal;
                if (composant2 == null)
                {
                    result = CAnalyseurSyntaxiqueFiltre.AnalyseFormule(copie.Filtre, strTable);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error while analyzing filter @1|134", copie.Filtre));
                        throw new CExceptionErreur(result.Erreur);
                    }
                    composant2 = result.Data as CComposantFiltre;
                }
                CComposantFiltre composantPrincipal = null;
                if (strOperateur.ToUpper() == "OR")
                {
                    composantPrincipal = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurOu);
                }
                if (strOperateur.ToUpper() == "AND")
                {
                    composantPrincipal = new CComposantFiltreOperateur(CComposantFiltreOperateur.c_IdOperateurEt);
                }
                if (composantPrincipal != null)
                {
                    composantPrincipal.Parametres.Add(composant1);
                    composantPrincipal.Parametres.Add(composant2);
                    filtreResult = new CFiltreDataAvance(strTable, composantPrincipal);
                }
                else
                {
                    filtreResult.Filtre = "(" + composant1.GetString() + ") " + strOperateur + " (" +
                                          composant2.GetString() + ")";
                }
            }
            else
            {
                filtreResult        = new CFiltreData();
                filtreResult.Filtre = "(" + filtre1.Filtre + ")";
                CFiltreData copie = filtre2.GetClone();
                copie.RenumerotteParameters(filtre1.Parametres.Count + 1);
                filtreResult.Filtre += " " + strOperateur + " (" + copie.Filtre + ")";
            }
            foreach (object parametre in filtre1.Parametres)
            {
                filtreResult.Parametres.Add(parametre);
            }
            foreach (object parametre in filtre2.Parametres)
            {
                filtreResult.Parametres.Add(parametre);
            }


            if (filtre1 != null && filtre1.SortOrder != "")
            {
                filtreResult.SortOrder = filtre1.SortOrder;
            }
            if (filtre2 != null && filtre2.SortOrder != "")
            {
                if (filtreResult.SortOrder != "")
                {
                    filtreResult.SortOrder += ",";
                }
                filtreResult.SortOrder += filtre2.SortOrder;
            }

            if (filtre1 != null)
            {
                filtreResult.IntegrerLesElementsSupprimes |= filtre1.IntegrerLesElementsSupprimes;
                filtreResult.IgnorerVersionDeContexte     |= filtre1.IgnorerVersionDeContexte;
                filtreResult.IdsDeVersionsALire            = filtre1.IdsDeVersionsALire;
                filtreResult.IntergerParentsHierarchiques |= filtre1.IntergerParentsHierarchiques;
                filtreResult.IntegrerFilsHierarchiques    |= filtre1.IntegrerFilsHierarchiques;
                filtreResult.NeConserverQueLesRacines     |= filtre1.NeConserverQueLesRacines;
            }

            if (filtre2 != null)
            {
                filtreResult.IntegrerLesElementsSupprimes |= filtre2.IntegrerLesElementsSupprimes;
                filtreResult.IgnorerVersionDeContexte     |= filtre2.IgnorerVersionDeContexte;
                filtreResult.IntergerParentsHierarchiques |= filtre2.IntergerParentsHierarchiques;
                filtreResult.IntegrerFilsHierarchiques    |= filtre2.IntegrerFilsHierarchiques;
                filtreResult.NeConserverQueLesRacines     |= filtre2.NeConserverQueLesRacines;
                if (filtre2.IdsDeVersionsALire != null)
                {
                    if (filtreResult.IdsDeVersionsALire != null)
                    {
                        Hashtable tblIds = new Hashtable();
                        foreach (int nId in filtreResult.IdsDeVersionsALire)
                        {
                            tblIds[nId] = true;
                        }
                        foreach (int nId in filtre2.IdsDeVersionsALire)
                        {
                            tblIds[nId] = true;
                        }
                        ArrayList lst = new ArrayList();
                        foreach (int nId in tblIds.Keys)
                        {
                            lst.Add(nId);
                        }
                        filtreResult.IdsDeVersionsALire = (int[])lst.ToArray(typeof(int));
                    }
                    else
                    {
                        filtreResult.IdsDeVersionsALire = filtre2.IdsDeVersionsALire;
                    }
                }
            }

            return(filtreResult);
        }
Beispiel #20
0
 //-----------------------------------------------------------------
 public void AddFiltreForTable(string strTable, CFiltreData filtre, bool bAvecCompositions)
 {
     AddFiltreSynchroPourTable(strTable, new CFiltreSynchronisationFiltreData(filtre), bAvecCompositions);
 }
Beispiel #21
0
 ///////////////////////////////////////////////////
 public static CFiltreData GetAndFiltre(CFiltreData filtre1, CFiltreData filtre2)
 {
     return(CombineFiltres(filtre1, filtre2, "AND"));
 }
        ////////////////////////////////////////////////////////////
        private void Init(
            CObjetDonnee objetParent,
            string strNomTableFille,
            string[] strChampsFille,
            bool bAppliquerFiltreParDefaut)
        {
            m_strNomTableFille = strNomTableFille;
            m_strChampsFille   = strChampsFille;
            m_objetConteneur   = objetParent;
            if (!RemplissageProgressif)
            {
                objetParent.AssureDependances(strNomTableFille, strChampsFille);
            }

            /*Stef 26042012 : suppression de cette optimisation,
             * le problème est que si on ajoute des fils, alors, le filtre ne les voit plus !
             * DataTable tableFille = ContexteDonnee.GetTableSafe(strNomTableFille);
             * if (!RemplissageProgressif && tableFille != null && tableFille.PrimaryKey.Length == 1 &&
             *  tableFille.PrimaryKey[0].DataType == typeof(int))
             * {
             *  string strFK = ContexteDonnee.GetForeignKeyName(objetParent.GetNomTable(), strNomTableFille, strChampsFille);
             *  DataRow[] rows = objetParent.Row.Row.GetChildRows(strFK);
             *  if (rows.Length == 0)
             *      m_filtrePrincipal = new CFiltreDataImpossible();
             *  else
             *  {
             *      DataColumn colKey = tableFille.PrimaryKey[0];
             *      StringBuilder bl = new StringBuilder();
             *      foreach (DataRow row in rows)
             *      {
             *          bl.Append(row[colKey]);
             *          bl.Append(',');
             *      }
             *      bl.Remove(bl.Length - 1, 1);
             *      m_filtrePrincipal = new CFiltreData(colKey.ColumnName + " in (" + bl.ToString() + ")");
             *  }
             * }
             * else*/
            m_filtrePrincipal = CFiltreData.CreateFiltreAndSurValeurs(strChampsFille, objetParent.GetValeursCles());

            m_bAppliquerFiltreParDefaut = bAppliquerFiltreParDefaut;
#if PDA
            CObjetDonnee objet = (CObjetDonnee)Activator.CreateInstance(CContexteDonnee.GetTypeForTable(strNomTableFille));
            objet.ContexteDonnee = m_objetConteneur.ContexteDonnee;
#else
            CObjetDonnee objet = (CObjetDonnee)Activator.CreateInstance(CContexteDonnee.GetTypeForTable(strNomTableFille), new object[] { m_objetConteneur.ContexteDonnee });
#endif
            CFiltreData filtre = bAppliquerFiltreParDefaut?objet.FiltreStandard:null;
            if (filtre != null)
            {
                m_filtrePrincipal = CFiltreData.GetAndFiltre(m_filtrePrincipal, filtre);
            }

            if (!RemplissageProgressif)
            {
                //Puisque les objets sont lus, il n'y a aucune raison d'aller relire cette liste depuis
                //La base de données
                InterditLectureInDB = true;
                m_bIsToRead         = false;
            }
        }
Beispiel #23
0
        /// ////////////////////////////////////////////////////////////////////////
        public static void Merge(DataTable tableSource, DataSet dsDest, bool bPreseveChanges)
        {
            DataTable tableDest = dsDest.Tables[tableSource.TableName];

            if (tableDest == null)
            {
                //Création de la table
                tableDest = AddTableCopie(tableSource, dsDest);
            }
            bool bOldEnforce = dsDest.EnforceConstraints;

            if (tableSource.Rows.Count == 0)
            {
                return;
            }
            DataColumn[] keys    = tableSource.PrimaryKey;
            int          nNbKeys = tableSource.PrimaryKey.Length;

            Hashtable tableSupprimees = null;

            //Si une seule clé, stocke la liste des supprimées dans une hashtable
            //pour un recherche plus rapide
            if (nNbKeys == 1 && bPreseveChanges)
            {
                tableSupprimees = new Hashtable();
                DataRow[] rows = tableDest.Select("", "", DataViewRowState.Deleted);
                foreach (DataRow row in rows)
                {
                    tableSupprimees[row[keys[0].ColumnName, DataRowVersion.Original]] = true;
                }
            }


            dsDest.EnforceConstraints = false;
            DataColumn colIsToRead = tableDest.Columns[CContexteDonnee.c_colIsToRead];

            try
            {
                foreach (DataRow row in tableSource.Rows)
                {
                    try
                    {
                        DataRowVersion version = DataRowVersion.Default;
                        if (row.RowState == DataRowState.Deleted)
                        {
                            version = DataRowVersion.Original;
                        }
                        object[] cles = new object[nNbKeys];
                        for (int n = 0; n < nNbKeys; n++)
                        {
                            cles[n] = row[keys[n], version];
                        }

                        //Tente d'abord le lien sur la clé primaire
                        DataRow rowDest = tableDest.Rows.Find(cles);
                        if (rowDest != null)
                        {
                            bool bShouldUpdate = (rowDest.RowState & (DataRowState.Modified | DataRowState.Added | DataRowState.Deleted)) == 0;
                            if (bPreseveChanges && colIsToRead != null)
                            {
                                bShouldUpdate = (bool)rowDest[colIsToRead];
                            }
                            if (bShouldUpdate)
                            {
                                if (row.RowState == DataRowState.Deleted && rowDest.RowState != DataRowState.Deleted)
                                {
                                    rowDest.Delete();
                                }
                                else
                                {
                                    if (dsDest is CContexteDonnee)
                                    {
                                        ((CContexteDonnee)dsDest).CopyRow(row, rowDest, DataRowVersion.Current, true);
                                    }
                                    else
                                    {
                                        CopyRow(row, rowDest, DataRowVersion.Current, true);
                                    }
                                }
                            }
                        }
                        //Si la ligne existe dans le contexte de destination mais
                        //qu'elle a été supprimée, Find ne la trouve pas, il faut donc
                        //Vérifier si elle n'est pas là autrement
                        else
                        {
                            bool bShouldImporte = true;
                            if (bPreseveChanges)                              //On n'importe pas les lignes supprimées
                            //si on conserve les modifs faites dans la destination
                            {
                                if (tableSupprimees != null)
                                {
                                    if (tableSupprimees.Contains(row[keys[0]]))
                                    {
                                        bShouldImporte = false;
                                    }
                                }
                                else
                                {
                                    CFiltreData filtre = CFiltreData.CreateFiltreAndSurRow(keys, row, DataRowVersion.Original);
                                    DataRow[]   rows   = tableDest.Select(new CFormatteurFiltreDataToStringDataTable().GetString(filtre), "", DataViewRowState.Deleted);
                                    if (rows.Length == 1 && rows[0].RowState == DataRowState.Deleted)
                                    {
                                        bShouldImporte = false;
                                    }
                                }
                            }
                            if (bShouldImporte && row.RowState != DataRowState.Deleted)
                            {
                                tableDest.ImportRow(row);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        throw e;
                    }
                    finally
                    {
                    }
                }
            }
            finally
            {
                dsDest.EnforceConstraints = bOldEnforce;
            }
        }
        ////////////////////////////////////////////////////////////
        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);
        }