Exemple #1
0
        /// /////////////////////////////////////////
        public CResultAErreur Serialize(C2iSerializer serializer)
        {
            int            nVersion = GetNumVersion();
            CResultAErreur result   = serializer.TraiteVersion(ref nVersion);

            if (!result)
            {
                return(result);
            }
            I2iSerializable objet = m_structure;

            result      = serializer.TraiteObject(ref objet);
            m_structure = (C2iStructureExport)objet;

            objet    = m_filtre;
            result   = serializer.TraiteObject(ref objet);
            m_filtre = (CFiltreDynamique)objet;

            return(result);
        }
Exemple #2
0
        //---------------------------------
        public override CResultAErreur EndInsertData(System.Data.DataSet ds)
        {
            CResultAErreur result = base.EndInsertData(ds);

            if (NePasCalculer)
            {
                return(result);
            }
            if (!result)
            {
                return(result);
            }
            try
            {
                //Table qui a été créé et sur laquelle les tables filles ont un lien
                DataTable tableDeLien = ds.Tables[NomTable];
                tableDeLien.TableName = NomTable + "_WK";

                //TAble qui va stocker les données finales
                DataTable tableDest = new DataTable(NomTable);
                ds.Tables.Add(tableDest);


                #region Création de la table finale
                //Crée le champ d'id
                C2iStructureExport.CreateChampInTableAIdAuto(tableDest, 0);

                DataColumn colLienFinale = null;

                //Crée le champ de lien avec la table parente
                //Recherche de la table parente
                string strFK = "";
                foreach (Constraint contrainte in tableDeLien.Constraints)
                {
                    ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint;
                    if (fk != null)
                    {
                        if (fk.Table == tableDeLien)
                        {
                            strFK         = fk.Columns[0].ColumnName;
                            colLienFinale = C2iStructureExport.CreateForeignKeyInTable(fk.RelatedColumns[0], tableDest, 0);
                            break;
                        }
                    }
                }

                if (colLienFinale == null && ChampOrigine != null)
                {
                    result.EmpileErreur(I.T("Cannot establish a link for Union table @1|20008", NomTable));
                    return(result);
                }

                //Création de l'ancienne colonne Id
                DataColumn colOldId = null;
                if (ChampOrigine != null && !(ChampOrigine is CDefinitionProprieteDynamiqueThis))
                {
                    string strColOldId = DynamicClassAttribute.GetNomConvivial(ChampOrigine.TypeDonnee.TypeDotNetNatif) + "_Id_0";
                    colOldId             = new DataColumn(strColOldId, typeof(int));
                    colOldId.AllowDBNull = true;
                    tableDest.Columns.Add(colOldId);
                }

                //Création des colonnes pour les valeurs
                foreach (C2iChampExport champ in Champs)
                {
                    CreateChampInTable(champ, tableDest);
                }
                #endregion

                //Met en cache les clés filles vers les clés parentes
                Dictionary <int, int> dicIdsFillesToParent = new Dictionary <int, int>();
                string strPrimKey = tableDeLien.PrimaryKey[0].ColumnName;
                if (colLienFinale != null)
                {
                    foreach (DataRow row in tableDeLien.Rows)
                    {
                        dicIdsFillesToParent[(int)row[strPrimKey]] = (int)row[strFK];
                    }
                }

                DataColumn colLienDeFille = null;

                if (TablesFilles.Length == 0)
                {
                    return(result);
                }

                DataTable tableSource = ds.Tables[TablesFilles[0].NomTable];
                if (tableSource == null)
                {
                }

                //Trouve la colonne de lien avec la table de lien
                foreach (Constraint contrainte in tableSource.Constraints)
                {
                    ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint;
                    if (fk != null &&
                        fk.RelatedTable == tableDeLien)
                    {
                        colLienDeFille = fk.Columns[0];
                        break;
                    }
                }
                if (colLienDeFille == null)
                {
                    result.EmpileErreur(I.T("Cannot find a link between @1 and @2|20007",
                                            tableDeLien.TableName, tableSource.TableName));
                    return(result);
                }
                CCacheValeursProprietes cacheValeurs = new CCacheValeursProprietes();
                cacheValeurs.CacheEnabled = true;


                foreach (DataRow rowSource in tableSource.Rows)
                {
                    bool bIntegrerRow = true;
                    if (m_formuleSelection != null)
                    {
                        CContexteEvaluationExpression ctxEval = new CContexteEvaluationExpression(rowSource);
                        result = m_formuleSelection.Eval(ctxEval);
                        if (!result)
                        {
                            return(result);
                        }
                        if (result.Data is bool)
                        {
                            bIntegrerRow = (bool)result.Data;
                        }
                        if (result.Data is int)
                        {
                            bIntegrerRow = ((int)result.Data) != 0;
                        }
                    }
                    if (bIntegrerRow)
                    {
                        DataRow rowDest = tableDest.NewRow();
                        foreach (C2iChampExport champ in m_listeChamps)
                        {
                            try
                            {
                                rowDest[champ.NomChamp] = champ.GetValeur(rowSource, cacheValeurs, null);
                            }
                            catch { }
                        }
                        if (colOldId != null)
                        {
                            rowDest[colOldId] = rowSource[colLienDeFille];
                        }
                        if (colLienFinale != null)
                        {
                            int nIdLink = dicIdsFillesToParent[(int)rowSource[colLienDeFille]];
                            rowDest[colLienFinale] = nIdLink;
                        }
                        tableDest.Rows.Add(rowDest);
                    }
                }
                if (SupprimerTablesTravail)
                {
                    SupprimeTableEtDependances(ds, tableDeLien.TableName);
                }
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
            }

            return(result);
        }
        //---------------------------------
        public override CResultAErreur EndInsertData(System.Data.DataSet ds)
        {
            CResultAErreur result = base.EndInsertData(ds);

            if (NePasCalculer)
            {
                return(result);
            }
            if (!result)
            {
                return(result);
            }
            try
            {
                //Renomme la table de lien
                //Table qui a été créé et sur laquelle les tables filles ont un lien
                DataTable tableDeLien = ds.Tables[NomTable];
                tableDeLien.TableName = NomTable + "_WK";

                if (TablesFilles.Length == 0)
                {
                    return(result);
                }
                //Trouve la table fille
                DataTable tableSource = ds.Tables[TablesFilles[0].NomTable];
                if (tableSource == null)
                {
                    result.EmpileErreur(I.T("Table @1 doesn't exist|20004", TablesFilles[0].NomTable));
                    return(result);
                }

                CTableauCroise tableau = new CTableauCroise();
                tableau.CopieFrom(m_tableau);


                //Trouve le lien entre la table de lien et la table source
                DataColumn colDeLienSource = null;
                if (tableDeLien.Rows.Count != 0)                //Sinon, c'est qu'on est
                //Surement table racine, ou que l'on n'a pas de données
                {
                    foreach (Constraint contrainte in tableSource.Constraints)
                    {
                        ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint;
                        if (fk != null &&
                            fk.RelatedTable == tableDeLien)
                        {
                            colDeLienSource = fk.Columns[0];
                            break;
                        }
                    }
                }

                /*if (colDeLienSource == null)
                 * {
                 *      result.EmpileErreur(I.T("Cannot find a link between @1 and @2|20007",
                 *              tableDeLien.TableName, tableSource.TableName));
                 *      return result;
                 * }*/
                //Ajoute la colonne de lien comme clé
                if (colDeLienSource != null)
                {
                    tableau.InsertChampCle(0,
                                           new CCleTableauCroise(colDeLienSource.ColumnName, colDeLienSource.DataType));
                }

                result = tableau.CreateTableCroisee(tableSource);
                if (!result)
                {
                    return(result);
                }
                if (result)
                {
                    DataTable tableFinale = (DataTable)result.Data;
                    tableFinale.TableName = NomTable;

                    ds.Tables.Add(tableFinale);

                    //Crée le champ de lien avec la table parente
                    //Recherche de la table parente
                    string     strFK         = "";
                    DataColumn colLienFinale = null;
                    foreach (Constraint contrainte in tableDeLien.Constraints)
                    {
                        ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint;
                        if (fk != null)
                        {
                            if (fk.Table == tableDeLien)
                            {
                                strFK         = fk.Columns[0].ColumnName;
                                colLienFinale = C2iStructureExport.CreateForeignKeyInTable(fk.RelatedColumns[0], tableFinale, 0);
                                break;
                            }
                        }
                    }

                    if (colLienFinale == null && ChampOrigine != null)
                    {
                        result.EmpileErreur(I.T("Cannot establish a link for Union table @1|20008", NomTable));
                        return(result);
                    }

                    //Met en cache les clés filles vers les clés parentes
                    Dictionary <int, int> dicIdsFillesToParent = new Dictionary <int, int>();
                    string strPrimKey = tableDeLien.PrimaryKey[0].ColumnName;
                    if (colLienFinale != null)
                    {
                        foreach (DataRow row in tableDeLien.Rows)
                        {
                            dicIdsFillesToParent[(int)row[strPrimKey]] = (int)row[strFK];
                        }
                        if (colDeLienSource != null)
                        {
                            foreach (DataRow row in tableFinale.Rows)
                            {
                                row[colLienFinale.ColumnName] = dicIdsFillesToParent[(int)row[colDeLienSource.ColumnName]];
                            }
                        }
                    }
                }

                if (SupprimerTablesTravail)
                {
                    SupprimeTableEtDependances(ds, tableDeLien.TableName);
                }
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
            }

            return(result);
        }
