Exemplo n.º 1
0
        /// /////////////////////////////////////////////////////////
        public CResultAErreur InsertDataInDataSet(
            IEnumerable list,
            DataSet ds,
            ITableExport tableParente,
            int[] nValeursCle,
            RelationAttribute relationToObjetParent,
            IElementAVariablesDynamiquesAvecContexteDonnee elementAVariablePourFiltres,
            CCacheValeursProprietes cacheValeurs,
            ITableExport tableFilleANeParCharger,
            bool bAvecOptimisation,
            CConteneurIndicateurProgression indicateur)
        {
            CResultAErreur result = CResultAErreur.True;

            if (NePasCalculer)
            {
                return(result);
            }
            int nValeurIndicateur = 0;

            indicateur.SetBornesSegment(0, m_tableauCroise == null?2:3);

            if (list == null)
            {
                return(result);
            }
            if (!(list is CListeObjetsDonnees))
            {
                result.EmpileErreur(I.T("Attempt of cumulated table on something other that a data list|125"));
                return(result);
            }

            CListeObjetsDonnees listeDonnees = (CListeObjetsDonnees)list;

            if (relationToObjetParent == null)
            {
                //Principe de la lecture en une fois :
                //Si la liste des une liste objets contenus, c'est que chaque élément
                //est un composant d'un parent. On stock donc tous les parents
                //Pour lesquels on veut les données,
                //et elles seront lues dans le EndInsertTable.
                //Par contre si la liste contenu a un filtre, on ne peut plus
                //stocker juste ça, il faudrait en plus stocker le filtre et ça
                //devient compliqué.
                if (listeDonnees is CListeObjetsDonneesContenus &&
                    (listeDonnees.Filtre == null ||
                     !listeDonnees.Filtre.HasFiltre))
                {
                    CListeObjetsDonneesContenus listeContenu = (CListeObjetsDonneesContenus)listeDonnees;
                    if (listeContenu.ObjetConteneur != null &&
                        typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(listeContenu.ObjetConteneur.GetType()))
                    {
                        if (m_mapIdBaseParentToReadToIdTable == null)
                        {
                            m_mapIdBaseParentToReadToIdTable = new Hashtable();
                        }
                        m_mapIdBaseParentToReadToIdTable[((CObjetDonneeAIdNumerique)listeContenu.ObjetConteneur).Id] = nValeursCle[0];
                        m_strChampIdParent = listeContenu.ChampsFille[0];
                        m_tableParente     = tableParente;
                        listeContenu.GetFiltreForRead();
                        m_nIdSession = listeContenu.ContexteDonnee.IdSession;
                        m_elementAVariablePourFiltres = elementAVariablePourFiltres;
                        return(result);
                    }
                }
            }


            DataTable table = ds.Tables[NomTable];

            if (table == null)
            {
                result.EmpileErreur(I.T("Table @1 doesn't exist|116", NomTable));
                return(result);
            }
            DataColumn colFille = null;

            if (tableParente != null)
            {
                foreach (Constraint constraint in table.Constraints)
                {
                    if (constraint is ForeignKeyConstraint)
                    {
                        ForeignKeyConstraint fkConst = (ForeignKeyConstraint)constraint;
                        colFille = fkConst.Columns[0];
                    }
                }
            }

            CFiltreData filtreDeBase = listeDonnees.GetFiltreForRead();

            result = GetFiltreDataAAppliquer(elementAVariablePourFiltres);
            if (!result)
            {
                result.EmpileErreur(I.T("Error in cumulated table @1 filter|126", NomTable));
                return(result);
            }

            CFiltreData leFiltreComplet = CFiltreData.GetAndFiltre(
                filtreDeBase, (CFiltreData)result.Data);

            C2iRequeteAvancee requete       = m_requete;
            CTableauCroise    tableauCroise = m_tableauCroise;

            string strChampParent = "";

            if (relationToObjetParent != null)
            {
                requete        = (C2iRequeteAvancee)CCloner2iSerializable.Clone(m_requete);
                strChampParent = relationToObjetParent.ChampsParent[0] + "_CLE_DB";

                Type          typeChampParent = typeof(string);
                IChampDeTable champParent     = tableParente.Champs.FirstOrDefault(c => c.NomChamp == strChampParent);
                if (champParent != null)
                {
                    typeChampParent = champParent.TypeDonnee;
                }


                C2iChampDeRequete champ = new C2iChampDeRequete(
                    strChampParent,
                    new CSourceDeChampDeRequete(relationToObjetParent.ChampsFils[0]),
                    typeof(int),
                    OperationsAgregation.None,
                    true);
                requete.ListeChamps.Add(champ);
                string strListe = "";

                foreach (int nId in nValeursCle)
                {
                    strListe += nId.ToString() + ";";
                }
                strListe        = strListe.Substring(0, strListe.Length - 1);
                leFiltreComplet = CFiltreData.GetAndFiltre(leFiltreComplet, new CFiltreDataAvance(
                                                               requete.TableInterrogee,
                                                               relationToObjetParent.ChampsFils[0] + " in {" + strListe + "}"));
                if (tableauCroise != null)
                {
                    tableauCroise = (CTableauCroise)CCloner2iSerializable.Clone(m_tableauCroise);
                    tableauCroise.AddChampCle(new CCleTableauCroise(strChampParent, typeChampParent));
                }
            }
            requete.FiltreAAppliquer = leFiltreComplet;

            indicateur.SetInfo(I.T("Table @1 (request)|127", NomTable));

            if (ChampOrigine == null)
            {
                requete.TableInterrogee = CContexteDonnee.GetNomTableForType(listeDonnees.TypeObjets);
            }

            result = requete.ExecuteRequete(listeDonnees.ContexteDonnee.IdSession);
            indicateur.SetValue(nValeurIndicateur++);
            if (indicateur.CancelRequest)
            {
                result.EmpileErreur(I.T("Execution cancelled by the user|118"));
                return(result);
            }

            if (!result)
            {
                return(result);
            }
            if (result.Data == null)
            {
                return(null);
            }
            DataTable tableDonnees = (DataTable)result.Data;

            if (tableauCroise != null)
            {
                indicateur.SetInfo(I.T("Table @1 (cross table)|128", NomTable));
                result = tableauCroise.CreateTableCroisee(tableDonnees);
                indicateur.SetValue(nValeurIndicateur++);
                if (!result)
                {
                    result.EmpileErreur(I.T("Error in data crossing|130"));
                    return(result);
                }
                if (indicateur.CancelRequest)
                {
                    result.EmpileErreur(I.T("Execution cancelled by the user|118"));
                    return(result);
                }
                tableDonnees = (DataTable)result.Data;
                foreach (DataColumn col in tableDonnees.Columns)
                {
                    DataColumn laColonne = table.Columns[col.ColumnName];
                    if (laColonne == null)
                    {
                        table.Columns.Add(col.ColumnName, col.DataType);
                    }
                    //Stef le 5/5/2005 : Si la colonne n'est pas du bon type,
                    //son type est ajusté !
                    else if (laColonne.DataType != col.DataType)
                    {
                        laColonne.DataType = col.DataType;
                    }
                }
            }
            else
            {
                //Ajuste le type des colonnes
                foreach (DataColumn col in tableDonnees.Columns)
                {
                    DataColumn laColonne = table.Columns[col.ColumnName];
                    if (laColonne != null && laColonne.DataType != col.DataType)
                    {
                        laColonne.DataType = col.DataType;
                    }
                }
            }

            indicateur.SetInfo(I.T("Storage|129"));
            indicateur.PushSegment(nValeurIndicateur, nValeurIndicateur + 1);
            indicateur.SetBornesSegment(0, tableDonnees.Rows.Count);

            int nFrequence = Math.Min(tableDonnees.Rows.Count / 20, 500) + 1;

            //Intègre les données dans la table
            ArrayList lstNewRows = new ArrayList();
            int       nCompteur  = 0;

            foreach (DataRow row in tableDonnees.Rows)
            {
                nCompteur++;
                if (nCompteur % nFrequence == 0)
                {
                    indicateur.SetValue(nCompteur);
                    if (indicateur.CancelRequest)
                    {
                        result.EmpileErreur(I.T("Execution cancelled by the user|118"));
                        return(result);
                    }
                }
                DataRow newRow = table.NewRow();
                foreach (DataColumn col in row.Table.Columns)
                {
                    if (newRow.Table.Columns[col.ColumnName] != null)
                    {
                        newRow[col.ColumnName] = row[col];
                    }
                }
                if (colFille != null)
                {
                    if (relationToObjetParent == null)
                    {
                        newRow[colFille] = nValeursCle[0];
                    }
                    else
                    {
                        newRow[colFille] = row[strChampParent];
                    }
                }
                table.Rows.Add(newRow);
            }
            indicateur.PopSegment();
            return(result);
        }