private System.Xml.XmlElement ToXMLElement(System.Xml.XmlDocument doc, ICSSoft.STORMNET.FunctionalLanguage.Function funct)
        {
            System.Xml.XmlElement el = doc.CreateElement("Function");
            if (funct != null)
            {
                el.SetAttribute("Name", funct.FunctionDef.StringedView);
                for (int i = 0; i < funct.Parameters.Count; i++)
                {
                    if (funct.Parameters[i] is ICSSoft.STORMNET.FunctionalLanguage.Function)
                    {
                        el.AppendChild(ToXMLElement(doc, funct.Parameters[i] as ICSSoft.STORMNET.FunctionalLanguage.Function));
                    }
                    else if (funct.Parameters[i] is ICSSoft.STORMNET.FunctionalLanguage.VariableDef)
                    {
                        System.Xml.XmlElement varel = doc.CreateElement("Variable");
                        varel.SetAttribute("Value", (funct.Parameters[i] as ICSSoft.STORMNET.FunctionalLanguage.VariableDef).StringedView);
                        el.AppendChild(varel);
                    }
                    else
                    {
                        System.Xml.XmlElement valel = doc.CreateElement("Value");
                        int parindex = (i >= funct.FunctionDef.Parameters.Count) ? funct.FunctionDef.Parameters.Count - 1 : i;
                        valel.SetAttribute("ConstType", funct.FunctionDef.Parameters[parindex].Type.StringedView);
                        valel.SetAttribute("Value", funct.Parameters[i].ToString());
                        el.AppendChild(valel);
                    }
                }
            }

            return(el);
        }
        /// <summary>
        /// Разбор
        /// </summary>
        /// <param name="value"></param>
        /// <param name="v"></param>
        /// <returns></returns>
        static public FunctionForControls Parse(string value, ICSSoft.STORMNET.View v)
        {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml(value);
            ICSSoft.STORMNET.FunctionalLanguage.FunctionalLanguageDef lang = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef;
            ICSSoft.STORMNET.FunctionalLanguage.VariableDef[]         vars;
            ArrayList arvars = new ArrayList();

            arvars.Add(new ICSSoft.STORMNET.FunctionalLanguage.VariableDef((lang as ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef).GuidType, "STORMMainObjectKey"));
            foreach (ICSSoft.STORMNET.PropertyInView piv in v.Properties)
            {
                System.Type propType = ICSSoft.STORMNET.Information.GetPropertyType(v.DefineClassType, piv.Name);
                try
                {
                    ICSSoft.STORMNET.FunctionalLanguage.ObjectType t = lang.GetObjectTypeForNetType(propType);
                    if (t != null)
                    {
                        arvars.Add(new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(t, piv.Name, piv.Caption));
                    }
                }
                catch
                { }
            }

            vars = (ICSSoft.STORMNET.FunctionalLanguage.VariableDef[])arvars.ToArray(typeof(ICSSoft.STORMNET.FunctionalLanguage.VariableDef));
            ICSSoft.STORMNET.FunctionalLanguage.Function fnc = FromXMLElements((System.Xml.XmlElement)doc.FirstChild, lang, vars);
            FunctionForControls res = null;

            if (fnc == null)
            {
                res = new FunctionForControls(v, fnc);
            }
            else
            {
                res = new FunctionForControls(v, fnc.FunctionDef, fnc.Parameters.ToArray());
            }

            try
            {
                res.Name = ((System.Xml.XmlElement)doc.FirstChild).GetAttribute("___Name");
            }
            catch { }
            return(res);
        }
        /// <summary>
        /// !!! Сделано public для обратной совместимости, использовать аккуратно.
        /// Берутся значения из глобальной переменной edobj и впариваются в функцию вместо параметров
        /// TODO: переписать эту функцию так, чтобы глобальная переменная не применялась и сделать её публичной
        /// </summary>
        /// <param name="func"></param>
        /// <returns></returns>
        public Function ConvertFunction(Function func)
        {
            if (func == null)
            {
                return(null);
            }

            FunctionalLanguage.Function res = new ICSSoft.STORMNET.FunctionalLanguage.Function(func.FunctionDef);
            ArrayList pars = new ArrayList();

            pars.AddRange(func.Parameters);
            for (int i = 0; i < pars.Count; i++)
            {
                if (pars[i] is FunctionalLanguage.Function)
                {
                    FunctionalLanguage.Function cur_func = pars[i] as FunctionalLanguage.Function;
                    pars[i] = ConvertFunction(cur_func);
                }
                else if (pars[i] is ParameterDef)
                {
                    object val = ICSSoft.STORMNET.Information.GetPropValueByName(edobj, (pars[i] as ParameterDef).ParamName);
                    if (val is DetailArray)
                    {
                        DetailArray  dar  = val as DetailArray;
                        DataObject[] objs = dar.GetAllObjects();
                        foreach (DataObject obj in objs)
                        {
                            if (obj.GetStatus(false) == ObjectStatus.Deleted)
                            {
                                dar.Remove(obj);
                            }
                            else
                            {
                                object ops = ICSSoft.STORMNET.Information.GetPropValueByName(obj, (pars[i] as ParameterDef).ParamName);
                                if (ops == null)
                                {
                                    dar.Remove(obj);
                                }
                            }
                        }

                        object[] pp = new object[dar.Count];
                        for (int j = 0; j < pp.Length; j++)
                        {
                            pp[j] = ICSSoft.STORMNET.Information.GetPropValueByName(dar.ItemByIndex(j), (pars[i] as ParameterDef).ParamName);
                        }

                        if (func.FunctionDef.Parameters[func.FunctionDef.Parameters.Count - 1].MultiValueSupport)
                        {
                            pars.RemoveAt(i);
                            pars.InsertRange(i, pp);
                        }
                        else
                        if (pp.Length > 0)
                        {
                            pars[i] = pp[0];
                        }
                        else
                        {
                            pars[i] = null;
                        }

                        i--;
                    }
                    else
                    {
                        pars[i] = ICSSoft.STORMNET.Information.GetPropValueByName(edobj, (pars[i] as ParameterDef).ParamName);
                    }
                }
                else if (func.FunctionDef.StringedView == "SQL" && ICSSoft.STORMNET.Business.DataServiceProvider.DataService is ICSSoft.STORMNET.Business.SQLDataService)
                {
                    ICSSoft.STORMNET.Business.SQLDataService ds = (ICSSoft.STORMNET.Business.SQLDataService)ICSSoft.STORMNET.Business.DataServiceProvider.DataService;

                    string sSQl = pars[i].ToString();

                    int j;

                    while ((j = sSQl.IndexOf("@")) != -1)
                    {
                        int k = j + 1;
                        while (k < sSQl.Length && (char.IsLetterOrDigit(sSQl[k]) || sSQl[k] == '_'))
                        {
                            k++;
                        }

                        string sParamName = sSQl.Substring(j, k - j);
                        sSQl = sSQl.Remove(j, k - j);

                        string sParamValue = string.Empty;

                        foreach (ParameterDef p in Parameters)
                        {
                            if ("@" + p.ParamName == sParamName)
                            {
                                sParamValue = ds.ConvertSimpleValueToQueryValueString(ICSSoft.STORMNET.Information.GetPropValueByName(edobj, p.ParamName));
                                break;
                            }
                        }

                        sSQl = sSQl.Insert(j, sParamValue);
                    }

                    pars[i] = sSQl;
                }
            }

            res.Parameters.AddRange(pars);
            return(res);
        }
