示例#1
0
        //---------------------------------------------------------------------------------------------
        private void FiltrerTable()
        {
            if (m_tableExport == null ||
                (!(m_tableExport is C2iTableExport)))
            {
                return;
            }
            ITableExport tableExport = (ITableExport)m_tableExport;

            if (tableExport.ChampOrigine == null)
            {
                return;
            }
            CFiltreDynamique filtre = ((ITableExport)m_tableExport).FiltreAAppliquer;

            if (filtre == null)
            {
                filtre = new CFiltreDynamique();
                filtre.TypeElements = tableExport.ChampOrigine.TypeDonnee.TypeDotNetNatif;
            }
            filtre.ElementAVariablesExterne = m_elementAVariablesPourFiltre;
            if (CFormEditFiltreDynamique.EditeFiltre(filtre, true, true, tableExport.ChampOrigine))
            {
                tableExport.FiltreAAppliquer = filtre;
                InitChamps();
            }
        }
 //----------------------------------------------------------------------------------
 public CResultAErreur InsertDataInDataSet(
     IEnumerable list,
     DataSet ds,
     ITableExport tableParente,
     int nValeurCle,
     IElementAVariablesDynamiquesAvecContexteDonnee elementAVariablePourFiltres,
     CCacheValeursProprietes cacheValeurs,
     ITableExport tableFilleANeParCharger,
     bool bAvecOptimisation,
     CConteneurIndicateurProgression indicateur)
 {
     return(InsertDataInDataSet(list, ds, tableParente, new int[] { nValeurCle }, null, elementAVariablePourFiltres, cacheValeurs, null, bAvecOptimisation, indicateur));
 }
 //---------------------------------
 public override CResultAErreur InsertDataInDataSet(
     IEnumerable list,
     DataSet ds,
     ITableExport tableParente,
     int[] nValeursCle,
     RelationAttribute relationToObjetParent,
     IElementAVariablesDynamiquesAvecContexteDonnee elementAVariablePourFiltres,
     CCacheValeursProprietes cacheValeurs,
     ITableExport tableFilleANePasCharger,
     bool bAvecOptimisation,
     CConteneurIndicateurProgression indicateur)
 {
     if (tableParente != null)
     {
         return(base.InsertDataInDataSet(
                    list,
                    ds,
                    tableParente,
                    nValeursCle,
                    relationToObjetParent,
                    elementAVariablePourFiltres,
                    cacheValeurs,
                    tableFilleANePasCharger,
                    bAvecOptimisation,
                    indicateur));
     }
     else
     {
         CResultAErreur result = CResultAErreur.True;
         foreach (ITableExport tableFille in TablesFilles)
         {
             result = tableFille.InsertDataInDataSet(
                 list,
                 ds,
                 tableParente,
                 nValeursCle,
                 relationToObjetParent,
                 elementAVariablePourFiltres,
                 cacheValeurs,
                 tableFilleANePasCharger,
                 bAvecOptimisation,
                 indicateur);
             if (!result)
             {
                 return(result);
             }
         }
         return(result);
     }
 }
        //----------------------------------------------------------------------------------
        public CResultAErreur InitChamps(
            ITableExport table,
            ITableExport tableParente,
            C2iStructureExport structure,
            IElementAVariablesDynamiquesAvecContexteDonnee eltAVariablesDynamiques)
        {
            CResultAErreur result = CResultAErreur.True;

            m_tableCalculee = table as C2iTableExportCalculee;

            if (m_tableCalculee == null)
            {
                return(CResultAErreur.False);
            }

            m_structureExport = structure;

            m_txtNomTable.Text = m_tableCalculee.NomTable;

            if (m_tableCalculee.FormuleValeur != null)
            {
                m_txtFormuleValeur.Text = m_tableCalculee.FormuleValeur.GetString();
            }
            else
            {
                m_txtFormuleValeur.Text = "";
            }
            if (m_tableCalculee.FormuleNbRecords != null)
            {
                m_txtFormuleNbRecords.Text = m_tableCalculee.FormuleNbRecords.GetString();
            }
            else
            {
                m_txtFormuleNbRecords.Text = "0";
            }

            ElementAVariablesDynamiques = eltAVariablesDynamiques;

            C2iTableExportCalculee.CTypeForFormule leType = new C2iTableExportCalculee.CTypeForFormule(m_elementAVariablesDynamiques);

            m_wndAideFormule.ObjetInterroge        = typeof(C2iTableExportCalculee.CTypeForFormule);
            m_wndAideFormule.FournisseurProprietes = leType;

            m_txtFormuleValeur.Init(m_wndAideFormule.FournisseurProprietes, m_wndAideFormule.ObjetInterroge);
            m_txtFormuleNbRecords.Init(m_wndAideFormule.FournisseurProprietes, m_wndAideFormule.ObjetInterroge);

            return(result);
        }
        /// /////////////////////////////////////////////////////////
        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;

            result.EmpileErreur(I.T("Not supported function calling : C2iTableExportCalculée.InsertDataInDataset|124"));
            return(result);
        }
