Example #1
0
        /// ///////////////////////////////////////////////////////////
        public object GetValue(object objetInterroge, string strPropriete)
        {
            CFournisseurPropDynStd fournisseur = new CFournisseurPropDynStd(false);

            if (objetInterroge == null)
            {
                return(null);
            }
            //Est-ce une propriété simple ?(majorité des cas )
            object     objetAInterroger = null;
            MemberInfo membre           = null;

            if (CInterpreteurTextePropriete.GetObjetFinalEtMemberInfo(objetInterroge, strPropriete, ref objetAInterroger, ref membre) && membre != null)
            {
                return(CInterpreteurTextePropriete.GetValue(objetAInterroger, membre));
            }

            //Bon pas de bol, c'est autre chose, il faut donc chercher ce que c'est
            Type   tp           = objetInterroge.GetType();
            string strPropDebut = strPropriete.Split('.')[0];
            object objetPremier = CInterpreteurTextePropriete.GetValue(objetInterroge, strPropDebut);

            if (objetPremier == null)
            {
                string strIdChamp = CDefinitionProprieteDynamiqueChampCustom.GetIdPropriete(strPropDebut);
                foreach (CDefinitionProprieteDynamique def in fournisseur.GetDefinitionsChamps(tp, 0))
                {
                    if (def.NomPropriete == strPropDebut ||
                        (strIdChamp != "" && def is CDefinitionProprieteDynamiqueChampCustom) &&
                        ((CDefinitionProprieteDynamiqueChampCustom)def).DbKeyChamp == CDbKey.CreateFromStringValue(strIdChamp))
                    {
                        objetPremier = GetValue(objetInterroge, def);
                        //Si la suite est une relation de la valeur champ vers l'objet, il ne faut pas
                        //traier la suite
                        if (strPropDebut != strPropriete)
                        {
                            string strSuiteTmp = strPropriete.Substring(strPropDebut.Length + 1);
                            if (CInfoRelationComposantFiltreChampToEntite.IsRelationFromChampToEntite(strSuiteTmp))
                            {
                                //On a déjà traité ce lien par GetValeurPropriété (qui retourne la valeur
                                //et nom pas le lien vers la valeur)
                                strPropDebut += "." + strPropriete.Split('.')[1];
                            }
                        }

                        break;
                    }
                }
            }
            if (objetPremier == null)
            {
                return(null);
            }
            if (strPropDebut == strPropriete)
            {
                return(objetPremier);
            }
            string strSuite = strPropriete.Substring(strPropDebut.Length + 1);

            return(GetValue(objetPremier, strSuite));
        }
Example #2
0
        /// ////////////////////////////////////////////////////////
        protected override CResultAErreur MyExecute(CContexteExecutionAction contexte)
        {
            CResultAErreur result         = CResultAErreur.True;
            object         elementToModif = Process.GetValeurChamp(VariableAModifier.IdVariable);

            if (elementToModif is CObjetDonnee)
            {
                elementToModif = ((CObjetDonnee)elementToModif).GetObjetInContexte(contexte.ContexteDonnee);
            }
            if (elementToModif == null)
            {
                return(result);
            }

            object nouvelleValeur = null;

            if (!(ExpressionValeur is C2iExpressionNull))
            {
                //Calcule la nouvelle valeur
                CContexteEvaluationExpression contexteEval = new CContexteEvaluationExpression(Process);
                contexteEval.AttacheObjet(typeof(CContexteDonnee), contexte.ContexteDonnee);
                result = ExpressionValeur.Eval(contexteEval);
                if (!result)
                {
                    result.EmpileErreur(I.T("Error during @1 formula evaluation|216", ExpressionValeur.ToString()));
                    return(result);
                }
                nouvelleValeur = result.Data;
            }

            if (m_definitionPropriete.NomPropriete.Length > 1 &&
                m_definitionPropriete.NomPropriete[0] == CDefinitionProprieteDynamique.c_strCaractereStartCleType)
            {
                result = CInterpreteurProprieteDynamique.SetValue(elementToModif, m_definitionPropriete, nouvelleValeur);
            }
            else
            {
                //Ancienne méthode


                //Si modif de champ custom
                if (m_definitionPropriete is CDefinitionProprieteDynamiqueChampCustom)
                {
                    if (!(elementToModif is IElementAChamps))
                    {
                        result.EmpileErreur(I.T("@1 : Incorrect custom field or invalid target|217", m_definitionPropriete.Nom));
                        return(result);
                    }
                    result = ((IElementAChamps)elementToModif).SetValeurChamp(((CDefinitionProprieteDynamiqueChampCustom)m_definitionPropriete).DbKeyChamp.StringValue, nouvelleValeur);
                    return(result);
                }

                //récupère les éléments à modifier
                string[]  strProps             = m_definitionPropriete.NomPropriete.Split('.');
                ArrayList lstElementsAModifier = new ArrayList();
                lstElementsAModifier.Add(elementToModif);
                for (int nProp = 0; nProp < strProps.Length - 1; nProp++)
                {
                    string strProp = strProps[nProp];
                    string strTmp  = "";
                    CDefinitionProprieteDynamique.DecomposeNomProprieteUnique(strProp, ref strTmp, ref strProp);
                    ArrayList newListe = new ArrayList();
                    foreach (object objet in lstElementsAModifier)
                    {
                        object newToModif = CInterpreteurTextePropriete.GetValue(objet, strProp);
                        if (newToModif != null)
                        {
                            newListe.Add(newToModif);
                        }
                    }
                    lstElementsAModifier = newListe;
                }
                string     strLastProp    = strProps[strProps.Length - 1];
                MethodInfo fonctionFinale = null;


                //Modifie la valeur
                foreach (object obj in lstElementsAModifier)
                {
                    try
                    {
                        if (fonctionFinale == null)
                        {
                            object     dummy  = null;
                            MemberInfo membre = null;
                            string     strTmp = "";
                            CDefinitionProprieteDynamique.DecomposeNomProprieteUnique(strLastProp, ref strTmp, ref strLastProp);
                            CInterpreteurTextePropriete.GetObjetFinalEtMemberInfo(obj, strLastProp, ref dummy, ref membre);
                            if (membre == null || !(membre is PropertyInfo))
                            {
                                result.EmpileErreur(I.T("The @1 property cannot be find|218", strLastProp));
                                return(result);
                            }
                            fonctionFinale = ((PropertyInfo)membre).GetSetMethod(true);
                            if (fonctionFinale == null)
                            {
                                result.EmpileErreur(I.T("The @1 property is in reading only|219", strLastProp));
                                return(result);
                            }
                        }
                        fonctionFinale.Invoke(obj, new object[] { nouvelleValeur });
                    }
                    catch (Exception e)
                    {
                        result.EmpileErreur(new CErreurException(e));
                        return(result);
                    }
                }
            }
            return(result);
        }