Exemple #4
0
        public static CResultAErreur GetTableSource(IElementAVariablesDynamiquesAvecContexteDonnee elt, IDefinitionJeuDonnees defDonnees, IIndicateurProgression indicateur)
        {
            CResultAErreur result = CResultAErreur.True;

            if (!(defDonnees is CStructureExportAvecFiltre))
            {
                /*
                 * if (defDonnees is C2iRequete)
                 * return defDonnees.GetDonnees(elt, null, indicateur);
                 * if (defDonnees is CDefinitionJeuDonneesEasyQuery)
                 * {
                 * defDonnees.GetDonnees(elt, null, indicateur);
                 *
                 * }*/
                result = defDonnees.GetDonnees(elt, null, indicateur);
                if (result)
                {
                    DataSet ds = result.Data as DataSet;
                    if (ds != null && ds.Tables.Count > 0)
                    {
                        DataTable tableOrg    = ds.Tables[0];
                        DataTable tableRetour = tableOrg.Clone();
                        tableRetour.BeginLoadData();
                        foreach (DataRow row in tableOrg.Rows)
                        {
                            tableRetour.ImportRow(row);
                        }
                        tableRetour.EndLoadData();
                        result.Data = tableRetour;
                    }
                    return(result);
                }
            }
            if (defDonnees is CStructureExportAvecFiltre)
            {
                C2iStructureExport       structure  = ((CStructureExportAvecFiltre)defDonnees).Structure;
                ITableExport             table      = structure.Table;
                List <C2iChampDeRequete> lstGroupBy = new List <C2iChampDeRequete>();
                if (table is C2iTableExport)
                {
                    bool bFirst = true;
                    if (table is C2iTableExport)
                    {
                        //Vérifie que toutes les tables filles sont similaires
                        foreach (ITableExport tableFilleTmp in table.TablesFilles)
                        {
                            if (!(tableFilleTmp is C2iTableExportCumulee))
                            {
                                result.EmpileErreur(I.T("Child tables must all be Cumulated tables|186"));
                                return(result);
                            }
                            C2iRequeteAvancee requete = ((C2iTableExportCumulee)tableFilleTmp).Requete;
                            if (bFirst)
                            {
                                foreach (C2iChampDeRequete champ in requete.Champs)
                                {
                                    if (champ.GroupBy)
                                    {
                                        lstGroupBy.Add(champ);
                                    }
                                }
                            }
                            else
                            {
                                List <C2iChampDeRequete> lst = new List <C2iChampDeRequete>();
                                foreach (C2iChampDeRequete champ in requete.Champs)
                                {
                                    if (champ.GroupBy)
                                    {
                                        lst.Add(champ);
                                    }
                                }
                                bool bErreur = false;
                                if (lst.Count == lstGroupBy.Count)
                                {
                                    foreach (C2iChampDeRequete champ in lst)
                                    {
                                        if (!lstGroupBy.Contains(champ))
                                        {
                                            bErreur = true;
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    bErreur = true;
                                }
                                if (bErreur)
                                {
                                    result.EmpileErreur(I.T("All child tables must have the same 'group by' clause|286"));
                                    return(result);
                                }
                            }
                            bFirst = false;
                        }
                    }
                }

                result = defDonnees.GetDonnees(elt, null, indicateur);
                if (!result)
                {
                    return(result);
                }
                DataSet ds = (DataSet)result.Data;
                if (table is C2iTableExport && table.TablesFilles.Length != 0)
                {
                    //Met à plat la table

                    ds.EnforceConstraints = false;
                    DataTable    tableParent = ds.Tables[structure.Table.NomTable];
                    DataTable    tableFille  = ds.Tables[structure.Table.TablesFilles[0].NomTable];
                    DataRelation relation    = null;
                    //Cherche la relation entre la table Fille et la table parente
                    if (tableFille != null && tableParent != null)
                    {
                        foreach (DataRelation rel in tableParent.ChildRelations)
                        {
                            if (rel.ChildTable.TableName == tableFille.TableName)
                            {
                                relation = rel;
                                break;
                            }
                        }
                    }
                    if (tableParent == null || tableFille == null || relation == null)
                    {
                        result.EmpileErreur(I.T("Inexpected error on exported data|187"));
                        return(result);
                    }
                    //Ajoute les colonnes de la table parente
                    List <string> strCols = new List <String>();
                    foreach (DataColumn col in tableParent.Columns)
                    {
                        string     strNewCol = tableParent.TableName + "_" + col.ColumnName;
                        DataColumn newCol    = tableFille.Columns.Add(strNewCol, col.DataType);
                        newCol.AllowDBNull = col.AllowDBNull;
                        strCols.Add(strNewCol);
                    }
                    //Rempli les données dans la table filles
                    foreach (DataRow row in tableParent.Rows)
                    {
                        object[] datas = row.ItemArray;
                        foreach (DataRow rowFille in row.GetChildRows(relation))
                        {
                            for (int i = 0; i < datas.Length; i++)
                            {
                                rowFille[strCols[i]] = datas[i];
                            }
                        }
                    }
                    if (table.TablesFilles.Length > 1)
                    {
                        //Plus d'1 table, ajoute les colonnes des autres tables

                        //Repère les lignes par group by
                        Hashtable     tableGrpByToRow = new Hashtable();
                        List <string> lstNomsGroupBy  = new List <string>();
                        foreach (DataColumn col in relation.ChildColumns)
                        {
                            lstNomsGroupBy.Add(col.ColumnName);
                        }
                        foreach (C2iChampDeRequete champ in lstGroupBy)
                        {
                            lstNomsGroupBy.Add(champ.NomChamp);
                        }
                        foreach (DataRow row in tableFille.Rows)
                        {
                            tableGrpByToRow[GetCleLigne(row, lstNomsGroupBy)] = row;
                        }
                        //Ajoute les données des tables filles
                        for (int nTableFille = 1; nTableFille < table.TablesFilles.Length; nTableFille++)
                        {
                            //Crée la liste des champs groupBy
                            DataTable tableTmp = ds.Tables[structure.Table.TablesFilles[nTableFille].NomTable];
                            lstNomsGroupBy.Clear();
                            foreach (DataColumn col in tableTmp.ParentRelations[0].ChildColumns)
                            {
                                lstNomsGroupBy.Add(col.ColumnName);
                            }
                            foreach (C2iChampDeRequete champ in lstGroupBy)
                            {
                                lstNomsGroupBy.Add(champ.NomChamp);
                            }
                            //AJoute les colonnes
                            foreach (DataColumn col in tableTmp.Columns)
                            {
                                if (!col.AutoIncrement && !tableFille.Columns.Contains(col.ColumnName))
                                {
                                    tableFille.Columns.Add(col.ColumnName, col.DataType);
                                }
                            }
                            foreach (DataRow row in tableTmp.Rows)
                            {
                                DataRow rowDest = (DataRow)tableGrpByToRow[GetCleLigne(row, lstNomsGroupBy)];
                                if (rowDest == null)
                                {
                                    rowDest = tableFille.NewRow();
                                    //copie les valeurs parentes sur la nouvelle row
                                    DataRow rowParente = row.GetParentRow(tableTmp.ParentRelations[0]);
                                    foreach (DataColumn col in rowParente.Table.Columns)
                                    {
                                        string strCol = tableParent.TableName + "_" + col.ColumnName;
                                        if (tableFille.Columns[strCol] != null)
                                        {
                                            rowDest[strCol] = rowParente[col.ColumnName];
                                        }
                                    }
                                    tableGrpByToRow[GetCleLigne(row, lstNomsGroupBy)] = rowDest;
                                }
                                foreach (DataColumn col in tableTmp.Columns)
                                {
                                    if (tableFille.Columns.Contains(col.ColumnName))
                                    {
                                        rowDest[col.ColumnName] = row[col];
                                    }
                                }
                                if (rowDest.RowState == DataRowState.Detached)
                                {
                                    tableFille.Rows.Add(rowDest);
                                }
                            }
                        }
                    }
                    result.Data = tableFille;
                }
                else
                {
                    result.Data = ds.Tables[table.NomTable];
                }
                return(result);
            }
            return(result);
        }
Exemple #5
0
        //---------------------------------
        public override CResultAErreur EndInsertData(System.Data.DataSet ds)
        {
            CResultAErreur result = base.EndInsertData(ds);

            if (NePasCalculer)
            {
                return(result);
            }
            if (!result)
            {
                return(result);
            }
            try
            {
                //Renomme la table de travail avec un _ derrière


                //Table qui a été créé et sur laquelle les tables filles ont un lien
                DataTable tableDeLien = ds.Tables[NomTable];
                tableDeLien.TableName = NomTable + "_WK";

                //TAble qui va stocker les données finales
                DataTable tableDest = new DataTable(NomTable);
                ds.Tables.Add(tableDest);


                #region Création de la table finale
                //Crée le champ d'id
                C2iStructureExport.CreateChampInTableAIdAuto(tableDest, 0);

                DataColumn colLienFinale = null;

                //Crée le champ de lien avec la table parente
                //Recherche de la table parente
                string strFK = "";
                foreach (Constraint contrainte in tableDeLien.Constraints)
                {
                    ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint;
                    if (fk != null)
                    {
                        if (fk.Table == tableDeLien)
                        {
                            strFK         = fk.Columns[0].ColumnName;
                            colLienFinale = C2iStructureExport.CreateForeignKeyInTable(fk.RelatedColumns[0], tableDest, 0);
                            break;
                        }
                    }
                }

                if (colLienFinale == null && ChampOrigine != null)
                {
                    result.EmpileErreur(I.T("Cannot establish a link for Union table @1|20008", NomTable));
                    return(result);
                }

                //Création de l'ancienne colonne Id
                DataColumn colOldId = null;
                if (ChampOrigine != null && !(ChampOrigine is CDefinitionProprieteDynamiqueThis))
                {
                    string strColOldId = DynamicClassAttribute.GetNomConvivial(ChampOrigine.TypeDonnee.TypeDotNetNatif) + "_Id_0";;
                    colOldId             = new DataColumn(strColOldId, typeof(int));
                    colOldId.AllowDBNull = true;
                    tableDest.Columns.Add(colOldId);
                }
                #endregion

                //Met en cache les clés filles vers les clés parentes
                Dictionary <int, int> dicIdsFillesToParent = new Dictionary <int, int>();
                string strPrimKey = tableDeLien.PrimaryKey[0].ColumnName;
                if (colLienFinale != null)
                {
                    foreach (DataRow row in tableDeLien.Rows)
                    {
                        dicIdsFillesToParent[(int)row[strPrimKey]] = (int)row[strFK];
                    }
                }

                #region Création des champs
                Dictionary <string, int>  dicChampsDesTables  = new Dictionary <string, int>();
                List <DataColumn>         listeColonnesACreer = new List <DataColumn>();
                Dictionary <string, Type> typesDesChamps      = new Dictionary <string, Type>();

                Dictionary <string, DataColumn> colsDeLien = new Dictionary <string, DataColumn>();

                Dictionary <string, List <string> > listeColsToCopyParTable = new Dictionary <string, List <string> >();

                foreach (ITableExport uneTableSource in TablesFilles)
                {
                    DataTable tableSource = ds.Tables[uneTableSource.NomTable];
                    if (tableSource == null)
                    {
                        result.EmpileErreur(I.T("Table @1 doesn't exist|20004", uneTableSource.NomTable));
                        return(result);
                    }
                    DataColumn colDeLien = null;
                    //Trouve la colonne de lien avec la table de lien
                    foreach (Constraint contrainte in tableSource.Constraints)
                    {
                        ForeignKeyConstraint fk = contrainte as ForeignKeyConstraint;
                        if (fk != null &&
                            fk.RelatedTable == tableDeLien)
                        {
                            colDeLien = fk.Columns[0];
                            break;
                        }
                    }
                    if (colDeLien == null)
                    {
                        result.EmpileErreur(I.T("Cannot find a link between @1 and @2|20007",
                                                tableDeLien.TableName, tableSource.TableName));
                        return(result);
                    }
                    colsDeLien[tableSource.TableName] = colDeLien;

                    List <string> colsToCopy = new List <string>();
                    listeColsToCopyParTable[tableSource.TableName] = colsToCopy;

                    foreach (DataColumn col in tableSource.Columns)
                    {
                        //Ignore les clés
                        if (tableSource.PrimaryKey.Length > 0 &&
                            tableSource.PrimaryKey[0] == col)
                        {
                            continue;
                        }
                        if (col == colDeLien)
                        {
                            continue;
                        }
                        int nNb = 0;
                        colsToCopy.Add(col.ColumnName);
                        if (!dicChampsDesTables.TryGetValue(col.ColumnName.ToUpper(), out nNb))
                        {
                            dicChampsDesTables[col.ColumnName.ToUpper()] = 1;
                            listeColonnesACreer.Add(col);
                        }
                        else
                        {
                            nNb++;
                            dicChampsDesTables[col.ColumnName.ToUpper()] = nNb;
                        }
                    }
                }
                foreach (DataColumn col in listeColonnesACreer)
                {
                    DataColumn newCol = new DataColumn(col.ColumnName, col.DataType);
                    newCol.AllowDBNull = true;
                    tableDest.Columns.Add(newCol);
                }
                #endregion

                //Trouve les clés : les clés sont les champs communs à toutes les tables
                //ou les champs explicites
                List <string> champsCles = new List <string>();
                if (m_listeChampsClesExplicites.Count > 0)
                {
                    foreach (string strChampTmp in m_listeChampsClesExplicites)
                    {
                        if (dicChampsDesTables.ContainsKey(strChampTmp.ToUpper()))
                        {
                            champsCles.Add(strChampTmp);
                        }
                    }
                    if (champsCles.Count != m_listeChampsClesExplicites.Count)
                    {
                        result.EmpileErreur(I.T("Some keys are not in source tables|20012"));
                        return(result);
                    }
                }
                else
                {
                    int nNbTablesSource = TablesFilles.Length;
                    foreach (KeyValuePair <string, int> tableNb in dicChampsDesTables)
                    {
                        if (tableNb.Value == nNbTablesSource)
                        {
                            champsCles.Add(tableNb.Key);
                        }
                    }
                }

                string[] strChampsCles = champsCles.ToArray();

                //Il faut traiter les tables filles de celle qui a le plus de clés
                //à celle qui en a le moins
                List <string> lstNomTablesDansOrdre = new List <string>();
                for (int nNbClesTest = strChampsCles.Length; nNbClesTest >= 1; nNbClesTest--)
                {
                    foreach (ITableExport tableSource in TablesFilles)
                    {
                        int nNbClesDansTable = 0;
                        //Compte les champs clés présents
                        foreach (string strCol in listeColsToCopyParTable[tableSource.NomTable])
                        {
                            if (champsCles.Contains(strCol))
                            {
                                nNbClesDansTable++;
                            }
                        }
                        if (nNbClesDansTable == nNbClesTest)
                        {
                            lstNomTablesDansOrdre.Add(tableSource.NomTable);
                        }
                    }
                }

                if (strChampsCles.Length == 0)
                {
                    foreach (ITableExport table in TablesFilles)
                    {
                        lstNomTablesDansOrdre.Add(table.NomTable);
                    }
                }



                ///Index : clé (texte)->DataRow
                Dictionary <string, DataRow> dicIndex = new Dictionary <string, DataRow>();

                CFormatteurFiltreDataToStringDataTable formateurFiltre = new CFormatteurFiltreDataToStringDataTable();

                //Insere les données table par table
                foreach (string strNomTableSource in lstNomTablesDansOrdre)
                {
                    DataTable  tableSource = ds.Tables[strNomTableSource];
                    DataColumn colDeLien   = colsDeLien[tableSource.TableName];

                    bool          bHasAllKeys      = false;
                    List <string> strClesDansTable = new List <string>();
                    foreach (string strColKey in champsCles)
                    {
                        if (tableSource.Columns[strColKey] != null)
                        {
                            strClesDansTable.Add(strColKey);
                        }
                    }
                    if (strClesDansTable.Count == champsCles.Count)
                    {
                        bHasAllKeys = true;
                    }

                    /*if (strClesDansTable.Count == 0)
                     * {
                     *      //Aucune clé pour cette table, on ne sait pas quoi en faire !
                     *      result.EmpileErreur(I.T("Table @1 doesn't have any key|20013", tableSource.TableName));
                     *      return result;
                     * }*/

                    CFiltreData filtreDonnees = null;
                    if (!bHasAllKeys)
                    {
                        StringBuilder blFiltre   = new StringBuilder();
                        int           nParametre = 2;
                        blFiltre.Append(colDeLien.ColumnName);
                        blFiltre.Append("=@");
                        blFiltre.Append(1);
                        blFiltre.Append(" and ");
                        foreach (string strCle in strClesDansTable)
                        {
                            blFiltre.Append(strCle);
                            blFiltre.Append("=@");
                            blFiltre.Append(nParametre);
                            blFiltre.Append(" and ");
                            nParametre++;
                        }
                        blFiltre.Remove(blFiltre.Length - 5, 5);
                        filtreDonnees = new CFiltreData(blFiltre.ToString());
                    }

                    foreach (DataRow rowSource in tableSource.Rows)
                    {
                        StringBuilder blKey = new StringBuilder();
                        blKey.Append(rowSource[colDeLien].ToString() + "¤");
                        if (filtreDonnees != null)
                        {
                            filtreDonnees.Parametres.Clear();
                            filtreDonnees.Parametres.Add(rowSource[colDeLien]);
                        }
                        for (int nKey = 0; nKey < strClesDansTable.Count; nKey++)
                        {
                            object val = rowSource[strClesDansTable[nKey]];
                            if (filtreDonnees != null)
                            {
                                filtreDonnees.Parametres.Add(val);
                            }
                            else
                            {
                                if (val == null)
                                {
                                    blKey.Append("@NULL@");
                                }
                                else
                                {
                                    blKey.Append(val.ToString());
                                }
                                blKey.Append("¤");
                            }
                        }
                        DataRow[] rowsDest = null;
                        bool      bIsNew   = false;
                        string    strKey   = "";
                        if (filtreDonnees == null)
                        {
                            strKey = blKey.ToString();
                            DataRow rowTmp = null;
                            bIsNew = !dicIndex.TryGetValue(strKey, out rowTmp);
                            if (bIsNew)
                            {
                                rowTmp = tableDest.NewRow();
                            }
                            rowsDest = new DataRow[] { rowTmp };
                        }
                        else
                        {
                            string strFiltre = formateurFiltre.GetString(filtreDonnees);
                            rowsDest = tableDest.Select(strFiltre);
                            if (rowsDest.Length == 0)
                            {
                                rowsDest = new DataRow[] { tableDest.NewRow() };
                                bIsNew   = true;
                            }
                        }
                        foreach (DataRow rowDest in rowsDest)
                        {
                            foreach (string strCol in listeColsToCopyParTable[tableSource.TableName])
                            {
                                rowDest[strCol] = rowSource[strCol];
                            }
                            if (colOldId != null)
                            {
                                rowDest[colOldId] = rowSource[colDeLien];
                            }

                            if (colLienFinale != null)
                            {
                                int nIdLink = dicIdsFillesToParent[(int)rowSource[colDeLien]];
                                rowDest[colLienFinale] = nIdLink;
                            }
                        }
                        if (bIsNew)
                        {
                            tableDest.Rows.Add(rowsDest[0]);
                            if (bHasAllKeys)
                            {
                                dicIndex[strKey] = rowsDest[0];
                            }
                        }
                    }
                }
                if (SupprimerTablesTravail)
                {
                    SupprimeTableEtDependances(ds, tableDeLien.TableName);
                }
            }
            catch (Exception e)
            {
                result.EmpileErreur(new CErreurException(e));
            }

            return(result);
        }