예제 #4
0
 public СостояниеВелосипедаL() : base(СостояниеВелосипеда.Views.СостояниеВелосипедаL)
 {
     EditPage   = СостояниеВелосипедаE.FormPath;
     fncActual  = FunctionBuilder.BuildEquals <СостояниеВелосипеда>(x => x.Актуально, true);
     showActual = false;
 }
 /// <summary>
 /// конструктор
 /// </summary>
 /// <param name="view"></param>
 /// <param name="def"></param>
 /// <param name="parameters"></param>
 public FunctionForControls(ICSSoft.STORMNET.View view, ICSSoft.STORMNET.FunctionalLanguage.FunctionDef def, params object[] parameters)
 {
     function  = new ICSSoft.STORMNET.FunctionalLanguage.Function(def, parameters);
     this.View = view;
 }
 /// <summary>
 /// конструктор
 /// </summary>
 /// <param name="def"></param>
 /// <param name="View"></param>
 /// <param name="type"></param>
 /// <param name="parameters"></param>
 public FunctionForControls(ICSSoft.STORMNET.FunctionalLanguage.FunctionDef def, string View, Type type, params object[] parameters)
 {
     this.View = Information.GetView(View, type);
     function  = new ICSSoft.STORMNET.FunctionalLanguage.Function(def, parameters);
 }
 /// <summary>
 /// конструктор
 /// </summary>
 /// <param name="View"></param>
 /// <param name="type"></param>
 /// <param name="func"></param>
 public FunctionForControls(string View, Type type, ICSSoft.STORMNET.FunctionalLanguage.Function func)
 {
     this.View = Information.GetView(View, type);
     function  = func;
 }
 /// <summary>
 /// конструктор
 /// </summary>
 /// <param name="view"></param>
 /// <param name="func"></param>
 public FunctionForControls(ICSSoft.STORMNET.View view, ICSSoft.STORMNET.FunctionalLanguage.Function func)
 {
     this.View     = view;
     this.function = func;
 }