/// ////////////////////////////////////////// ///<summary> ///Ajoute les nouveaux éléments à partir du domaine Secondaire ///</summary> public CResultAErreur AjouteNouveaux(CContexteDonneesSynchroSecondaire donneesSecondaires) { CResultAErreur result = CResultAErreur.True; ArrayList lst = donneesSecondaires.GetTablesOrderInsert(); DataTable tableEntreesLog = donneesSecondaires.GetTableSafe(CEntreeLogSynchronisation.c_nomTable); foreach (DataTable table in lst) { if (m_mappeurTablesToClass.IsSynchronisable(table.TableName)) { //int nIdMaxInSecondaire = (int)table.ExtendedProperties[CContexteDonneesSynchroSecondaire.c_extMaxIdInBase]; //int nIdMaxInMain = (int)table.ExtendedProperties[CContexteDonneesSynchroSecondaire.c_extMaxIdInBase]; int nNextId = 0; //Math.Max(nIdMaxInMain, nIdMaxInSecondaire)+1; DataTable tableDest = Tables[table.TableName]; DataView view = new DataView(tableEntreesLog); string strFiltre = CEntreeLogSynchronisation.c_champTable + "='" + table.TableName + "'"; view.RowFilter = strFiltre; foreach (DataRowView row in view) { CEntreeLogSynchronisation entree = new CEntreeLogSynchronisation(row.Row); if (entree.TypeModif == CEntreeLogSynchronisation.TypeModifLogSynchro.tAdd) { CObjetDonneeAIdNumerique obj = entree.GetObjet(); DataRow newRow = CopieToNew(obj.Row, tableDest, nNextId); nNextId++; m_mapOldRowToNewRow[obj.Row.Row] = newRow; m_tableAjouts[table.TableName + "_" + obj.Id] = ""; } } } } return(result); }
/// //////////////////////////////////////////////////////////////////////////////////// private void ChangeOldIdParNew(CContexteDonneesSynchroSecondaire donneesSecondaires, Hashtable mapTablesOldToNew, Hashtable mapTablesNewToOld, Hashtable mapMaxParTable) { ArrayList lst = donneesSecondaires.GetTablesOrderInsert(); CListeObjetsDonnees listeEntreesLog = new CListeObjetsDonnees(donneesSecondaires, typeof(CEntreeLogSynchronisation)); listeEntreesLog.InterditLectureInDB = true; foreach (DataTable table in lst) { string strTable = table.TableName; if (mapMaxParTable[strTable] != null) { //DataTable table = donneesSecondaires.Tables[strTable]; string strPrim = table.PrimaryKey[0].ColumnName; int nIndice = (int)mapMaxParTable[strTable] + 1; Hashtable tableOldToNew = (Hashtable)mapTablesOldToNew[strTable]; Hashtable tableIdOriginauxDansSecondaire = new Hashtable(); //Commence par renumeroter les indices des nouveaux éléments //pour être sur de ne pas affecter à un élément un id déjà existant foreach (DataRow row in tableOldToNew.Keys) { tableIdOriginauxDansSecondaire[row] = row[strPrim]; row[strPrim] = nIndice; nIndice++; } foreach (DataRow row in tableOldToNew.Keys) { DataRow newRowPrim = (DataRow)tableOldToNew[row]; int nNewId = (int)newRowPrim[strPrim]; int nIdOriginalDansSecondaire = (int)tableIdOriginauxDansSecondaire[row]; if (nNewId != nIdOriginalDansSecondaire) /*L'élement a changé d'id. On va donc en créer * un nouveau avec le nouvel id, modifier les liens fils * et supprimer l'ancien * */ { //Crée la nouvelle ligne (avec le bon id) (copie de la ligne d'origine) DataRow newRowSec = table.NewRow(); CopyRow(newRowPrim, newRowSec); table.Rows.Add(newRowSec); //Change l'info de log synchro listeEntreesLog.Filtre = new CFiltreData( CEntreeLogSynchronisation.c_champTable + "=@1 and " + CEntreeLogSynchronisation.c_champIdElement + "=@2 and " + CEntreeLogSynchronisation.c_champType + "=@3", strTable, nIdOriginalDansSecondaire, (int)CEntreeLogSynchronisation.TypeModifLogSynchro.tAdd); if (listeEntreesLog.Count > 0) { CEntreeLogSynchronisation entree = (CEntreeLogSynchronisation)listeEntreesLog[0]; entree.IdElement = nNewId; } //Change toutes les liaisons filles sur le nouvel élément foreach (DataRelation rel in table.ChildRelations) { if (rel.ParentColumns.Length == 1 && rel.ParentColumns[0].ColumnName == strPrim) { foreach (DataRow childRow in row.GetChildRows(rel)) { childRow[rel.ChildColumns[0].ColumnName] = nNewId; } } } //Supprime l'ancien élément row.Delete(); } else { row[strPrim] = nIdOriginalDansSecondaire; } } } } }