public void AddProprietesAccedees(
            CArbreDefinitionsDynamiques arbre,
            Type typeSource,
            string strPropriete)
        {
            //TESTDBKEYOK
            CDbKey key = CDbKey.CreateFromStringValue(strPropriete);

            /*int nIdChamp = -1;
             *          try
             *          {
             *                  nIdChamp = Int32.Parse ( strPropriete );
             *          }
             *          catch
             *          {
             *          }*/
            CChampCalcule champCalcule = new CChampCalcule(CContexteDonneeSysteme.GetInstance());
            C2iExpression formule      = null;

            if (champCalcule.ReadIfExists(key))
            {
                formule = champCalcule.Formule;
                formule.GetArbreProprietesAccedees(arbre);
                CDefinitionProprieteDynamiqueChampCalcule.DetailleSousArbres(arbre, CContexteDonneeSysteme.GetInstance());
            }
        }
 /// //////////////////////////////////////////////////////
 public CDefinitionProprieteDynamiqueChampCalcule(CChampCalcule champ)
     : base(champ.Nom.Replace(" ", "_"), champ.DbKey.StringValue,
            champ.Formule.TypeDonnee, false, true)
 {
     //TESTDBKEYOK
     m_dbKeyChamp = champ.DbKey;
     Rubrique     = champ.Categorie;
 }
        /// ////////////////////////////////////////
        ///Si l'arbre est basé sur un champ calculé, détaille les
        ///champs utilisés dans la formule
        public static void DetailleSousArbres(
            CArbreDefinitionsDynamiques arbre,
            CContexteDonnee contexteDonnee,
            Dictionary <CDefinitionProprieteDynamique, int> dicCountProfondeurParChamp)
        {
            //TESTDBKEYOK
            if (dicCountProfondeurParChamp == null)
            {
                dicCountProfondeurParChamp = new Dictionary <CDefinitionProprieteDynamique, int>();
            }
            ArrayList lstSousArbres = new ArrayList(arbre.SousArbres);

            foreach (CArbreDefinitionsDynamiques sousArbre in lstSousArbres)
            {
                if (sousArbre.DefinitionPropriete is CDefinitionProprieteDynamiqueChampCalcule)
                {
                    int nProfondeur = 0;
                    dicCountProfondeurParChamp.TryGetValue(sousArbre.DefinitionPropriete, out nProfondeur);
                    if (nProfondeur < 10)//En cas d'appel récursif, limite à 10 appels
                    {
                        CChampCalcule champCalc = new CChampCalcule(contexteDonnee);
                        if (champCalc.ReadIfExists(((CDefinitionProprieteDynamiqueChampCalcule)sousArbre.DefinitionPropriete).DbKeyChamp))
                        {
                            C2iExpression formule = champCalc.Formule;
                            if (formule != null)
                            {
                                CArbreDefinitionsDynamiques arbreDeFormule = new CArbreDefinitionsDynamiques(null);
                                formule.GetArbreProprietesAccedees(arbreDeFormule);
                                nProfondeur++;
                                dicCountProfondeurParChamp[sousArbre.DefinitionPropriete] = nProfondeur;
                                DetailleSousArbres(arbreDeFormule, contexteDonnee, dicCountProfondeurParChamp);
                                nProfondeur--;
                                dicCountProfondeurParChamp[sousArbre.DefinitionPropriete]--;
                                arbre.RemoveSousArbre(sousArbre);
                                foreach (CArbreDefinitionsDynamiques arbreTmp in arbreDeFormule.SousArbres)
                                {
                                    arbre.AddSousArbre(arbreTmp);
                                }
                            }
                        }
                    }
                }
                else
                {
                    DetailleSousArbres(sousArbre, contexteDonnee, dicCountProfondeurParChamp);
                }
            }
        }
        public IOptimiseurGetValueDynamic GetOptimiseur(Type tp, string strPropriete)
        {
            //TESTDBKEYOK
            CDbKey key = CDbKey.CreateFromStringValue(strPropriete);

            /*int nIdChamp = -1;
             * try
             * {
             *      nIdChamp = Int32.Parse ( strPropriete );
             * }
             * catch
             * {
             * }*/
            CChampCalcule champCalcule = new CChampCalcule(CContexteDonneeSysteme.GetInstance());
            C2iExpression formule      = null;

            if (champCalcule.ReadIfExists(key))
            {
                formule = champCalcule.Formule;
            }
            return(new CInterpreteurProprieteDynamiqueFormule.COptimiseurProprieteDynamiqueFormule(formule));
        }
        //------------------------------------------------------------
        public CResultAErreur GetValue(object objet, string strPropriete)
        {
            CResultAErreur result      = CResultAErreur.True;
            CObjetDonnee   objetDonnee = objet as CObjetDonnee;

            if (objetDonnee == null)
            {
                result.Data = null;
                return(result);
            }
            //TESTDBKEYOK
            CDbKey          key          = CDbKey.CreateFromStringValue(strPropriete);
            CContexteDonnee contexte     = objetDonnee.ContexteDonnee;
            CChampCalcule   champCalcule = new CChampCalcule(contexte);

            if (!champCalcule.ReadIfExists(key))
            {
                result.EmpileErreur(I.T("Calculated field @1 doesn't exists|200023", strPropriete));
                return(result);
            }
            CContexteEvaluationExpression ctx = new CContexteEvaluationExpression(objet);

            return(champCalcule.Formule.Eval(ctx));
        }
