Пример #1
0
            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);
            }
Пример #2
0
        //-------------------------------------------------------
        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 {}
                            }
                        }
                    }
                }
            }
        }