/// /////////////////////////////////////////////////////////////// private CResultAErreur ReadObjetEtDependances(CObjetDonneeAIdNumeriqueAuto source) { CResultAErreur result = CResultAErreur.True; //Charge tous les parents et tous les fils foreach (CInfoRelation relation in CContexteDonnee.GetListeRelationsTable(source.GetNomTable())) { //Relation parente if (relation.TableFille == source.GetNomTable()) { CObjetDonneeAIdNumeriqueAuto parent = (CObjetDonneeAIdNumeriqueAuto)source.GetParent(relation.ChampsFille[0], CContexteDonnee.GetTypeForTable(relation.TableParente)); if (parent != null) { parent.AssureData(); } } else { if (relation.Composition) { CListeObjetsDonnees liste = source.GetDependancesListe(relation.TableFille, relation.ChampsFille[0]); foreach (CObjetDonneeAIdNumeriqueAuto objetFils in liste) { objetFils.AssureData(); ReadObjetEtDependances(objetFils); } } } } return(result); }
/// ///////////////////////////// ///////////////////////////// ////////////////////////// /// <summary> /// </summary> /// <param name="rowSource"></param> /// <param name="objetDest"></param> /// <param name="interfaceMapping"></param> /// <returns></returns> private CResultAErreur ImporteObjet(DataRow rowSource, CObjetDonneeAIdNumeriqueAuto objetDest, IInterfaceImportObjetDonnee interfaceMapping) { CResultAErreur result = CResultAErreur.True; rowSource[objetDest.GetChampId()] = objetDest.Id; rowSource[c_colIsMappe] = true; //Mappe les parents de l'objet dest foreach (DataRelation relation in rowSource.Table.ParentRelations) { DataRow rowParente = rowSource.GetParentRow(relation); if (rowParente != null && !(bool)rowParente[c_colIsMappe]) { CObjetDonneeAIdNumeriqueAuto objetParent = null; CListeObjetsDonnees liste = new CListeObjetsDonnees(objetDest.ContexteDonnee, CContexteDonnee.GetTypeForTable(relation.ParentTable.TableName)); result = interfaceMapping.MapObjet(rowParente, liste, ref objetParent); if (!result) { return(result); } if (objetParent != null) { rowParente[objetParent.GetChampsId()[0]] = objetParent.Id; } else { rowSource[relation.ChildColumns[0]] = DBNull.Value; } rowParente[c_colIsMappe] = true; objetDest.SetParent(relation.ChildColumns[0].ColumnName, objetParent); } } objetDest.AssureData(); DataTable tableDest = objetDest.Table; DataTable tableSource = rowSource.Table; //Copie les données objetDest.ContexteDonnee.CopyRow(rowSource, objetDest.Row.Row, objetDest.GetChampId(), CSc2iDataConst.c_champIdSynchro, CContexteDonnee.c_colLocalKey, CContexteDonnee.c_colIsToRead, CContexteDonnee.c_colIsFromDb); //Convertit les données binaires foreach (DataColumn colDest in tableDest.Columns) { if (colDest.DataType == typeof(CDonneeBinaireInRow)) { DataColumn colSource = tableSource.Columns[colDest.ColumnName]; if (colSource != null && colSource.DataType == typeof(string)) { object donneesSource = rowSource[colDest.ColumnName]; if (donneesSource != DBNull.Value) { CStringSerializer serializer = new CStringSerializer((string)donneesSource, ModeSerialisation.Lecture); byte[] data = null; serializer.TraiteByteArray(ref data); CDonneeBinaireInRow donneeBinaire = new CDonneeBinaireInRow(objetDest.ContexteDonnee.IdSession, objetDest.Row.Row, colDest.ColumnName); if (data.Length == 0) { donneeBinaire.Donnees = null; } else { donneeBinaire.Donnees = data; } } } } } //Mappe les fils foreach (DataRelation relation in rowSource.Table.ChildRelations) { DataRow[] rowsFilles = rowSource.GetChildRows(relation); CObjetDonneeAIdNumeriqueAuto[] objetsFilles = new CObjetDonneeAIdNumeriqueAuto[rowsFilles.Length]; int nIndex = 0; CListeObjetsDonnees listeFilles = objetDest.GetDependancesListe(relation.ChildTable.TableName, relation.ChildColumns[0].ColumnName); if (listeFilles.Count != 0) { string strExclus = ""; foreach (DataRow rowFille in rowsFilles) { CObjetDonneeAIdNumeriqueAuto objetFils = null; result = interfaceMapping.MapObjet(rowFille, listeFilles, ref objetFils); if (!result) { return(result); } objetsFilles[nIndex] = objetFils; if (objetFils != null) { if (strExclus.Length != 0) { strExclus += ","; } strExclus += objetFils.Id.ToString(); listeFilles.Filtre = new CFiltreData(objetFils.GetChampId() + " not in (" + strExclus + ")"); } nIndex++; } } nIndex = 0; foreach (DataRow rowFille in rowSource.GetChildRows(relation)) { CObjetDonneeAIdNumeriqueAuto objetFille = objetsFilles[nIndex]; if (objetFille == null) { objetFille = (CObjetDonneeAIdNumeriqueAuto)Activator.CreateInstance( CContexteDonnee.GetTypeForTable(relation.ChildTable.TableName), new object[] { objetDest.ContexteDonnee }); objetFille.CreateNewInCurrentContexte(); } result = ImporteObjet(rowFille, objetFille, interfaceMapping); if (!result) { return(result); } rowFille[c_colIsMappe] = true; nIndex++; } } return(result); }