예제 #1
0
        /// //////////////////////////////////////////////////////
        public static bool EditeTableau(CTableauCroise tableau, DataTable tableSource)
        {
            CFormEditTableauCroise form  = new CFormEditTableauCroise();
            CTableauCroise         copie = (CTableauCroise)CCloner2iSerializable.Clone(tableau);

            form.Init(copie, tableSource);
            Boolean bOk = form.ShowDialog() == DialogResult.OK;

            if (bOk)
            {
                tableau.CopieFrom(copie);
            }
            form.Dispose();
            return(bOk);
        }
        //---------------------------------
        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);
        }