示例#6
0
 //----------------------------------------------------------------------------------
 private void GetDependancesDeTableSimple(ITableExport table, Hashtable tableOrigines, string strChemin)
 {
     foreach (ITableExport tableFille in table.TablesFilles)
     {
         CDefinitionProprieteDynamique def = tableFille.ChampOrigine;
         if (def != null)
         {
             string strChamp = strChemin;
             if (strChamp.Length > 0)
             {
                 strChamp += ".";
             }
             strChamp += def.NomPropriete;
             tableOrigines[strChamp] = true;
             GetDependancesDeTableSimple(tableFille, tableOrigines, strChamp);
         }
     }
 }
示例#7
0
        //------------------------------------------
        public CResultAErreur InitChamps(
            ITableExport table,
            ITableExport tableParente,
            C2iStructureExport structure,
            IElementAVariablesDynamiquesAvecContexteDonnee eltAVariablesPourFiltre)
        {
            CResultAErreur result = CResultAErreur.True;

            m_tableExport                 = table as C2iTableExport;
            m_tableParente                = tableParente;
            m_structureExport             = structure;
            m_elementAVariablesPourFiltre = eltAVariablesPourFiltre;
            if (m_tableExport == null)
            {
                result.EmpileErreur(I.T("Bad table format|20003"));
                return(result);
            }
            InitChamps();
            return(result);
        }
        //------------------------------------------
        public CResultAErreur InitChamps(
            ITableExport table,
            ITableExport tableParente,
            C2iStructureExport structure,
            IElementAVariablesDynamiquesAvecContexteDonnee eltAVariablesPourFiltre)
        {
            CResultAErreur result = CResultAErreur.True;

            m_tableVue                    = table as C2iTableExportVue;
            m_tableParente                = tableParente;
            m_structureExport             = structure;
            m_elementAVariablesPourFiltre = eltAVariablesPourFiltre;
            if (m_tableVue == null)
            {
                result.EmpileErreur(I.T("Bad table format|20003"));
                return(result);
            }
            InitChamps();

            //Crée une table bidon avec tous les champs de la table fille de cette table
            DataTable tableBidon = new DataTable();

            if (m_tableVue.TablesFilles.Length != 0)
            {
                foreach (IChampDeTable champ in m_tableVue.TablesFilles[0].Champs)
                {
                    Type tp = champ.TypeDonnee;
                    if (tp.IsGenericType && tp.GetGenericTypeDefinition() == typeof(Nullable <>))
                    {
                        tp = tp.GetGenericArguments()[0];
                    }
                    DataColumn col = new DataColumn(champ.NomChamp, tp);
                    tableBidon.Columns.Add(col);
                }
            }
            m_fournisseur = new CFournisseurPropDynForDataTable(tableBidon);
            return(result);
        }
示例#9
0
        //----------------------------------------------------------------------------------
        public CResultAErreur InitChamps(
            ITableExport table,
            ITableExport tableParente,
            C2iStructureExport structure,
            IElementAVariablesDynamiquesAvecContexteDonnee eltAVariablesDynamiques)
        {
            CResultAErreur result = CResultAErreur.True;

            m_tableUnion = table as C2iTableExportUnion;

            if (m_tableUnion == null)
            {
                return(CResultAErreur.False);
            }

            m_txtNomTable.Text = m_tableUnion.NomTable;
            if (m_tableUnion.ChampOrigine is CDefinitionProprieteDynamiqueThis)
            {
                m_lblType.Text = DynamicClassAttribute.GetNomConvivial(m_tableUnion.ChampOrigine.TypeDonnee.TypeDotNetNatif);
            }
            else if (m_tableUnion.ChampOrigine != null)
            {
                m_lblType.Text = m_tableUnion.ChampOrigine.Nom;
            }
            else
            {
                m_lblType.Text = "";
            }
            m_chkSupprimerTablesTravail.Checked = m_tableUnion.SupprimerTablesTravail;


            m_tableUnion.RecalcStructure();
            FillListeChamps();


            return(result);
        }
示例#10
0
 /// /////////////////////////////////////////////////////////
 public void AddTableFille(ITableExport table)
 {
     m_listeTables.Add(table);
 }
示例#11
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);
        }
