//--------------------------------------------------------------------------------------------------------------------
        public override CResultAErreur ExecuterOperation(IDatabaseConnexion connection, IIndicateurProgression indicateur)
        {
            CResultAErreur result = CResultAErreur.True;

            if (!typeof(IObjetDonneeAIdNumerique).IsAssignableFrom(m_type) || !CObjetDonnee.TypeManageIdUniversel(m_type))
            {
                result.EmpileErreur(m_type.ToString() + " can not have Universal Id");
            }

            string strNomTable = CContexteDonnee.GetNomTableForType(m_type);

            CStructureTable structure  = CStructureTable.GetStructure(m_type);
            string          strChampId = structure.ChampsId[0].NomChamp;

            C2iRequeteAvancee requete = new C2iRequeteAvancee();

            requete.FiltreAAppliquer = new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", "");
            requete.TableInterrogee  = CContexteDonnee.GetNomTableForType(m_type);
            requete.ListeChamps.Add(new C2iChampDeRequete(strChampId, new CSourceDeChampDeRequete(strChampId),
                                                          typeof(int),
                                                          OperationsAgregation.None, true));
            Console.WriteLine("Update Universal id on " + strNomTable);
            result = requete.ExecuteRequete(connection.IdSession);
            if (!result)
            {
                return(result);
            }
            string    strNomTableInDb = CContexteDonnee.GetNomTableInDbForNomTable(strNomTable);
            DataTable table           = result.Data as DataTable;
            int       nNb             = 0;
            bool      bWasInTrans     = connection.IsInTrans();

            if (bWasInTrans)
            {
                connection.CommitTrans();
            }
            DateTime dt = DateTime.Now;

            if (table.Rows.Count > 0)
            {
                if (table.Rows.Count > 10000 && connection is COracleDatabaseConnexion)
                {
                    string strQuery = "Update " + strNomTableInDb + " set " + CObjetDonnee.c_champIdUniversel +
                                      "=CONCAT('" + strNomTableInDb + "'," + strChampId + ")";
                    result = connection.RunStatement(strQuery);
                }
                else
                {
                    foreach (DataRow row in table.Rows)
                    {
                        string strQuery = "Update " + strNomTableInDb + " set " +
                                          CObjetDonnee.c_champIdUniversel + "='" + CUniqueIdentifier.GetNew() + "' where " +
                                          strChampId + "=" + row[0].ToString();
                        result = connection.ExecuteScalar(strQuery);
                        if (!result)
                        {
                            break;
                        }
                        nNb++;
                        if (nNb % 100 == 0)
                        {
                            TimeSpan sp   = DateTime.Now - dt;
                            double   fVal = (double)sp.TotalSeconds / (double)nNb * (double)(table.Rows.Count - nNb);
                            Console.WriteLine(strNomTableInDb + " " + nNb + "/" + table.Rows.Count + " reste " + fVal.ToString("0s"));
                        }
                    }
                }
            }
            if (bWasInTrans)
            {
                connection.BeginTrans();
            }
            return(result);

            /*
             *
             * //Trouve tous les éléments du type qui n'ont pas d'id universel
             * using (CContexteDonnee ctx = new CContexteDonnee(connection.IdSession, true, false))
             * {
             *  CListeObjetsDonnees lst = new CListeObjetsDonnees(ctx, m_type, false);
             *  lst.Filtre = new CFiltreData(CObjetDonnee.c_champIdUniversel + "=@1", "");
             *  lst.Filtre.IgnorerVersionDeContexte = true;
             *  lst.AppliquerFiltreAffichage = false;
             *
             *  foreach (IObjetDonnee objet in lst.ToArrayList())
             *  {
             *      objet.Row[CObjetDonnee.c_champIdUniversel] = CUniqueIdentifier.GetNew();
             *  }
             *  string strNomTable = CContexteDonnee.GetNomTableForType(m_type);
             *  CObjetServeur objetServeur = CContexteDonnee.GetTableLoader(strNomTable, null, connection.IdSession) as CObjetServeur;
             *  int nCount = ctx.Tables[strNomTable].Rows.Count;
             *  DataTable tableSource = ctx.Tables[strNomTable];
             *
             *   List<string> lstChampsExclus = new List<string>();
             *  HashSet<string> lstIDs = new HashSet<string>();
             *  CStructureTable structure = CStructureTable.GetStructure(m_type);
             *  foreach (CInfoChampTable info in structure.ChampsId)
             *      lstIDs.Add(info.NomChamp);
             *
             *  foreach (CInfoChampTable champ in structure.Champs)
             *      if (champ.NomChamp != CObjetDonnee.c_champIdUniversel && !lstIDs.Contains(champ.NomChamp))
             *          lstChampsExclus.Add(champ.NomChamp);
             *
             *  IDataAdapter adapter = objetServeur.GetDataAdapter(DataRowState.Modified, lstChampsExclus.ToArray());
             *
             *  for (int nRow = 0; nRow < nCount; nRow += 5000)
             *  {
             *
             *      using (DataSet dsCopie = new DataSet())
             *      {
             *          dsCopie.EnforceConstraints = false;
             *          DataTable tableCopie = ctx.Tables[strNomTable].Clone();
             *          tableCopie.BeginLoadData();
             *          dsCopie.Tables.Add(tableCopie);
             *          int nMax = Math.Min(nRow + 5000, nCount);
             *          DateTime dt = DateTime.Now;
             *          for (int n = nRow; n < nMax; n++)
             *          {
             *              tableCopie.ImportRow(tableSource.Rows[n]);
             *          }
             *          TimeSpan sp = DateTime.Now - dt;
             *          Console.WriteLine("Write 1" + strNomTable + " " + nRow + "/" + nCount+"  "+sp.TotalSeconds.ToString());
             *          adapter.Update(dsCopie);
             *          sp = DateTime.Now - dt;
             *          Console.WriteLine("Write 2" + strNomTable + " " + nRow + "/" + nCount + "  " + sp.TotalSeconds.ToString());
             *      }
             *  }
             * }
             * return result;*/
        }
        //------------------------------------------------
        public CResultAErreurType <CObjetDonnee> FindObjet(
            DataRow rowSource,
            CContexteImportDonnee contexteImport,
            CValeursImportFixe valeursFixes,
            ref string strFiltre)
        {
            CResultAErreurType <CObjetDonnee> resObjet = new CResultAErreurType <CObjetDonnee>();
            CResultAErreur res = CResultAErreur.True;

            StringBuilder blFiltre = new StringBuilder();

            if (valeursFixes != null)
            {
                foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes)
                {
                    blFiltre.Append(kv.Key);
                    blFiltre.Append("=");
                    blFiltre.Append(kv.Value == null ? "null" : kv.Value.ToString());
                    blFiltre.Append(";");
                }
            }


            //Création du filtre
            CComposantFiltreDynamiqueEt compoPrincipal = new CComposantFiltreDynamiqueEt();

            //Recherche à partir des champs simples
            foreach (CMappageChampSimple mapSimple in MappagesChampsSimples)
            {
                if (mapSimple.UseAsKey)
                {
                    res = mapSimple.GetValue(rowSource, contexteImport);
                    if (!res)
                    {
                        res.EmpileErreur(I.T("Erreur while searching object|20093"));
                        resObjet.EmpileErreur(res.Erreur);
                        return(resObjet);
                    }

                    //Stockage valeur témoin
                    CSourceSmartImportField sourceField = mapSimple.Source as CSourceSmartImportField;
                    if (sourceField != null)
                    {
                        contexteImport.SetValeurTemoin(sourceField.NomChampSource, res.Data);
                    }

                    blFiltre.Append(mapSimple.Propriete.NomPropriete);
                    if (res.Data == null)
                    {
                        CComposantFiltreDynamiqueTestNull testNull = new CComposantFiltreDynamiqueTestNull();
                        testNull.Champ    = mapSimple.Propriete;
                        testNull.TestNull = true;
                        compoPrincipal.AddComposantFils(testNull);
                        blFiltre.Append("=null;");
                    }
                    else
                    {
                        CComposantFiltreDynamiqueValeurChamp testValeur = new CComposantFiltreDynamiqueValeurChamp();
                        testValeur.Champ            = mapSimple.Propriete;
                        testValeur.IdOperateur      = CComposantFiltreOperateur.c_IdOperateurEgal;
                        testValeur.ExpressionValeur = new C2iExpressionConstante(res.Data);
                        compoPrincipal.AddComposantFils(testValeur);
                        blFiltre.Append("=");
                        blFiltre.Append(res.Data.ToString());
                        blFiltre.Append(";");
                    }
                }
            }


            //Recherche à partir des objets parents
            foreach (CMappageEntiteParente mapParent in m_listeMappagesParents)
            {
                if (mapParent.UseAsKey)
                {
                    CResultAErreurType <CObjetDonnee> resParent = mapParent.GetObjetAssocie(rowSource, contexteImport, false);
                    if (!resParent)
                    {
                        resObjet.EmpileErreur(resParent.Erreur);
                        return(resObjet);
                    }
                    CObjetDonneeAIdNumerique      objetId = resParent.DataType as CObjetDonneeAIdNumerique;
                    CDefinitionProprieteDynamique defId   = null;
                    object valeurTest = null;

                    if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(mapParent.Propriete.TypeDonnee.TypeDotNetNatif))
                    {
                        defId = new CDefinitionProprieteDynamiqueDotNet(
                            "Id",
                            "Id",
                            new CTypeResultatExpression(typeof(int), false),
                            false,
                            true, "");
                        defId.InsereParent(mapParent.Propriete);
                        valeurTest = objetId != null?objetId.Id:-1;
                    }
                    else if (CObjetDonnee.TypeManageIdUniversel(mapParent.Propriete.TypeDonnee.TypeDotNetNatif))
                    {
                        defId = new CDefinitionProprieteDynamiqueDotNet("Universal id",
                                                                        "IdUniversel",
                                                                        new CTypeResultatExpression(typeof(string), false),
                                                                        false, true, "");
                        defId.InsereParent(mapParent.Propriete);
                        valeurTest = resParent.DataType != null ? resParent.DataType.IdUniversel : null;
                    }
                    else
                    {
                        resObjet.EmpileErreur(I.T("Can not search objet of type @1|20094",
                                                  DynamicClassAttribute.GetNomConvivial(mapParent.Propriete.TypeDonnee.TypeDotNetNatif)));
                        return(resObjet);
                    }
                    blFiltre.Append(defId.NomPropriete);

                    if (resParent.DataType == null)
                    {
                        CComposantFiltreDynamiqueTestNull testNull = new CComposantFiltreDynamiqueTestNull();
                        testNull.Champ    = defId;
                        testNull.TestNull = true;
                        compoPrincipal.AddComposantFils(testNull);
                        blFiltre.Append("=null;");
                    }
                    else
                    {
                        CComposantFiltreDynamiqueValeurChamp testValeur = new CComposantFiltreDynamiqueValeurChamp();
                        testValeur.Champ            = defId;
                        testValeur.IdOperateur      = CComposantFiltreOperateur.c_IdOperateurEgal;
                        testValeur.ExpressionValeur = new C2iExpressionConstante(valeurTest);
                        compoPrincipal.AddComposantFils(testValeur);
                        blFiltre.Append("=");
                        blFiltre.Append(valeurTest.ToString());
                        blFiltre.Append(";");
                    }
                }
            }
            if (blFiltre.Length == 0)//Pas de filtre
            {
                return(resObjet);
            }
            strFiltre = blFiltre.ToString();
            CObjetDonnee objet = contexteImport.GetEntiteForFiltre(TypeEntite, strFiltre);

            if (objet != null)
            {
                resObjet.DataType = objet;
                return(resObjet);
            }

            CFiltreDynamique filtre = new CFiltreDynamique(contexteImport.ContexteDonnee);

            filtre.TypeElements       = TypeEntite;
            filtre.ComposantPrincipal = compoPrincipal;
            res = filtre.GetFiltreData();
            if (res && res.Data is CFiltreDataAvance)
            {
                if (valeursFixes != null)
                {
                    CFiltreDataAvance filtreData = res.Data as CFiltreDataAvance;
                    StringBuilder     blAdd      = new StringBuilder();
                    int nParam = filtreData.Parametres.Count + 1;
                    foreach (KeyValuePair <string, object> kv in valeursFixes.ValeursFixes)
                    {
                        if (kv.Value == null)
                        {
                            blAdd.Append("HasNo(");
                            blAdd.Append(kv.Key);
                            blAdd.Append(") and ");
                        }
                        else
                        {
                            blAdd.Append(kv.Key);
                            blAdd.Append("=@");
                            blAdd.Append((nParam++));
                            blAdd.Append(" and ");
                            filtreData.Parametres.Add(kv.Value);
                        }
                    }
                    blAdd.Remove(blAdd.Length - 5, 5);
                    if (filtreData.Filtre.Length > 0)
                    {
                        blAdd.Insert(0, " and ");
                    }
                    filtreData.Filtre += blAdd;
                }
                objet = Activator.CreateInstance(TypeEntite, new object[] { contexteImport.ContexteDonnee }) as CObjetDonnee;
                if (objet.ReadIfExists(((CFiltreData)res.Data)))
                {
                    contexteImport.SetEntiteForFiltre(strFiltre, objet);
                    resObjet.DataType = objet;
                    return(resObjet);
                }
            }
            else
            {
                res.EmpileErreur(I.T("Erreur while searching object|20093"));
                resObjet.EmpileErreur(res.Erreur);
                return(resObjet);
            }
            return(resObjet);
        }