Пример #1
0
        //----------------------------------------------------------------------------------
        public CResultAErreur CreateTableSimpleInDataset(C2iTableExport tableExport, CContexteDonnee contexteDest, Type typeParent)
        {
            CResultAErreur result   = CResultAErreur.True;
            PropertyInfo   property = typeParent.GetProperty(tableExport.ChampOrigine.NomProprieteSansCleTypeChamp);

            if (property == null)
            {
                result.EmpileErreur(I.T("The property @1 was not found in the @2 type|105", tableExport.ChampOrigine.NomPropriete, typeParent.ToString()));
                return(result);
            }
            Object[]  attribs          = property.GetCustomAttributes(typeof(RelationAttribute), true);
            Type      typeObjet        = null;
            DataTable tableDestination = null;

            if (attribs.Length != 0)
            {
                RelationAttribute relParente = (RelationAttribute)attribs[0];
                tableDestination = contexteDest.GetTableSafe(relParente.TableMere);
                typeObjet        = CContexteDonnee.GetTypeForTable(relParente.TableMere);
            }
            else
            {
                attribs = property.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                if (attribs.Length != 0)
                {
                    RelationFilleAttribute relFille = (RelationFilleAttribute)attribs[0];
                    tableDestination = contexteDest.GetTableSafe(CContexteDonnee.GetNomTableForType(relFille.TypeFille));
                    typeObjet        = relFille.TypeFille;
                }
                else
                {
                    result.EmpileErreur(I.T("The property @1 cannot be integrated into a simple export|106", tableExport.ChampOrigine.NomPropriete));
                    return(result);
                }
            }



            foreach (C2iChampExport champ in tableExport.Champs)
            //Crée les colonnes calculées
            {
                result = CreateChampInTable(champ, tableDestination);
                if (!result)
                {
                    result.EmpileErreur(I.T("Error during field @1 creation|104", champ.NomChamp));
                    return(result);
                }
            }
            foreach (C2iTableExport tableFille in tableExport.TablesFilles)
            {
                result &= CreateTableSimpleInDataset(tableFille, contexteDest, typeObjet);
                if (!result)
                {
                    return(result);
                }
            }
            return(result);
        }
Пример #2
0
        //---------------------------------------------------------------
        private bool IsChampCompatibleImport(Type typeObjet, CDefinitionProprieteDynamique def)
        {
            if (def is CDefinitionProprieteDynamiqueChampCustom)
            {
                return(true);
            }
            if (def is CDefinitionProprieteDynamiqueDotNet)
            {
                PropertyInfo info = typeObjet.GetProperty(def.NomProprieteSansCleTypeChamp);
                if (info != null)
                {
                    TableFieldPropertyAttribute attField = info.GetCustomAttribute <TableFieldPropertyAttribute>(true);
                    if (attField != null && attField.IsInDb)
                    {
                        return(true);
                    }

                    RelationAttribute attRel = info.GetCustomAttribute <RelationAttribute>(true);
                    if (attRel != null)
                    {
                        return(true);
                    }
                    RelationFilleAttribute attFille = info.GetCustomAttribute <RelationFilleAttribute>(true);
                    if (attFille != null)
                    {
                        return(true);
                    }
                }
            }
            if (def is CDefinitionProprieteDynamiqueRelationTypeId)
            {
                return(true);
            }
            if (def is CDefinitionProprieteDynamiqueRelationTypeIdToParent)
            {
                return(true);
            }
            if (def is CDefinitionProprieteDynamiqueChampCustomFils)
            {
                return(true);
            }
            return(false);
        }
Пример #3
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);
 }
Пример #4
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);
        }