示例#12
0
 //----------------------------------------------------------------------------------
 /// <summary>
 /// Indique si une table fille peut être optimisée, et donc, chargée
 /// en une seule passe, ou s'il est nécéssaire de créer chaque enregistrement
 /// fils pour chaque enregistrement parent
 /// </summary>
 /// <param name="tableFille"></param>
 /// <param name="tpDeMesElements">Type des éléments contenus dans this</param>
 /// <returns></returns>
 public virtual bool IsOptimisable(ITableExport tableFille, Type tpDeMesElements)
 {
     if (ChampOrigine == null || ChampOrigine.NomPropriete.IndexOf('.') < 0 ||
         !ChampOrigine.TypeDonnee.IsArrayOfTypeNatif)
     {
         if (tableFille is C2iTableExportATableFille || tableFille is C2iTableExportCumulee)
         {
             if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueDonneeCumulee)
             {
                 return(true);
             }
             else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueRelationTypeId)
             {
                 return(true);
             }
             else if (tableFille.ChampOrigine != null && !tableFille.ChampOrigine.TypeDonnee.IsArrayOfTypeNatif && tableFille.ChampOrigine.GetType() == typeof(CDefinitionProprieteDynamiqueDotNet))                    //Table parente
             {
                 //est-ce que cette table parente peut être lue comme une dépendance ?
                 return(true);
             }
             else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueThis)
             {
                 return(true);
             }
             else
             {
                 string strPropOrigine = tableFille.ChampOrigine.NomProprieteSansCleTypeChamp;
                 if (strPropOrigine.IndexOf('.') < 0)
                 {
                     //Seules les propriétés directes sont optimisées (pour le moment et peut être que ça suffit)
                     PropertyInfo info = tpDeMesElements.GetProperty(strPropOrigine);
                     if (info != null)
                     {
                         object[] attribs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                         if (attribs.Length > 0)
                         {
                             RelationFilleAttribute attrFille = (RelationFilleAttribute)attribs[0];
                             tpDeMesElements = attrFille.TypeFille;
                             if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpDeMesElements))
                             {
                                 info = tpDeMesElements.GetProperty(attrFille.ProprieteFille);
                                 if (info != null)
                                 {
                                     attribs = info.GetCustomAttributes(typeof(RelationAttribute), true);
                                     if (attribs.Length > 0)
                                     {
                                         RelationAttribute attrParent = (RelationAttribute)attribs[0];
                                         if (attrParent.ChampsFils.Length == 1)
                                         {
                                             return(true);
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     return(false);
 }
示例#13
0
 /// //////////////////////////////////////////////////////////////
 public void RemoveTableFille(ITableExport table)
 {
 }
示例#14
0
        //----------------------------------------------------------------------------------
        public virtual CResultAErreur InsertDataInDataSet(
            IEnumerable list,
            DataSet ds,
            ITableExport tableParente,
            int[] nValeursCle,
            RelationAttribute relationToObjetParent,
            IElementAVariablesDynamiquesAvecContexteDonnee elementAVariablePourFiltres,
            CCacheValeursProprietes cacheValeurs,
            ITableExport tableFilleANePasCharger,
            bool bAvecOptimisation,
            CConteneurIndicateurProgression indicateur)
        {
            CResultAErreur result = CResultAErreur.True;

            if (NePasCalculer)
            {
                return(result);
            }
            if (tableParente != null && nValeursCle.Length == 0)
            {
                return(result);
            }
            DataTable table = ds.Tables[NomTable];

            if (table == null)
            {
                result.EmpileErreur(I.T("Table @1 doesn't exist|116", NomTable));
                return(result);
            }
            indicateur.SetInfo(I.T("Table @1|115", NomTable));
            if (nValeursCle.Length > 1 &&
                relationToObjetParent == null)
            {
                result.EmpileErreur(I.T("Error: Multiple child table loading without knowing the relation indicating how the parental link is established|117"));
                return(result);
            }



            DataColumn colFilleDeContrainte   = null;
            DataTable  tableFilleDeContrainte = null;

            if (tableParente != null)
            {
                if (ChampOrigine.TypeDonnee.IsArrayOfTypeNatif || !bAvecOptimisation ||
                    ChampOrigine is CDefinitionProprieteDynamiqueThis)
                {
                    //On est dans une relation fille
                    foreach (Constraint constraint in table.Constraints)
                    {
                        if (constraint is ForeignKeyConstraint)
                        {
                            ForeignKeyConstraint fkConst = (ForeignKeyConstraint)constraint;
                            if (fkConst.RelatedTable.TableName == tableParente.NomTable)
                            {
                                colFilleDeContrainte = fkConst.Columns[0];
                                break;
                            }
                        }
                    }
                    tableFilleDeContrainte = table;
                }
                else
                {
                    //On est dans une relation parente
                    DataTable tblP = ds.Tables[tableParente.NomTable];
                    foreach (Constraint contraint in tblP.Constraints)
                    {
                        if (contraint is ForeignKeyConstraint)
                        {
                            ForeignKeyConstraint fk = (ForeignKeyConstraint)contraint;
                            if (fk.RelatedTable.TableName == table.TableName)
                            {
                                colFilleDeContrainte   = fk.Columns[0];
                                tableFilleDeContrainte = tblP;
                                break;
                            }
                        }
                    }
                }
            }

            if (list == null)
            {
                return(result);
            }


            //Désactive les ids auto sur les objetDonneeAIdNumerique.
            //Car on utilise alors les valeurs de clé des éléments
            bool bUtiliserIdObjets = false;

            if (bAvecOptimisation && (ChampOrigine == null || ChampOrigine.NomPropriete.IndexOf('.') < 0 || !ChampOrigine.TypeDonnee.IsArrayOfTypeNatif))
            {
                if (list is CListeObjetsDonnees && (tableParente == null || colFilleDeContrainte == null))
                {
                    if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(((CListeObjetsDonnees)list).TypeObjets))
                    {
                        table.PrimaryKey[0].AutoIncrement = false;
                        bUtiliserIdObjets = true;
                    }
                }
                if (list is ArrayList)
                {
                    ArrayList arrL = (ArrayList)list;
                    if (arrL.Count > 0 &&
                        typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(arrL[0].GetType()))
                    {
                        table.PrimaryKey[0].AutoIncrement = false;
                        bUtiliserIdObjets = true;
                    }
                }
            }

            if (FiltreAAppliquer != null)
            {
                CListeObjetsDonnees listeObjetsDonnee = list as CListeObjetsDonnees;
                if (listeObjetsDonnee == null)//Tente de convertir en liste d'objets
                {
                    //Récupère le contexte de données
                    CContexteDonnee ctx = null;
                    foreach (object obj in list)
                    {
                        IObjetAContexteDonnee objACtx = obj as IObjetAContexteDonnee;
                        if (objACtx != null)
                        {
                            ctx = objACtx.ContexteDonnee;
                            break;
                        }
                    }
                    listeObjetsDonnee = CListeObjetsDonnees.CreateListFrom(ctx, list);
                }
                if (listeObjetsDonnee != null)
                {
                    list   = listeObjetsDonnee;
                    result = GetFiltreDataAAppliquer(elementAVariablePourFiltres);
                    if (!result)
                    {
                        result.EmpileErreur(I.T("Error in the filter of the table @1|119", NomTable));
                        return(result);
                    }
                    try
                    {
                        if (result.Data != null)
                        {
                            listeObjetsDonnee.Filtre = CFiltreData.GetAndFiltre(listeObjetsDonnee.Filtre, (CFiltreData)result.Data);
                        }
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                        result.EmpileErreur(I.T("Error during combination of table @1 filter|120", NomTable));
                        return(result);
                    }
                }
            }

            //Table fille->
            //si relation : Attribut relation (parente) représentant le lien entre la relation fille et cette tablle
            //Si donnée cumulée : true
            Hashtable tableTablesFillesToDependanceDirecte = new Hashtable();

            //Table parente->Champ fille contenant l'id
            Hashtable tableParentsCharges = new Hashtable();

            #region Optimisations des CListeObjetsDonnees


            if (bAvecOptimisation && list is CListeObjetsDonnees)
            {
                CListeObjetsDonnees listeObjets = (CListeObjetsDonnees)list;

                if (bUtiliserIdObjets)
                {
                    #region Identifie les tables filles qui peuvent être remplies en une seule requête.
                    //Identifie les sous tables qui peuvent être chargées en une seule fois :
                    //Il s'agit des sous tables liée directement à une propriété par
                    //des relations (attribut RelationFille ou Relation).
                    foreach (ITableExport tableFille in TablesFilles)
                    {
                        Type tpAnalyse = listeObjets.TypeObjets;
                        if (tableFille != tableFilleANePasCharger && (tableFille is C2iTableExportATableFille || tableFille is C2iTableExportCumulee))
                        {
                            if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueDonneeCumulee)
                            {
                                tableTablesFillesToDependanceDirecte[tableFille] = true;
                            }
                            else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueRelationTypeId)
                            {
                                tableTablesFillesToDependanceDirecte[tableFille] = true;
                            }
                            else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueThis)
                            {
                                tableTablesFillesToDependanceDirecte[tableFille] = true;
                            }
                            else if (tableFille.ChampOrigine != null)
                            {
                                string strPropOrigine = tableFille.ChampOrigine.NomProprieteSansCleTypeChamp;
                                if (strPropOrigine.IndexOf('.') < 0)
                                {
                                    //Seules les propriétés directes sont optimisées (pour le moment et peut être que ça suffit)
                                    PropertyInfo info = tpAnalyse.GetProperty(strPropOrigine);
                                    if (info != null)
                                    {
                                        object[] attribs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                                        if (attribs.Length > 0)
                                        {
                                            RelationFilleAttribute attrFille = (RelationFilleAttribute)attribs[0];
                                            tpAnalyse = attrFille.TypeFille;
                                            if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(tpAnalyse))
                                            {
                                                info = tpAnalyse.GetProperty(attrFille.ProprieteFille);
                                                if (info != null)
                                                {
                                                    attribs = info.GetCustomAttributes(typeof(RelationAttribute), true);
                                                    if (attribs.Length > 0)
                                                    {
                                                        RelationAttribute attrParent = (RelationAttribute)attribs[0];
                                                        if (attrParent.ChampsFils.Length == 1)
                                                        {
                                                            tableTablesFillesToDependanceDirecte[tableFille] = attrParent;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    #endregion

                    #region Charges les tables parentes qui peuvent être chargées
                    if (typeof(CObjetDonneeAIdNumerique).IsAssignableFrom(listeObjets.TypeObjets))
                    {
                        string strNomTableFille = listeObjets.NomTable;
                        foreach (ITableExport tableParenteAOptimiser in TablesFilles)
                        {
                            if (tableParenteAOptimiser != tableFilleANePasCharger && tableParenteAOptimiser.ChampOrigine != null && !tableParenteAOptimiser.ChampOrigine.TypeDonnee.IsArrayOfTypeNatif)
                            {
                                if (IsOptimisable(tableParenteAOptimiser, TypeSource))
                                {
                                    CListeObjetsDonnees listeMere = listeObjets.GetDependances(tableParenteAOptimiser.ChampOrigine.NomProprieteSansCleTypeChamp);
                                    if (listeMere != null)
                                    {
                                        result = tableParenteAOptimiser.InsertDataInDataSet(
                                            listeMere,
                                            ds,
                                            null,
                                            0,
                                            elementAVariablePourFiltres,
                                            cacheValeurs,
                                            this,
                                            true,
                                            indicateur);
                                        if (!result)
                                        {
                                            return(result);
                                        }
                                        //Trouve le champ fille de lien
                                        foreach (Constraint contrainte in table.Constraints)
                                        {
                                            if (contrainte is ForeignKeyConstraint)
                                            {
                                                ForeignKeyConstraint fk = (ForeignKeyConstraint)contrainte;
                                                if (fk.RelatedTable.TableName == tableParenteAOptimiser.NomTable)
                                                {
                                                    tableParentsCharges[tableParenteAOptimiser] = fk.Columns[0].ColumnName;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    #endregion
                }

                #region Identification des dépendances
                if (m_strDependancesToOptim == null)
                {
                    Hashtable tableDependances = new Hashtable();
                    AddProprietesOrigineDesChampsToTable(tableDependances, "", listeObjets.ContexteDonnee);
                    foreach (ITableExport tableFille in TablesFilles)
                    {
                        if (tableFille != tableFilleANePasCharger &&
                            !tableTablesFillesToDependanceDirecte.Contains(tableFille) &&
                            !tableParentsCharges.Contains(tableFille))
                        {
                            string strChemin = "";
                            if (ChampOrigine != null)
                            {
                                strChemin = ChampOrigine.NomPropriete;
                            }
                            if (tableFille.FiltreAAppliquer == null)
                            {
                                tableFille.AddProprietesOrigineDesChampsToTable(tableDependances, strChemin, listeObjets.ContexteDonnee);
                            }
                        }
                    }
                    m_strDependancesToOptim = new string[tableDependances.Count];
                    int nDep = 0;
                    foreach (string strOrigine in tableDependances.Keys)
                    {
                        m_strDependancesToOptim[nDep++] = strOrigine;
                    }
                }
                #endregion
            }


            #endregion

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


            CFiltreData filtreDeBase = null;
            if (list is CListeObjetsDonnees)
            {
                filtreDeBase = ((CListeObjetsDonnees)list).Filtre;
            }

            ArrayList listeIds      = new ArrayList();
            string    strColonneCle = table.PrimaryKey[0].ColumnName;

            indicateur.SetBornesSegment(0, nValeursCle.Length);
            indicateur.SetValue(0);

            //Lecture par paquets de 1000 clés
            for (int n = 0; n < nValeursCle.Length; n += c_nNbLectureParLotFils)
            {
                if (bAvecOptimisation && (list is CListeObjetsDonnees) && relationToObjetParent != null)
                {
                    CListeObjetsDonnees listeObjets = (CListeObjetsDonnees)list;
                    StringBuilder       blCles      = new StringBuilder();
                    char cSepIn = ',';
                    if (filtreDeBase is CFiltreDataAvance)
                    {
                        cSepIn = ';';
                    }
                    for (int nCle = n; nCle < Math.Min(n + c_nNbLectureParLotFils, nValeursCle.Length); nCle++)
                    {
                        blCles.Append(nValeursCle[nCle]);
                        blCles.Append(cSepIn);
                    }
                    if (blCles.Length > 0)
                    {
                        blCles.Remove(blCles.Length - 1, 1);
                        string strCles = blCles.ToString();
                        if (filtreDeBase is CFiltreDataAvance)
                        {
                            listeObjets.Filtre = CFiltreData.GetAndFiltre(
                                filtreDeBase, new CFiltreDataAvance(
                                    listeObjets.NomTable,
                                    relationToObjetParent.ChampsFils[0] + " in {" + strCles + "}"));
                        }
                        else
                        {
                            listeObjets.Filtre = CFiltreData.GetAndFiltre(
                                filtreDeBase,
                                new CFiltreData(
                                    relationToObjetParent.ChampsFils[0] + " in (" + strCles.Replace(';', ',') + ")"));
                        }
                    }
                }
                if (indicateur.CancelRequest)
                {
                    result.EmpileErreur(I.T("Execution cancelled by the user|118"));
                    return(result);
                }
                if (list is CListeObjetsDonnees && m_strDependancesToOptim != null && m_strDependancesToOptim.Length > 0)
                {
                    ((CListeObjetsDonnees)list).ReadDependances(m_strDependancesToOptim);
                }
                int nCountTotal = 1;
                if (list is IList)
                {
                    nCountTotal = ((IList)list).Count;
                }
                else if (list is Array)
                {
                    nCountTotal = ((Array)list).Length;
                }
                indicateur.PushSegment(n, Math.Min(n + c_nNbLectureParLotFils, nValeursCle.Length));

                int nNbElements = 0;
                indicateur.SetBornesSegment(0, nCountTotal);
                int nFrequence = Math.Min(nCountTotal / 20, 500) + 1;

                CSessionClient   session  = CSessionClient.GetSessionUnique();
                IInfoUtilisateur infoUser = session != null?session.GetInfoUtilisateur() : null;


                ///AJOUT DES LIGNES DANS LA TABLE
                foreach (object obj in list)
                {
                    CRestrictionUtilisateurSurType restriction = null;
                    if (infoUser != null && obj != null)
                    {
                        restriction = infoUser.GetRestrictionsSur(obj.GetType(), obj is IObjetAContexteDonnee?((IObjetAContexteDonnee)obj).ContexteDonnee.IdVersionDeTravail:null);
                    }

                    nNbElements++;
                    if (nNbElements % nFrequence == 0)
                    {
                        indicateur.SetValue(nNbElements);
                        if (indicateur.CancelRequest)
                        {
                            result.EmpileErreur(I.T("Execution cancelled by the user|118"));
                            return(result);
                        }
                    }
                    bool bShouldImporte = true;

                    DataRow row = null;

                    if (bUtiliserIdObjets)
                    {
                        row            = table.Rows.Find(((CObjetDonneeAIdNumerique)obj).Id);
                        bShouldImporte = row == null;
                    }
                    if (bShouldImporte)
                    {
                        row = table.NewRow();
                        if (bUtiliserIdObjets)
                        {
                            int nId = ((CObjetDonneeAIdNumerique)obj).Id;
                            row[strColonneCle] = nId;
                            listeIds.Add(nId);
                        }

                        //Ajoute les valeurs de champs propres à cette table
                        result = InsereValeursChamps(obj, row, cacheValeurs, restriction);

                        if (!result)
                        {
                            return(result);
                        }

                        if (colFilleDeContrainte != null && nValeursCle.Length > 0)
                        {
                            DataRow rowFille = row;
                            if (tableFilleDeContrainte == table)
                            {
                                if (relationToObjetParent == null)
                                {
                                    rowFille[colFilleDeContrainte] = nValeursCle[0];
                                }
                                else
                                {
                                    rowFille[colFilleDeContrainte] = ((CObjetDonnee)obj).Row[relationToObjetParent.ChampsFils[0]];
                                }
                            }
                        }
                        table.Rows.Add(row);
                    }
                    //Dans tous les cas, met à jour la table dépendante si besoin est !
                    if (colFilleDeContrainte != null && nValeursCle.Length > 0)
                    {
                        DataRow rowFille = row;
                        if (tableFilleDeContrainte != table)
                        {
                            rowFille = tableFilleDeContrainte.Rows.Find(nValeursCle[0]);
                            rowFille[colFilleDeContrainte] = row[strColonneCle];
                        }
                    }
                    if (bShouldImporte)
                    {
                        //AJout des données des sous tables non optimisées
                        foreach (ITableExport tbl in TablesFilles)
                        {
                            if (tbl.ChampOrigine != null && !tableTablesFillesToDependanceDirecte.Contains(tbl) && tbl != tableFilleANePasCharger)
                            {
                                bool bChildIsOptimisable = IsOptimisable(tbl, TypeSource);
                                //Impossible de lire en direct
                                object objet = null;
                                if (tbl.ChampOrigine is CDefinitionProprieteDynamiqueThis)
                                {
                                    objet = obj;
                                }
                                else
                                {
                                    objet = CInterpreteurProprieteDynamique.GetValue(obj, tbl.ChampOrigine, cacheValeurs).Data;
                                }
                                string strNomCol = (string)tableParentsCharges[tbl];
                                if (strNomCol != null)
                                {
                                    if (objet != null)
                                    {
                                        row[strNomCol] = ((CObjetDonneeAIdNumerique)objet).Id;
                                    }
                                    else
                                    {
                                        row[strNomCol] = DBNull.Value;
                                    }
                                }
                                else
                                {
                                    indicateur.PushSegment(nNbElements, nNbElements + 1);
                                    if (objet != null)
                                    {
                                        IEnumerable tempList;
                                        if (objet is IEnumerable)
                                        {
                                            tempList = (IEnumerable)objet;
                                        }
                                        else
                                        {
                                            ArrayList listeObjetUnique = new ArrayList();
                                            listeObjetUnique.Add(objet);
                                            tempList = listeObjetUnique;
                                        }
                                        if (tempList != null)
                                        {
                                            result = tbl.InsertDataInDataSet(
                                                tempList,
                                                ds,
                                                this,
                                                (int)row[table.PrimaryKey[0]],
                                                elementAVariablePourFiltres,
                                                cacheValeurs,
                                                this,
                                                bChildIsOptimisable,
                                                indicateur);
                                            if (!result)
                                            {
                                                return(result);
                                            }
                                        }
                                    }
                                    indicateur.PopSegment();
                                }
                            }
                        }
                        //vide le cache après chaque objet de la table principale
                        if (tableParente == null)
                        {
                            cacheValeurs.ResetCache();
                        }
                    }
                }
                indicateur.PopSegment();
            }
            indicateur.SetValue(nValeursCle.Length);

            ///Chargement des relations optimisées
            int nTable = 0;
            foreach (DictionaryEntry entry in tableTablesFillesToDependanceDirecte)
            {
                nTable++;
                ITableExport tableFille = (ITableExport)entry.Key;
                if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueDonneeCumulee)
                {
                    CDefinitionProprieteDynamiqueDonneeCumulee defCum = (CDefinitionProprieteDynamiqueDonneeCumulee)tableFille.ChampOrigine;
                    //Trouve les données cumulées correspondants aux éléments
                    CListeObjetsDonnees listeInit  = (CListeObjetsDonnees)list;
                    CTypeDonneeCumulee  typeCumule = new CTypeDonneeCumulee(listeInit.ContexteDonnee);
                    if (!typeCumule.ReadIfExists(
                            defCum.DbKeyTypeDonnee))
                    {
                        result.EmpileErreur(I.T("The cumulated data type @1 doesn't exist|122", defCum.DbKeyTypeDonnee.ToString()));
                        return(result);
                    }
                    RelationAttribute attr = typeCumule.GetRelationAttributeToType(listeInit.TypeObjets);
                    string            strChampIdOuDbKey = "";
                    if (defCum.DbKeyTypeDonnee.IsNumericalId())
                    {
                        strChampIdOuDbKey = CTypeDonneeCumulee.c_champId;
                    }
                    else
                    {
                        strChampIdOuDbKey = CObjetDonnee.c_champIdUniversel;
                    }

                    CListeObjetsDonnees listeFils = new CListeObjetsDonnees(
                        listeInit.ContexteDonnee,
                        typeof(CDonneeCumulee),
                        new CFiltreData(strChampIdOuDbKey + " = @1 ", defCum.DbKeyTypeDonnee.GetValeurInDb()));


                    listeFils.ModeSansTri = true;                    //Optimisation pour ne pas utiliser de dataview
                    result = tableFille.InsertDataInDataSet(
                        listeFils,
                        ds,
                        this,
                        (int[])listeIds.ToArray(typeof(int)),
                        attr,
                        elementAVariablePourFiltres,
                        cacheValeurs,
                        this,
                        true,
                        indicateur);
                    if (!result)
                    {
                        return(result);
                    }
                }
                else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueRelationTypeId)
                {
                    CDefinitionProprieteDynamiqueRelationTypeId defTypeId = (CDefinitionProprieteDynamiqueRelationTypeId)tableFille.ChampOrigine;
                    RelationTypeIdAttribute relTpIdAttr = defTypeId.Relation;

                    //Trouve les données cumulées correspondants aux éléments
                    CListeObjetsDonnees listeInit = (CListeObjetsDonnees)list;
                    if (listeInit.Count != 0)
                    {
                        CListeObjetsDonnees listeFils = new CListeObjetsDonnees(
                            listeInit.ContexteDonnee,
                            CContexteDonnee.GetTypeForTable(relTpIdAttr.TableFille),
                            new CFiltreData(relTpIdAttr.ChampType + "=@1", listeInit.TypeObjets.ToString()));
                        listeFils.ModeSansTri = true;                        //Optimisation pour ne pas utiliser de dataview
                        RelationAttribute attrTmp = new RelationAttribute(
                            listeInit.NomTable,
                            ((CObjetDonneeAIdNumerique)listeInit[0]).GetChampId(),
                            relTpIdAttr.ChampId, false, false);
                        result = tableFille.InsertDataInDataSet(
                            listeFils,
                            ds,
                            this,
                            (int[])listeIds.ToArray(typeof(int)),
                            attrTmp,
                            elementAVariablePourFiltres,
                            cacheValeurs,
                            this,
                            true,
                            indicateur);
                        if (!result)
                        {
                            return(result);
                        }
                    }
                }
                else if (tableFille.ChampOrigine is CDefinitionProprieteDynamiqueThis)
                {
                    CListeObjetsDonnees listeInit = new CListeObjetsDonnees(
                        ((CListeObjetsDonnees)list).ContexteDonnee,
                        tableFille.ChampOrigine.TypeDonnee.TypeDotNetNatif, true);
                    listeInit.ModeSansTri = true;                    //Optimisation pour ne pas utiliser de dataview
                    string            strChampId = listeInit.ContexteDonnee.GetTableSafe(CContexteDonnee.GetNomTableForType(listeInit.TypeObjets)).PrimaryKey[0].ColumnName;
                    RelationAttribute attrTmp    = new RelationAttribute(
                        listeInit.NomTable,
                        strChampId,
                        strChampId,
                        false, false);
                    //Copie les clés dans la clé et dans la valeur de champ externe
                    result = tableFille.InsertDataInDataSet(
                        listeInit,
                        ds,
                        this,
                        (int[])listeIds.ToArray(typeof(int)),
                        attrTmp,
                        elementAVariablePourFiltres,
                        cacheValeurs,
                        this,
                        true,
                        indicateur);
                    if (!result)
                    {
                        return(result);
                    }
                }
                else if (tableFille.ChampOrigine != null)
                {
                    RelationAttribute   attr      = (RelationAttribute)entry.Value;
                    CListeObjetsDonnees listeFils = new CListeObjetsDonnees(
                        ((CListeObjetsDonnees)list).ContexteDonnee,
                        tableFille.ChampOrigine.TypeDonnee.TypeDotNetNatif, true);
                    listeFils.ModeSansTri = true;                    //Optimisation pour ne pas utiliser de dataview
                    result = tableFille.InsertDataInDataSet(
                        listeFils,
                        ds,
                        this,
                        (int[])listeIds.ToArray(typeof(int)),
                        attr,
                        elementAVariablePourFiltres,
                        cacheValeurs,
                        this,
                        true,
                        indicateur);
                    if (!result)
                    {
                        return(result);
                    }
                }
                else
                {
                    result = tableFille.InsertDataInDataSet(
                        null,
                        ds,
                        this,
                        (int[])listeIds.ToArray(typeof(int)),
                        null,
                        elementAVariablePourFiltres,
                        cacheValeurs,
                        this,
                        true,
                        indicateur);
                    if (!result)
                    {
                        return(result);
                    }
                }
            }

            return(result);
        }
示例#15
0
 //-------------------------------------------------------------
 public bool IsOptimisable(ITableExport table, Type typeDeMesElements)
 {
     return(false);
 }
示例#16
0
 /// //////////////////////////////////////////////////////////////
 public void AddTableFille(ITableExport table)
 {
 }
示例#17
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);
        }
示例#18
0
        //----------------------------------------------------------------------------------
        public CResultAErreur Serialize(C2iSerializer serializer)
        {
            int            nVersion = GetNumVersion();
            CResultAErreur result   = serializer.TraiteVersion(ref nVersion);

            if (!result)
            {
                return(result);
            }
            serializer.TraiteType(ref m_typeSource);


            if (serializer.Mode == ModeSerialisation.Ecriture && !m_bIsStructureComplexe)
            {
                RenommeNomTablesSimples();
            }

            I2iSerializable obj = m_table;

            result = serializer.TraiteObject(ref obj);
            if (!result)
            {
                return(result);
            }
            m_table = (ITableExport)obj;
            if (m_table != null)
            {
                m_table.TypeSource = TypeSource;
            }

            if (nVersion > 0)
            {
                serializer.TraiteBool(ref m_bIsStructureComplexe);
            }
            else
            {
                m_bIsStructureComplexe = true;
            }

            if (nVersion > 1)
            {
                serializer.TraiteBool(ref m_bTraitementSurServeur);
            }
            else
            {
                m_bTraitementSurServeur = true;
            }

            if (nVersion > 2)
            {
                result = serializer.TraiteArrayListOf2iSerializable(m_listeTablesAutonomes);
            }

            if (nVersion < 4 && serializer.Mode == ModeSerialisation.Lecture)
            {
                RenommeNomTablesSimples();
            }


            return(result);
        }
示例#19
0
 //----------------------------------------------------------------------------------
 public C2iStructureExport()
 {
     m_table = new C2iTableExport();
 }
示例#20
0
 /// /////////////////////////////////////////////////////////
 public void RemoveTableFille(ITableExport table)
 {
     m_listeTables.Remove(table);
 }
示例#21
0
        //----------------------------------------------------------------------------------
        public CResultAErreur CreateTableComplexeInDataset(bool bAvecOptim, Type typeSource, ITableExport tableExport, DataSet ds, DataColumn colParente)
        {
            CResultAErreur result = CResultAErreur.True;

            if (ds.Tables.Contains(tableExport.NomTable))
            {
                return(result);
            }

            DataTable table = new DataTable(tableExport.NomTable);

            DataColumn colKey = CreateChampInTableAIdAuto(table, 1);

            tableExport.InsertColonnesInTable(table);

            ds.Tables.Add(table);


            foreach (ITableExport tbl in tableExport.TablesFilles)
            {
                bool bAvecOptimForTable = bAvecOptim && tableExport.IsOptimisable(tbl, typeSource);
                if (tbl.ChampOrigine != null)
                {
                    result = CreateTableComplexeInDataset(bAvecOptimForTable, tbl.ChampOrigine.TypeDonnee.TypeDotNetNatif, tbl, ds, colKey);
                }
                else
                {
                    result = CreateTableComplexeInDataset(bAvecOptimForTable, null, tbl, ds, colKey);
                }

                if (!result)
                {
                    return(result);
                }
                //Gestion des relations filles et relations parentes
                if (tbl.ChampOrigine != null && (tbl.ChampOrigine.TypeDonnee.IsArrayOfTypeNatif || !bAvecOptimForTable ||
                                                 tbl.ChampOrigine is CDefinitionProprieteDynamiqueThis))
                {
                    CreateForeignKeyInTable(table.PrimaryKey[0], ds.Tables[tbl.NomTable], 1);
                }
                else
                {
                    CreateForeignKeyInTable(ds.Tables[tbl.NomTable].PrimaryKey[0], table, 1);
                }
            }

            return(result);
        }