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