Пример #5
0
        /// //////////////////////////////////////////
        protected CResultAErreur GetFiltre(
            CContexteEvaluationExpression ctx,
            C2iExpression expressionAcces,
            C2iExpression expressionFiltre,
            params C2iExpression[] parametresFiltre)
        {
            CResultAErreur result = CResultAErreur.True;
            //Commence par créer le filtre qui permet d'accéder au type accedé (basé sur le premier paramètre

            /*Pour créer ce filtre, il faut remonter à l'envers depuis le type retourné
             * vers le type source de l'expression.
             * PAr exemple Classement.Lignes depuis lotproduit doit être inversé pour
             * indiquer le lot de produit du classement des lignes
             * (classement.LotProduitOrigine)
             *
             * */
            string        strFiltreToType = "";
            C2iExpression parametre       = expressionAcces;

            ArrayList lstPropsAccedees = new ArrayList();

            /*if (!(ctx.ObjetSource is CObjetDonnee ))
             * {
             *      result.EmpileErreur("La fonction SelectSql ne peut pas être appliquée ici ");
             *      return result;
             * }*/


            Type tp = ctx.ObjetSource.GetType();

            CObjetDonnee objetRacine = (CObjetDonnee)ctx.ObjetSource;


            while (parametre != null)
            {
                string strTable = CContexteDonnee.GetNomTableForType(tp);
                if (strTable == null)
                {
                    result.EmpileErreur(I.T("The SelectSql function cannot be applied on an element @1|210", DynamicClassAttribute.GetNomConvivial(tp)));
                    return(result);
                }
                C2iExpressionChamp champ;
                if (parametre is C2iExpressionChamp)
                {
                    champ = (C2iExpressionChamp)parametre;
                }
                else if (parametre is C2iExpressionObjet && parametre.Parametres2i[0] is C2iExpressionChamp)
                {
                    champ = (C2iExpressionChamp)parametre.Parametres2i[0];
                }
                else
                {
                    result.EmpileErreur(I.T("Error in the SelectSql parameter|211"));
                    return(result);
                }
                CDefinitionProprieteDynamique def = champ.DefinitionPropriete;
                PropertyInfo info = tp.GetProperty(def.NomProprieteSansCleTypeChamp);
                if (info == null)
                {
                    result.EmpileErreur(I.T("The property @1 is not valid for SelectSql(*)|212", def.NomPropriete));
                    return(result);
                }
                //Il faut trouver la propriété de l'élément accedé utilisée pour atteindre le type précédent
                Type tpAccede = null;
                //Si la propriété a l'attribut relation fille, on va trouver l'info
                object[] attribs = info.GetCustomAttributes(typeof(RelationFilleAttribute), true);
                if (attribs.Length != 0)
                {
                    RelationFilleAttribute attr = (RelationFilleAttribute)attribs[0];
                    strFiltreToType = attr.ProprieteFille + "." + strFiltreToType;
                    tpAccede        = attr.TypeFille;
                    strTable        = CContexteDonnee.GetNomTableForType(tpAccede);
                }
                else
                {
                    //Pas une relation fille, est-ce une relation parente ?
                    attribs = info.GetCustomAttributes(typeof(RelationAttribute), true);
                    if (attribs.Length != 0)
                    {
                        if (objetRacine.IsNew())
                        {
                            //L'objet racine est un nouvel objet, il n'est donc pas dans la base,
                            //Donc la requête ne retournera rien !!!. Il faut donc utiliser
                            //le prochain élément comme objetRacine
                            objetRacine = (CObjetDonnee)info.GetGetMethod().Invoke(objetRacine, new object[0]);
                            if (objetRacine != null)
                            {
                                tpAccede = objetRacine.GetType();
                            }
                        }
                        else
                        {
                            RelationAttribute attr = (RelationAttribute)attribs[0];
                            strFiltreToType = attr.GetInfoRelation(strTable).RelationKey + "." + strFiltreToType;
                            tpAccede        = info.PropertyType;
                            strTable        = CContexteDonnee.GetNomTableForType(tpAccede);
                        }
                    }
                    else
                    {
                        // on est mal, impossible de savoir à quoi on fait référence !
                        result.EmpileErreur(I.T("The property @1 is not valid for a SelectSql operation|213", def.NomPropriete));
                        return(result);
                    }
                }
                tp = tpAccede;
                if (parametre is C2iExpressionObjet)
                {
                    parametre = parametre.Parametres2i[1];
                }
                else
                {
                    parametre = null;
                }
            }

            //Crée le filtre
            CObjetDonnee      objetSource = objetRacine;
            CFiltreDataAvance filtre      = new CFiltreDataAvance(CContexteDonnee.GetNomTableForType(tp), "");
            int nCle = 1;

            foreach (string strCle in objetSource.GetChampsId())
            {
                filtre.Filtre += strFiltreToType + strCle + "=@" + nCle.ToString();
                nCle++;
                filtre.Parametres.Add(objetSource.Row[strCle]);
            }

            //Voila, on n'a plus qu'à combiner avec le filtre demandé
            //evaluation du paramètre 1
            result = expressionFiltre.Eval(ctx);
            if (!result)
            {
                result.EmpileErreur(I.T("Error in SelectSql filter|214"));
                return(result);
            }
            if (result.Data.ToString().Trim() != "")
            {
                CFiltreDataAvance filtre2 = new CFiltreDataAvance(CContexteDonnee.GetNomTableForType(tp), result.Data.ToString());
                //L'analyseur de filtre ne comprend pas la syntaxe [CHAMP].[Champ], mais comprend
                //[Champ.Champ], il faut donc remplacer tous les ].[ par des .
                filtre2.Filtre = filtre2.Filtre.Replace("].[", ".");
                foreach (C2iExpression expression in parametresFiltre)
                {
                    result = expression.Eval(ctx);
                    if (!result)
                    {
                        return(result);
                    }
                    filtre2.Parametres.Add(result.Data);
                }
                try
                {
                    filtre = (CFiltreDataAvance)CFiltreData.GetAndFiltre(filtre, filtre2);
                }
                catch (Exception e)
                {
                    result.EmpileErreur(new CErreurException(e));
                    result.EmpileErreur(I.T("Error during the creation of a SelectSql filter|215"));
                    return(result);
                }
            }
            result.Data = filtre;
            return(result);
        }