Beispiel #1
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 #2
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);
        }
        ////////////////////////////////////////////////////////////
        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);
        }