private static void CalculateDefaultValues(XOTableContext TableContext, DataAvail.XtraBindings.Calculator.ObjectProperties Item)
 {
     foreach (XOField field in TableContext.Fields.Select(p=>p.XOField).Where(p=>p.DefaultValue != null))
     {
         Item.SetValue(field.Name, field.DefaultValue);
     }
 }
        private static void CalculateFieldCalculator(DataAvail.XtraBindings.Calculator.ObjectProperties Item, XOFieldContext AppFieldContext)
        {
            object val = null;

            foreach (XOFieldCalculatorRouteRelation rel in AppFieldContext.Calculator.RouteRelations)
            {
                if (val == null)
                    val = Item.GetValue(AppFieldContext.Calculator.IssueField);

                if (val != System.DBNull.Value)
                {

                    string fillExr = string.Format("{0} = {1}", rel.KeyFieldForFill.Name, val);

                    if (!string.IsNullOrEmpty(rel.Filter))
                    {
                        fillExr = string.Format("{0} AND {1}", fillExr, rel.Filter);
                    }

                    val = DbContext.GetScalar("SELECT {0} FROM {1} WHERE {2}", rel.FieldForRetrieve.Name, rel.TableForFill.Source, fillExr);


                    if (val != null)
                    {
                        continue;
                    }
                }

                val = null;

                break;
            }

            if (val != null)
            {
                Item.SetValue(AppFieldContext.Name, val);
            }
            else
            {
                Item.SetValue(AppFieldContext.Name, System.DBNull.Value);
                Item.SetError(AppFieldContext.Name, "Can't evalute defiened calculator expresssion!");
            }
        }
        public virtual void Calculate(DataAvail.XtraBindings.Calculator.ObjectProperties Item, string FieldName, DataAvail.XtraBindings.Calculator.ObjectCalulatorCalculateType CalculateType)
        {
            XOTableContext TableContext = Item.tableContext;

            #region InitializeNew - invoked when new item is added

            if (CalculateType == DataAvail.XtraBindings.Calculator.ObjectCalulatorCalculateType.InitializeNew)
            {
                CalculateDefaultValues(TableContext, Item);

                CalculateChildrenRelationsWithFilters(TableContext, Item, FieldName);
            }

            #endregion

            #region Clone current row

            if (CalculateType == DataAvail.XtraBindings.Calculator.ObjectCalulatorCalculateType.Clone)
            {
                Item.SetValue(TableContext.PkFieldName , null);
            }

            #endregion

            #region Item is Initialized

            if (CalculateType == DataAvail.XtraBindings.Calculator.ObjectCalulatorCalculateType.Initialize)
            {
                if (PersistData != null)
                    PersistData.Load(Item);

                foreach (XOFieldContext field in  TableContext.Fields.Where(p => p.Calculator != null))
                {
                    CalculateFieldCalculator(Item, field);
                }

                CalculateChildrenRelationsWithFilters(TableContext, Item, FieldName);
            }

            #endregion

            #region Item was saved

            if (CalculateType == ObjectCalulatorCalculateType.AfterSave)
            {
                if (PersistData != null)
                    PersistData.Save(Item);

            }

            #endregion

            #region Field changed

            if (CalculateType == ObjectCalulatorCalculateType.Calculate)
            {
                foreach (XOFieldContext field in TableContext.Fields.Where(p => p.Calculator != null && p.Calculator.IssueField == FieldName))
                {
                    if (field != null)
                    {
                        CalculateFieldCalculator(Item, field);
                    }
                }
            }

            #endregion
        }
        private static void CalculateChildrenRelationsWithFilters(XOTableContext TableContext, DataAvail.XtraBindings.Calculator.ObjectProperties Item, string FieldName)
        {
            XORelation rel = TableContext.FkItemRelation;

            if (rel != null && rel.DefaultValues != null)
            {
                foreach (KeyValuePair<string, object> kvp in rel.DefaultValues)
                {
                    Item.SetValue(kvp.Key, kvp.Value);
                    Item.SetReadOnly(kvp.Key, true);
                }
            }
        }