public object GetValue(object objet) { if (m_formule == null) { return(null); } if (m_contexteEval == null) { m_contexteEval = new CContexteEvaluationExpression(objet); m_contexteEval.UseOptimiseurs = true; } else { m_contexteEval.ChangeSource(objet); } if (objet is CObjetDonnee) { m_contexteEval.AttacheObjet(typeof(CContexteDonnee), ((CObjetDonnee)objet).ContexteDonnee); } CResultAErreur result = m_formule.Eval(m_contexteEval); if (result) { return(result.Data); } return(null); }
//------------------------------------------------------- public void AddDonneesCalculees(DataTable table) { foreach (CColonneEQCalculee col in ColonnesCalculees) { if (col.Formule == null) { continue; } if (!table.Columns.Contains(col.ColumnName)) { DataColumn dataCol = new DataColumn(col.ColumnName, col.DataType); dataCol.AllowDBNull = true; table.Columns.Add(dataCol); } } DataRow previousRow = null; //Stef 22/07/2015 : le contexte d'évaluation est le même pour //toutes les rows, ce qui permet de ne pas réinterpreter les champs calculés //appartenant à la query (utilisation du cache du contexteEvaluation), mais uniquement les champs calculées //de chaque row CContexteEvaluationExpression contexte = new CContexteEvaluationExpression(""); foreach (DataRow row in table.Rows) { contexte.ChangeSource(new CDataRowForChampCalculeODEQ(row, previousRow, Query)); previousRow = row; foreach (CColonneEQCalculee col in ColonnesCalculees) { C2iExpression formule = col.Formule; if (formule != null) { CResultAErreur result = formule.Eval(contexte); if (result && result.Data != null) { if (col.DataType.IsAssignableFrom(result.Data.GetType())) { try{ row[col.ColumnName] = result.Data; } catch {} } } } } } }