Пример #1
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);
        }
Пример #2
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);
        }