Exemplo n.º 6
0
        /// ///////////////////////////////////////////////////////////
        public object GetValue(object objetInterroge, CDefinitionProprieteDynamique propriete)
        {
            //Récupère l'objet à interroger
            string strProp = propriete.NomPropriete;
            object valeur  = m_cache.GetValeurCache(objetInterroge, strProp);

            if (valeur != null)
            {
                return(valeur);
            }

            CContexteDonnee contexteForObjets = ContexteDonneeCache;

            if (objetInterroge is IObjetAContexteDonnee)
            {
                contexteForObjets = ((IObjetAContexteDonnee)objetInterroge).ContexteDonnee;
            }
            if (contexteForObjets == null)
            {
                contexteForObjets = ContexteDonneeCache;
            }


            object objetFinal = objetInterroge;
            int    nPos       = strProp.LastIndexOf('.');

            if (nPos > 0 && !(propriete is CDefinitionProprieteDynamiqueDonneeCumulee) &&
                !(propriete is CDefinitionProprieteDynamiqueChampCustom) &&
                !(propriete is CDefinitionProprieteDynamiqueChampCustomFils) &&
                !(propriete is CDefinitionProprieteDynamiqueFormule))
            {
                string strPropDebut;
                strPropDebut = strProp.Substring(0, nPos);
                strProp      = strProp.Substring(nPos + 1);
                objetFinal   = m_cache.GetValeurCache(objetInterroge, strPropDebut);
                if (objetFinal == null)
                {
                    objetFinal = GetValue(objetInterroge, strPropDebut);

                    /*object objetAInterroger = null;
                     * MemberInfo membre = null;
                     * CInterpreteurTexteProptVariete.GetObjetFinalEtMemberInfo ( objetInterroge, strPropDebut, ref objetAInterroger, ref membre );
                     * if ( membre != null )
                     * {
                     *      objetFinal = CInterpreteurTextePropriete.GetValue ( objetAInterroger, membre );
                     * }
                     * else
                     * {
                     *      //On n'a pas trouvé le membre, il s'agit donc d'autre chose, il faut donc décomposer
                     *      //Le champ
                     * }*/
                    //objetFinal = CInterpreteurTextePropriete.GetValue(objetInterroge, strPropDebut);
                    m_cache.StockeValeurEnCache(objetInterroge, strPropDebut, objetFinal);
                }
                if (objetFinal == null)
                {
                    return(null);
                }
                valeur = m_cache.GetValeurCache(objetFinal, strProp);
                if (valeur != null)
                {
                    return(valeur);
                }
            }


            if (propriete is CDefinitionProprieteDynamiqueChampCustom)
            {
                if (!(objetFinal is IElementAChamps))
                {
                    valeur = null;
                }

                else
                {
                    //TESTDBKEYTODO qui ne peut pas marche
                    valeur = ((IElementAChamps)objetFinal).GetValeurChamp(((CDefinitionProprieteDynamiqueChampCustom)propriete).DbKeyChamp.InternalIdNumeriqueANeJamaisUtiliserSaufDansCDbKeyAddOn.Value, System.Data.DataRowVersion.Default);

                    /*if (m_bValeurAfficheeDeChampsCustom)
                     * {
                     *      CChampCustom champ = new CChampCustom(ContexteDonneeCache);
                     *      if (champ.ReadIfExists(((CDefinitionProprieteDynamiqueChampCustom)propriete).IdChamp))
                     *      {
                     *              object valTmp = champ.DisplayFromValue(valeur);
                     *              if (valTmp != null)
                     *                      valeur = valTmp;
                     *      }
                     * }*/
                }
            }
            else if (propriete is CDefinitionProprieteDynamiqueChampCustomFils && objetInterroge is CObjetDonneeAIdNumerique)
            {
                CChampCustom champ = new CChampCustom(ContexteDonneeCache);
                if (champ.ReadIfExists(((CDefinitionProprieteDynamiqueChampCustomFils)propriete).KeyChamp))
                {
                    Type tp = champ.Role.TypeAssocie;

                    try
                    {
                        IObjetDonneeAChamps elt = (IObjetDonneeAChamps)Activator.CreateInstance(tp, new object[] { contexteForObjets });
                        CRelationElementAChamp_ChampCustom rel = elt.GetNewRelationToChamp();
                        CListeObjetsDonnees liste = new CListeObjetsDonnees(contexteForObjets, tp);
                        liste.Filtre = new CFiltreDataAvance(
                            elt.GetNomTable(),
                            rel.GetNomTable() + "." +
                            CRelationElementAChamp_ChampCustom.c_champValeurString + "=@1 and " +
                            rel.GetNomTable() + "." +
                            CRelationElementAChamp_ChampCustom.c_champValeurInt + "=@2 and " +
                            rel.GetNomTable() + "." +
                            CChampCustom.c_champId + "=@3",
                            objetInterroge.GetType().ToString(),
                            ((CObjetDonneeAIdNumerique)objetInterroge).Id,
                            champ.Id);
                        valeur = liste.ToArray(tp);
                    }
                    catch
                    {
                        valeur = null;
                    }
                }
            }
            else if (propriete is CDefinitionProprieteDynamiqueListeEntites)
            {
                CListeEntites liste = new CListeEntites(contexteForObjets);
                try
                {
                    if (liste.ReadIfExists(((CDefinitionProprieteDynamiqueListeEntites)propriete).DbKeyListeEntite))
                    {
                        CListeObjetsDonnees resultListe = liste.GetElementsLiesFor(objetInterroge);
                        if (resultListe != null)
                        {
                            valeur = resultListe.ToArray(liste.TypeElements);
                        }
                    }
                }
                catch
                {
                    valeur = null;
                }
            }


            else if (propriete is CDefinitionProprieteDynamiqueRelationTypeId)
            {
                if (!(objetFinal is CObjetDonneeAIdNumerique))
                {
                    valeur = null;
                }
                else
                {
                    CDefinitionProprieteDynamiqueRelationTypeId defRel = (CDefinitionProprieteDynamiqueRelationTypeId)propriete;
                    return(((CObjetDonneeAIdNumerique)objetFinal).GetDependancesRelationTypeId(
                               defRel.Relation.TableFille,
                               defRel.Relation.ChampType,
                               defRel.Relation.ChampId,
                               false));
                }
            }
            else if (propriete is CDefinitionProprieteDynamiqueDonneeCumulee)
            {
                if (!(objetFinal is CObjetDonneeAIdNumerique))
                {
                    valeur = null;
                }
                else
                {
                    CDefinitionProprieteDynamiqueDonneeCumulee defType = (CDefinitionProprieteDynamiqueDonneeCumulee)propriete;
                    CObjetDonneeAIdNumerique objet = (CObjetDonneeAIdNumerique)objetFinal;
                    CTypeDonneeCumulee       type  = new CTypeDonneeCumulee(contexteForObjets);
                    if (type.ReadIfExists(defType.DbKeyTypeDonnee))
                    {
                        valeur = type.GetDonneesCumuleesForObjet(objet);
                    }
                    else
                    {
                        valeur = null;
                    }
                }
            }
            else if (propriete is CDefinitionProprieteDynamiqueChampCalcule)
            {
                CChampCalcule champ = new CChampCalcule(contexteForObjets);
                if (champ.ReadIfExists(((CDefinitionProprieteDynamiqueChampCalcule)propriete).DbKeyChamp))
                {
                    valeur = champ.Calcule(objetFinal, new CFournisseurPropDynStd(true));
                }
                else
                {
                    valeur = null;
                }
            }
            else if (propriete is CDefinitionProprieteDynamiqueFormule)
            {
                CContexteEvaluationExpression contexte = new CContexteEvaluationExpression(objetInterroge);
                contexte.AttacheObjet(typeof(CContexteDonnee), contexteForObjets);
                CResultAErreur result = ((CDefinitionProprieteDynamiqueFormule)propriete).Formule.Eval(contexte);
                if (result)
                {
                    return(result.Data);
                }
            }
            else if (propriete is CDefinitionProprieteDynamiqueVariableDynamique && objetFinal is IElementAVariables)
            {
                valeur = ((IElementAVariables)objetFinal).GetValeurChamp(((CDefinitionProprieteDynamiqueVariableDynamique)propriete).IdChamp);
            }
            else
            {
                valeur = CInterpreteurTextePropriete.GetValue(objetFinal, strProp);
            }
            m_cache.StockeValeurEnCache(objetInterroge, propriete.Nom, valeur);
            if (objetFinal != objetInterroge)
            {
                m_cache.StockeValeurEnCache(objetFinal, strProp, valeur);
            }
            return(valeur);
        }