/// <summary>
        /// Конструктор формы
        /// </summary>
        public RoleE() : base("Sec_AgentL")
        {
            _languageDef = SQLWhereLanguageDef.LanguageDef;


            Function limitIsUser = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsUser"), true);
            LoadingCustomizationStruct lcsAllUsers = new LoadingCustomizationStruct(null);

            lcsAllUsers.LoadingTypes  = new[] { typeof(Agent) };
            lcsAllUsers.LimitFunction = limitIsUser;
            lcsAllUsers.View          = Information.GetView("Sec_AgentL", typeof(Agent));
            _allUsers =
                BridgeToDS.GetDataService().LoadObjects(lcsAllUsers).Cast <Agent>().ToList();


            Function limitIsRole = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsRole"), true);
            LoadingCustomizationStruct lcsAllRoles = new LoadingCustomizationStruct(null);

            lcsAllRoles.LoadingTypes  = new[] { typeof(Agent) };
            lcsAllRoles.LimitFunction = limitIsRole;
            lcsAllRoles.View          = Information.GetView("Sec_RolesL", typeof(Agent));
            _allRoles =
                BridgeToDS.GetDataService().LoadObjects(lcsAllRoles).Cast <Agent>().ToList();


            Function limitIsClass = _languageDef.GetFunction(_languageDef.funcEQ, new VariableDef(_languageDef.BoolType, "IsClass"), true);
            LoadingCustomizationStruct lcsAllClasses = new LoadingCustomizationStruct(null);

            lcsAllClasses.LoadingTypes  = new[] { typeof(Subject) };
            lcsAllClasses.LimitFunction = limitIsClass;
            lcsAllClasses.View          = Information.GetView("Sec_SubjectL", typeof(Subject));
            _allClasses =
                BridgeToDS.GetDataService().LoadObjects(lcsAllClasses).Cast <Subject>().ToList();
        }
Exemple #2
0
        /// <summary>
        /// Здесь лучше всего писать бизнес-логику, оперируя только объектом данных.
        /// </summary>
        protected override void PreApplyToControls()
        {
            SQLWhereLanguageDef ld = SQLWhereLanguageDef.LanguageDef;

            if (Context.User.IsInRole("Продавец") && this.DataObject == null)
            {
                // Определяем текущего пользователя
                var          currentUser = Context.User.Identity.Name;
                IDataService ds          = DataServiceProvider.DataService;
                var          lcs         = LoadingCustomizationStruct.GetSimpleStruct(typeof(Продавец), "ПродавецL");
                lcs.LimitFunction = ld.GetFunction(ld.funcEQ,
                                                   new VariableDef(ld.StringType, Information.ExtractPropertyPath <Продавец>(x => x.Логин)), currentUser);
                var manager = ds.LoadObjects(lcs)[0] as Продавец;

                // Устанавливаем текущего продавца в поле заказа
                this.DataObject = new Заказ();
                this.DataObject.ТорговаяТочка = manager.ТорговаяТочка;
                ctrlТорговаяТочка.Enabled     = false;
            }

            ctrlСтрокаЗаказа.AddLookUpSettings(Information.ExtractPropertyPath <СтрокаЗаказа>(r => r.Продукт), new LookUpSetting
            {
                LimitFunction = ld.GetFunction(ld.funcEQ,
                                               new VariableDef(ld.StringType, Information.ExtractPropertyPath <Продукт>(r => r.Статус)), "В продаже"),
                ColumnsSort = new ColumnsSortDef[] { new ColumnsSortDef("Код", SortOrder.Asc) }
            });
            if (DataObject.Состояние == СостояниеЗаказа.Оплаченный)
            {
                ctrlСостояние.Enabled = false;
            }
        }
Exemple #3
0
        public void GetObjectIndexesWithPksTest()
        {
            foreach (IDataService dataService in DataServices)
            {
                // Arrange.
                SQLDataService ds           = dataService as SQLDataService;
                var            createdBear1 = new Медведь();
                createdBear1.ЦветГлаз = "Косолапый Мишка 1";
                ds.UpdateObject(createdBear1);

                LoadingCustomizationStruct lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(Медведь), Медведь.Views.МедведьL);

                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                Function findFunction = langDef.GetFunction(langDef.funcLike,
                                                            new VariableDef(langDef.StringType, Information.ExtractPropertyPath <Медведь>(m => m.ЦветГлаз)),
                                                            createdBear1.ЦветГлаз);

                // Act.
                IDictionary <int, string> result = ds.GetObjectIndexesWithPks(lcs, findFunction, 101);

                // Assert.
                Assert.Equal(1, result.Count);
                Assert.True(result[1].IndexOf("{") > -1);

                Console.WriteLine(result[1]);
            }
        }
        /// <summary>
        /// Создание представление с добавление свойств из ограничения, которые используются в ограничении, но отсутствуют в указанном в качестве параметра ограничении. При поиске отсутствующих в представлении свойств учитываются также и выражения для вычислимых свойств.
        /// </summary>
        /// <param name="view">Представление, но основе которого создается новое представление, возвращаемое в качестве результата метода.</param>
        /// <param name="function">Функция, среди параметров которой происходит поиск неиспользуемых в представлении свойств.</param>
        /// <param name="dataService">Сервис данных необходим для правильного выбора выражения для вычислимиого свойства.</param>
        /// <returns>Представление, в которое добавлены необходимые свойства.</returns>
        public static View GetViewWithPropertiesUsedInFunction(View view, Function function, IDataService dataService)
        {
            if (view == null)
            {
                throw new ArgumentNullException("view");
            }

            if (function == null)
            {
                throw new ArgumentNullException("function");
            }

            SQLWhereLanguageDef langdef = ExternalLangDef.LanguageDef;

            // Создадим копию представления.
            // ToDo: При текущей реализации клонирования происходят аномалии, т.к. вложенные объекты не копируются полностью, копируются только ссылки. В TFS создана ошибка №30700.
            var enrichedView = view.Clone();

            var variableList = enrichedView.Properties.Select(propertyInView => propertyInView.Name).ToList();

            var detailList = new List <DetailVariableDef>();

            // ToDo: Для расширения представлений детейлов необходимо раскомментировать следую строку.  На данный момент этот вызов приводит к появлению пустых свойств в представлении детейла. Явление, видимо, как-то связанное с клонированием представлений (см. №30700.).
            // var detailList = enrichedView.Details.Select(detailInView => new DetailVariableDef(langdef.GetObjectType(detailInView.Name), detailInView.Name, detailInView.View, string.Empty, null)).ToList();

            FindPropertiesUsedInFunction(
                function, variableList, DetailVariableDefContainer.CreateDetailVariableDefContainersList(detailList));

            // Просмотрим все найденные в органичении свойства
            foreach (var property in variableList)
            {
                if (!enrichedView.CheckPropname(property))
                {
                    enrichedView.AddProperty(property, property, false, string.Empty);
                }

                // Проверим нет ли у свойства выражения для вычисления.
                var propertiesUsedInExpression = GetPropertiesUsedInExpression(
                    property, enrichedView.DefineClassType, dataService);

                foreach (var propertyUsedInExpression in propertiesUsedInExpression)
                {
                    if (!enrichedView.CheckPropname(propertyUsedInExpression) &&
                        !string.Equals(propertyUsedInExpression, SQLWhereLanguageDef.StormMainObjectKey, StringComparison.OrdinalIgnoreCase))
                    {
                        enrichedView.AddProperty(propertyUsedInExpression, propertyUsedInExpression, false, string.Empty);
                    }
                }
            }

            // Добавление описания детейлов: раскоментировать при ненеобходимости.
            // Пока в добавлении детейлов нет необходимости.
            // foreach (var detail in detailList)
            // {
            //    if (enrichedView.Details.Count(dvd => dvd.Name == detail.StringedView) == 0)
            //        enrichedView.AddDetailInView(detail.StringedView, detail.View, true);
            // }

            return(enrichedView);
        }
        /// <summary>
        /// Удалить все блокировки текущего юзера (какие есть в базе).
        /// В качестве сервиса данных используется переданный сервис данных.
        /// <param name="dataService">Сервис данных.</param>
        /// </summary>
        public static void ClearAllUserLocks(IDataService dataService)
        {
            var ds = dataService ?? DataServiceProvider.DataService;

            // убиваем все блокировки, оставшиеся с предыдущих времен
            SQLWhereLanguageDef lg = SQLWhereLanguageDef.LanguageDef;
            var vd = new VariableDef(lg.GetObjectTypeForNetType(typeof(string)), "UserName");

            Function func = lg.GetFunction(
                lg.funcEQ, vd, GetUserName() + (UseMachineNameInKey ? " @ " + Environment.MachineName : string.Empty));

            var lcs1 = new LoadingCustomizationStruct(0);

            var view = new View(typeof(LockData), View.ReadType.WithRelated);

            lcs1.Init(null, func, new[] { typeof(LockData) }, view, null);

            DataObject[] arr = ds.LoadObjects(lcs1);

            foreach (DataObject obj in arr)
            {
                obj.SetStatus(ObjectStatus.Deleted);
            }

            ds.UpdateObjects(ref arr);
        }
Exemple #6
0
        public void FunctionalLanguageDefGetObjectTypeForNetType1Test()
        {
            FunctionalLanguageDef langDef = new SQLWhereLanguageDef();

            var result = langDef.GetObjectTypeForNetType(typeof(DetailArray));

            Assert.Null(result);
        }
Exemple #7
0
        public void FunctionalLanguageDefGetObjectTypeForNetTypeTest()
        {
            FunctionalLanguageDef langDef = new SQLWhereLanguageDef();

            var result = langDef.GetObjectTypeForNetType(typeof(System.Decimal));

            Assert.Equal(result.NetCompatibilityType.Name, "Decimal");
        }
Exemple #8
0
        /// <summary>
        /// Здесь лучше всего писать бизнес-логику, оперируя только объектом данных.
        /// </summary>
        protected override void PreApplyToControls()
        {
            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;

            Function lf = langdef.GetFunction(langdef.funcEQ,
                                              new VariableDef(langdef.StringType, Information.ExtractPropertyName <Сотрудник>(x => x.Должность)), EnumCaption.GetCaptionFor(Должность.Менеджер));

            ctrlСотрудник.LimitFunction = lf;
        }
        public void VariableDefTest2()
        {
            SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;
            string objectStringView     = "TestStirngView";

            VariableDef variableDef = new VariableDef(langDef.StringType, objectStringView);

            Assert.True(variableDef.PrimaryKeyIsUnique);
            Assert.Equal(objectStringView, variableDef.StringedView);
        }
        public void VariableDefTest4()
        {
            SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;
            string property             = "Name";

            VariableDef variableDef = new VariableDef(typeof(TypeUsageProviderTestClass), property, langDef);

            Assert.True(variableDef.PrimaryKeyIsUnique);
            Assert.Equal(property, variableDef.StringedView);
        }
        public void VariableDefToSimpleValueTest()
        {
            Assert.True(VariableDefToSimpleValue(null, string.Empty));
            SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

            Assert.True(VariableDefToSimpleValue(langDef.StringType, "String"));
            Assert.True(VariableDefToSimpleValue(langDef.NumericType, "Numeric"));
            Assert.True(VariableDefToSimpleValue(langDef.BoolType, "Boolean"));
            Assert.True(VariableDefToSimpleValue(langDef.DateTimeType, "DateTime"));
            Assert.True(VariableDefToSimpleValue(langDef.GuidType, "Guid"));
        }
Exemple #12
0
        public void FunctionalLanguageDefGetFunctionExceptionTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                FunctionalLanguageDef langDef = new SQLWhereLanguageDef();

                var result = langDef.GetFunction("functionString");
            });

            Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionBySignatureException), exception);
        }
Exemple #13
0
        public void FunctionalLanguageDefGetFunctionException1Test()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;

                var result = langDef.GetFunction(langDef.funcEQ, new object[] { null });
            });

            Assert.IsType(typeof(NullReferenceException), exception);
        }
Exemple #14
0
        public void FunctionalLanguageDefGetFunctionDefExceptionTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                FunctionalLanguageDef langDef = new SQLWhereLanguageDef();

                // Вызов функции с несуществующим идентификатором.
                langDef.GetFunctionDef(0);
            });

            Assert.IsType(typeof(Exception), exception);
        }
Exemple #15
0
        public void FunctionalLanguageDefGetFunctionDefByStringedViewExceptionTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                FunctionalLanguageDef langDef = new SQLWhereLanguageDef();

                // Вызов функции с несуществующим строковым представлением.
                langDef.GetFunctionDefByStringedView(String.Empty);
            });

            Assert.IsType(typeof(Exception), exception);
        }
        /// <summary>
        /// Обычный Page_Load ASP.NET
        /// </summary>
        /// <param name="sender">Sender object</param>
        /// <param name="e">Event Args</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            SQLWhereLanguageDef languageDef = SQLWhereLanguageDef.LanguageDef;
            Function            limit       = languageDef.GetFunction(languageDef.funcEQ, new VariableDef(languageDef.BoolType, "IsClass"), true);

            WebObjectListView1.LimitFunction = limit;
            WebObjectListView1.View          = Information.GetView("Sec_SubjectL", typeof(Subject));
            WebObjectListView1.EditPage      = "~//forms//Security//Class//ClassE.aspx";

            WOLVSettApplyer wsa = new WOLVSettApplyer();

            wsa.SettingsApply(WebObjectListView1);
        }
        public void VariableDefFromSimpleValueExceptionTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                object testData = new string[] { "UnknownType", "TestStirngView", "TestObjectCaption" };

                SQLWhereLanguageDef langDef = SQLWhereLanguageDef.LanguageDef;
                VariableDef variableDef     = new VariableDef();

                variableDef.FromSimpleValue(testData, langDef);
            });

            Assert.IsType(typeof(Exception), exception);
        }
        public void GetExistingVariableNamesNotFoundFunctionParametersExceptionTest()
        {
            var exception = Record.Exception(() =>
            {
                var obj = new MasterClass()
                {
                    StringMasterProperty = "prop", IntMasterProperty = 666
                };
                SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
                Function lf2 = langdef.GetFunction(
                    langdef.funcNOT,
                    langdef.GetFunction(langdef.funcEQ, new VariableDef(langdef.GuidType, "MasterClass"), obj.DetailClass));
            });

            Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionParametersException), exception);
        }
Exemple #19
0
        public void TestEqualsExpressionWithObjectParameter()
        {
            // Arrange.
            var    testProvider = new TestQueryProvider <LinqProviderTestDataObject>();
            object value        = "{72FCA622-A01E-494C-BE1C-0821178594FB}";

            new Query <LinqProviderTestDataObject>(testProvider).Where(o => o.ObjectProperty == value).ToArray();
            Expression          queryExpression = testProvider.InnerExpression;
            SQLWhereLanguageDef langDef         = SQLWhereLanguageDef.LanguageDef;
            Function            expected        = langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.StringType, nameof(LinqProviderTestDataObject.ObjectProperty)), value);

            // Act.
            LoadingCustomizationStruct actual = LinqToLcs.GetLcs(queryExpression, typeof(LinqProviderTestDataObject));

            // Assert.
            Assert.Equal(expected, actual.LimitFunction);
        }
        /// <summary>
        /// Проверка логики для VariableDefFromSimpleValueTest.
        /// </summary>
        /// <param name="objType">
        /// Проверяемый тип.
        /// </param>
        /// <returns>
        /// Возвращает true если тест прошел.
        /// </returns>
        private bool VariableDefFromSimpleValue(string objType)
        {
            bool result = false;

            object testData = new string[] { objType, "TestStirngView", "TestObjectCaption" };

            SQLWhereLanguageDef langDef     = SQLWhereLanguageDef.LanguageDef;
            VariableDef         variableDef = new VariableDef();

            variableDef.FromSimpleValue(testData, langDef);

            string findType = String.Empty;

            switch (objType)
            {
            case "":
                findType = "String";
                break;

            // различная обработка NumericType в методах ToSimpleValue() сериализуем в "Numeric"
            // а в методе FromSimpleValue() десериализуем в  "Decimal" (инф добавил в отчет).
            case "Numeric":
                findType = "Decimal";
                break;

            // Различие десериализации в FromSimpleValue() "KeyGuid" -> "Guid" и
            // "keyguid" -> "KeyGuid". В одном методе два оператора switch (инф добавил в отчет).
            case "KeyGuid":
                findType = "Guid";
                break;

            default:
                findType = objType.Split('.').Last();
                break;
            }

            var findAddType = langDef.Types.Cast <ObjectType>()
                              .FirstOrDefault(i => i.NetCompatibilityType.Name == findType);

            if (findAddType != null)
            {
                result = true;
            }

            return(result);
        }
Exemple #21
0
        public void SqlWhereLangDefInitializationTest()
        {
            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;

            Assert.True(langdef != null, "LanguageDef of SQLWhereLanguageDef could not be initialized");
            //проверим id функций, чтобы они не повторялись
            var funcIds = new List <int>(langdef.Functions.Count);

            foreach (FunctionDef func in langdef.Functions)
            {
                if (funcIds.Contains(func.ID))
                {
                    Assert.True(false, String.Format("Functions in SQLWhereLanguageDef with the same id({0}) defined", func.ID));
                }
                funcIds.Add(func.ID);
            }
        }
        /// <summary>
        /// Преобразовать значение в SQL строку
        /// </summary>
        /// <param name="function">Функция</param>
        /// <param name="convertValue">делегат для преобразования констант</param>
        /// <param name="convertIdentifier">делегат для преобразования идентификаторов</param>
        /// <returns></returns>
        public override string FunctionToSql(
            SQLWhereLanguageDef sqlLangDef,
            Function value,
            delegateConvertValueToQueryValueString convertValue,
            delegatePutIdentifierToBrackets convertIdentifier)
        {
            // реализована ЛИШЬ ЧАСТИЧНАЯ поддержка Access
            ExternalLangDef langDef = sqlLangDef as ExternalLangDef;

            if (value.FunctionDef.StringedView == "OnlyDate")
            {
                return(string.Format("cdate (int( {0} ) )",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            return(base.FunctionToSql(sqlLangDef, value, convertValue, convertIdentifier));
        }
Exemple #23
0
        public static string CreateLf(string[] ordKeys, string lfKey)
        {
            if (string.IsNullOrEmpty(lfKey))
            {
                lfKey = Guid.NewGuid().ToString("B");
            }

            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
            var clientKeys = new List <object>
            {
                new VariableDef(
                    langdef.GuidType,
                    SQLWhereLanguageDef.StormMainObjectKey)
            };

            clientKeys.AddRange(ordKeys);
            Function lf = langdef.GetFunction(langdef.funcNOT, langdef.GetFunction(langdef.funcIN, clientKeys.ToArray()));

            LimitFunctionsHolder.PersistLimitFunction(lfKey, lf);

            return(lfKey);
        }
Exemple #24
0
        // *** Start programmer edit section *** (Period CustomMembers)
        /// <summary>
        /// Загрузить вложенные периоды.
        /// </summary>
        /// <param name="pВложенныеПериоды"></param>
        public void LoadВложенныеПериоды(System.Collections.ArrayList pВложенныеПериоды)
        {
            IDataService ds = DataServiceProvider.DataService;

            LoadingCustomizationStruct lcs = new LoadingCustomizationStruct(null);

            lcs.View         = Information.GetView("PeriodL", typeof(Period));
            lcs.LoadingTypes = new Type[] { typeof(Period) };
            SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;

            ICSSoft.STORMNET.FunctionalLanguage.Function lf = langdef.GetFunction(langdef.funcEQ,
                                                                                  new VariableDef(langdef.NumericType, "Ierarhiia"), this.__PrimaryKey);

            lcs.LimitFunction = lf;

            ICSSoft.STORMNET.DataObject[] tmpПериоды = ds.LoadObjects(lcs);
            foreach (Period dobject in tmpПериоды)
            {
                pВложенныеПериоды.Add(dobject);
                ((Period)dobject).LoadВложенныеПериоды(pВложенныеПериоды);
            }
        }
        /// <summary>
        /// Преобразовать значение в SQL строку
        /// </summary>
        /// <param name="function">Функция</param>
        /// <param name="convertValue">делегат для преобразования констант</param>
        /// <param name="convertIdentifier">делегат для преобразования идентификаторов</param>
        /// <returns></returns>
        public override string FunctionToSql(
            SQLWhereLanguageDef sqlLangDef,
            Function value,
            delegateConvertValueToQueryValueString convertValue,
            delegatePutIdentifierToBrackets convertIdentifier)
        {
            ExternalLangDef langDef = sqlLangDef as ExternalLangDef;

            if (value.FunctionDef.StringedView == "TODAY")
            {
                return("sysdate");
            }

            if (
                value.FunctionDef.StringedView == "YearPart" ||
                value.FunctionDef.StringedView == "MonthPart" ||
                value.FunctionDef.StringedView == "DayPart")
            {
                return(string.Format("EXTRACT ({0} FROM {1})", value.FunctionDef.StringedView.Substring(0, value.FunctionDef.StringedView.Length - 4),
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (
                value.FunctionDef.StringedView == "hhPart")
            {
                return(string.Format("TO_CHAR({1}, \'{0}\')", "HH24",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "miPart")
            {
                return(string.Format("TO_CHAR({1}, \'{0}\')", "MI",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "DayOfWeek")
            {
                // здесь требуется преобразование из DATASERVICE
                return(string.Format("TO_CHAR({1}, \'{0}\')", "D",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcDayOfWeekZeroBased)
            {
                throw new NotImplementedException(string.Format("Function {0} is not implemented for Oracle", langDef.funcDayOfWeekZeroBased));
            }

            if (value.FunctionDef.StringedView == langDef.funcDaysInMonth)
            {
                // здесь требуется преобразование из DATASERVICE
                string.Format("to_char(last_day(to_date('01.'||{0}||'.'||{1},'dd.mm.yyyy')),'dd')", langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier), langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier));
                return(string.Empty);
            }

            if (value.FunctionDef.StringedView == "OnlyDate")
            {
                return(string.Format("TRUNC({0})",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "CurrentUser")
            {
                return(string.Format("'{0}'", CurrentUserService.CurrentUser.FriendlyName));

                // у нее нет параметров
                // langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier));
            }

            if (value.FunctionDef.StringedView == "OnlyTime")
            {
                return(string.Format("TRUNC({0})",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "DATEDIFF")
            {
                var ret = string.Empty;
                if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Year")
                {
                    ret = string.Format("EXTRACT (YEAR FROM {1}) - EXTRACT (YEAR FROM {0})",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Month")
                {
                    ret = string.Format("(EXTRACT (YEAR FROM {1}) - EXTRACT (YEAR FROM {0})) * 12 + (EXTRACT (MONTH FROM {1}) - EXTRACT (MONTH FROM {0}))",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Week")
                {
                    ret = string.Format("(TRUNC({1},'DAY') - TRUNC({0},'DAY'))/7",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Day")
                {
                    ret = string.Format("TRUNC({1}) - TRUNC({0})",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "quarter")
                {
                    ret = string.Format("(EXTRACT (YEAR FROM {1}) - EXTRACT (YEAR FROM {0})) * 4 + (TO_CHAR({1}, 'Q') - TO_CHAR({0}, 'Q'))",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }

                return(ret);
            }

            if (value.FunctionDef.StringedView == "SUM" ||
                value.FunctionDef.StringedView == "AVG" ||
                value.FunctionDef.StringedView == "MAX" ||
                value.FunctionDef.StringedView == "MIN")
            {
                ICSSoft.STORMNET.Business.LoadingCustomizationStruct lcs = new ICSSoft.STORMNET.Business.LoadingCustomizationStruct(null);
                DetailVariableDef dvd = (DetailVariableDef)value.Parameters[0];
                lcs.LoadingTypes         = new Type[] { dvd.View.DefineClassType };
                lcs.View                 = new View();
                lcs.View.DefineClassType = dvd.View.DefineClassType;
                lcs.View.AddProperty(dvd.ConnectMasterPorp);
                string[] prevRetVars = langDef.retVars;
                langDef.retVars = new string[] { dvd.ConnectMasterPorp };
                ArrayList al  = new ArrayList();
                object    par = langDef.TransformObject(value.Parameters[1], dvd.StringedView, al);
                foreach (string s in al)
                {
                    lcs.View.AddProperty(s);
                }

                string Slct            = GenerateSQLSelect(lcs, false).Replace("STORMGENERATEDQUERY", "SGQ" + Guid.NewGuid().ToString().Replace("-", string.Empty));
                string CountIdentifier = convertIdentifier("g" + Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 29));

                // FunctionalLanguage.Function numFunc = (value.Parameters[1] as FunctionalLanguage.Function);

                string sumExpression = langDef.SQLTranslSwitch(par, convertValue, convertIdentifier);

                string res = string.Empty;
                res = string.Format(
                    "( SELECT {0} From ( " +
                    "SELECT {6}({5}) {0},{1} from ( {4} )pip group by {1} ) " +
                    " ahh where {1} in ({3}",
                    CountIdentifier,
                    convertIdentifier(dvd.ConnectMasterPorp),
                    convertIdentifier(Information.GetClassStorageName(dvd.View.DefineClassType)),
                    convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[0]),

                    // convertIdentifier(dvd.OwnerConnectProp),
                    Slct,

                    // ВНИМАНИЕ ЗДЕСЬ ТРЕБУЕТСЯ ИЗМЕНИТь ISNULL на вычислитель в определенном DATASERVICE
                    "NVL(" + sumExpression + ",0)", value.FunctionDef.StringedView);
                for (int k = 0; k < dvd.OwnerConnectProp.Length; k++)
                {
                    res += "," + convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[k]);
                }

                res += "))";

                langDef.retVars = prevRetVars;
                return(res);
            }

            if (value.FunctionDef.StringedView == langDef.funcCountWithLimit || value.FunctionDef.StringedView == "Count")
            {
                var lcs = new ICSSoft.STORMNET.Business.LoadingCustomizationStruct(null);
                var dvd = (DetailVariableDef)value.Parameters[0];
                lcs.LoadingTypes  = new Type[] { dvd.View.DefineClassType };
                lcs.View          = dvd.View.Clone();
                lcs.LimitFunction = value.FunctionDef.StringedView == langDef.funcCountWithLimit
                    ? langDef.TransformVariables((FunctionalLanguage.Function)value.Parameters[1], dvd.StringedView, null)
                    : langDef.GetFunction("True");
                var prevRetVars = langDef.retVars;
                langDef.retVars = new string[] { dvd.ConnectMasterPorp };
                var Slct            = GenerateSQLSelect(lcs, true);
                var CountIdentifier = convertIdentifier("g" + Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 29));

                var res = string.Format(
                    "( NVL(  ( SELECT {0} From ( " +
                    "SELECT Count(*) {0},{1} from ( {4} )pip group by {1} ) " +
                    " ahh where {1} in ({3}",
                    CountIdentifier,
                    convertIdentifier(dvd.ConnectMasterPorp),
                    convertIdentifier(Information.GetClassStorageName(dvd.View.DefineClassType)),
                    convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[0]),
                    Slct);
                for (int k = 1; k < dvd.OwnerConnectProp.Length; k++)
                {
                    res += "," + convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[k]);
                }

                res += ")),0))";

                langDef.retVars = prevRetVars;
                return(res);
            }

            if (value.FunctionDef.StringedView == langDef.funcToChar)
            {
                if (value.Parameters.Count == 2)
                {
                    return(string.Format(
                               "SUBSTR(TO_CHAR({0}), 1, {1})",
                               langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                               value.Parameters[1]));
                }

                if (value.Parameters.Count == 3)
                {
                    return(string.Format(
                               "SUBSTR(TO_CHAR({0}, {2}), 1, {1})",
                               langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                               value.Parameters[1],
                               DateFormats.GetOracleDateFormat((int)value.Parameters[2])));
                }
            }
            else
            {
                throw new NotImplementedException(string.Format(
                                                      "Функция {0} не реализована для Oracle", value.FunctionDef.StringedView));
            }

            return(string.Empty);
        }
Exemple #26
0
        /// <summary>
        /// Selects messages from the database that can be sent.
        /// </summary>
        /// <param name="state">Not used.</param>
        private void ScanMessages(object state)
        {
            try
            {
                if (_sendingTasksCount >= MaxTasks)
                {
                    return;
                }

                IEnumerable <Subscription> subscriptions = _subscriptionsManager.GetCallbackSubscriptions();
                if (!subscriptions.Any())
                {
                    return;
                }

                foreach (var clientSubscriptions in subscriptions.GroupBy(s => s.Client))
                {
                    int  currentConnections = 0;
                    int  connectionsLimit   = clientSubscriptions.Key.ConnectionsLimit ?? DefaultConnectionsLimit;
                    Guid clientId           = (KeyGuid)clientSubscriptions.Key.__PrimaryKey;
                    if (!_clientConnections.TryGetValue(clientId, out currentConnections))
                    {
                        _clientConnections.Add(clientId, 0);
                    }

                    if (currentConnections >= connectionsLimit)
                    {
                        continue;
                    }

                    SQLWhereLanguageDef        langDef = SQLWhereLanguageDef.LanguageDef;
                    LoadingCustomizationStruct lcs     = LoadingCustomizationStruct.GetSimpleStruct(typeof(Message), Message.Views.SendingByCallbackView);

                    // All messages for this client by all its active subscriptions
                    Function clientLimitFunction = langDef.GetFunction(langDef.funcOR, clientSubscriptions.Select(s => langDef.GetFunction(
                                                                                                                      langDef.funcAND,
                                                                                                                      langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.GuidType, Information.ExtractPropertyPath <Message>(m => m.Recipient)), s.Client.__PrimaryKey),
                                                                                                                      langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.GuidType, Information.ExtractPropertyPath <Message>(m => m.MessageType)), s.MessageType.__PrimaryKey))).ToArray());

                    // Only unsent messages whose sending time has already arrived
                    lcs.LimitFunction = langDef.GetFunction(
                        langDef.funcAND,
                        clientLimitFunction,
                        langDef.GetFunction(langDef.funcEQ, new VariableDef(langDef.BoolType, Information.ExtractPropertyPath <Message>(m => m.IsSending)), false),
                        langDef.GetFunction(langDef.funcLEQ, new VariableDef(langDef.DateTimeType, Information.ExtractPropertyPath <Message>(m => m.SendingTime)), DateTime.Now));

                    // Get no more than we can send
                    lcs.ReturnTop   = connectionsLimit - currentConnections;
                    lcs.ColumnsSort = new[]
                    {
                        new ColumnsSortDef(Information.ExtractPropertyPath <Message>(m => m.Priority), SortOrder.Asc),
                        new ColumnsSortDef(Information.ExtractPropertyPath <Message>(m => m.SendingTime), SortOrder.Asc),
                    };

                    Stopwatch    stopwatch = Stopwatch.StartNew();
                    DataObject[] messages  = _dataService.LoadObjects(lcs);
                    stopwatch.Stop();
                    _statisticsService.NotifyAvgTimeSql(null, (int)stopwatch.ElapsedMilliseconds, $"PrioritySendingManager.ScanMessages(): Load {lcs.ReturnTop} messages for client with name: {clientSubscriptions.Key.Name}.");

                    int index = 0;
                    while (index < messages.Length && TryEnqueue((Message)messages[index]))
                    {
                        index++;
                    }
                }
            }
            catch (Exception exception)
            {
                _logger.LogError("An error occurred while scanning messages.", exception.ToString());
            }
        }
        /// <summary>
        /// Преобразовать значение в SQL строку
        /// </summary>
        /// <param name="function">Функция</param>
        /// <param name="convertValue">делегат для преобразования констант</param>
        /// <param name="convertIdentifier">делегат для преобразования идентификаторов</param>
        /// <returns></returns>
        public override string FunctionToSql(
            SQLWhereLanguageDef sqlLangDef,
            Function value,
            delegateConvertValueToQueryValueString convertValue,
            delegatePutIdentifierToBrackets convertIdentifier)
        {
            ExternalLangDef langDef = sqlLangDef as ExternalLangDef;

            if (value.FunctionDef.StringedView == "TODAY")
            {
                return("current_timestamp");
            }

            if (
                value.FunctionDef.StringedView == "YearPart" ||
                value.FunctionDef.StringedView == "MonthPart" ||
                value.FunctionDef.StringedView == "DayPart")
            {
                return(string.Format("EXTRACT ({0} FROM {1})", value.FunctionDef.StringedView.Substring(0, value.FunctionDef.StringedView.Length - 4),
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (
                value.FunctionDef.StringedView == "hhPart" ||
                value.FunctionDef.StringedView == "miPart")
            {
                string strView = value.FunctionDef.StringedView == "hhPart" ? "HOUR" : "MINUTE";

                return(string.Format("EXTRACT ({0} FROM {1})", strView,
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "DayOfWeek")
            {
                return(string.Format("EXTRACT ({0} FROM {1})", "ISODOW",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcDayOfWeekZeroBased)
            {
                return(string.Format("EXTRACT ({0} FROM {1})", "DOW",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcDaysInMonth)
            {
                // здесь требуется преобразование из DATASERVICE

                return(string.Format("DATE_PART('days', DATE_TRUNC('month', to_date('01.{0}.{1}','dd.mm.yyyy')) + '1 MONTH'::INTERVAL - DATE_TRUNC('month', to_date('01.{0}.{1}','dd.mm.yyyy')) )",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier), langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "OnlyDate")
            {
                return(string.Format("date_trunc('day',{0})",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "CurrentUser")
            {
                return(string.Format("'{0}'", CurrentUserService.CurrentUser.FriendlyName));
            }

            if (value.FunctionDef.StringedView == "OnlyTime")
            {
                return(string.Format("(to_timestamp(0)+({0} - {0}::date))",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "DATEDIFF")
            {
                var ret = string.Empty;
                if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Year")
                {
                    ret = string.Format("DATE_PART('year', {1}) - DATE_PART('year', {0})",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Month")
                {
                    ret = string.Format("(DATE_PART('year', {1}) - DATE_PART('year', {0})) * 12 + (DATE_PART('month', {1}) - DATE_PART('month', {0}))",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Week")
                {
                    ret = string.Format("TRUNC(DATE_PART('day', {1} - {0})/7)",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "Day")
                {
                    ret = string.Format("DATE_PART('day', {1} - {0})",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }
                else if (langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier) == "quarter")
                {
                    ret = string.Format("EXTRACT(QUARTER FROM {1})-EXTRACT(QUARTER FROM {0})+4*(DATE_PART('year', {1}) - DATE_PART('year', {0}))",
                                        langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                        langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier));
                }

                return(ret);
            }

            if (value.FunctionDef.StringedView == "SUM" ||
                value.FunctionDef.StringedView == "AVG" ||
                value.FunctionDef.StringedView == "MAX" ||
                value.FunctionDef.StringedView == "MIN")
            {
                var lcs = new ICSSoft.STORMNET.Business.LoadingCustomizationStruct(null);
                var dvd = (DetailVariableDef)value.Parameters[0];
                lcs.LoadingTypes         = new Type[] { dvd.View.DefineClassType };
                lcs.View                 = new View();
                lcs.View.DefineClassType = dvd.View.DefineClassType;
                lcs.View.AddProperty(dvd.ConnectMasterPorp);
                var prevRetVars = langDef.retVars;
                langDef.retVars = new string[] { dvd.ConnectMasterPorp };
                var al  = new ArrayList();
                var par = langDef.TransformObject(value.Parameters[1], dvd.StringedView, al);
                foreach (string s in al)
                {
                    lcs.View.AddProperty(s);
                }

                var Slct            = GenerateSQLSelect(lcs, false).Replace("STORMGENERATEDQUERY", "SGQ" + Guid.NewGuid().ToString().Replace("-", string.Empty));
                var CountIdentifier = convertIdentifier("g" + Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 29));

                string sumExpression = langDef.SQLTranslSwitch(par, convertValue, convertIdentifier);

                string res = string.Empty;
                res = string.Format(
                    "( SELECT {0} From ( " +
                    "SELECT {6}({5}) {0},{1} from ( {4} )pip group by {1} ) " +
                    " ahh where {1} in ({3}",
                    CountIdentifier,
                    convertIdentifier(dvd.ConnectMasterPorp),
                    convertIdentifier(Information.GetClassStorageName(dvd.View.DefineClassType)),
                    convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[0]),

                    // convertIdentifier(dvd.OwnerConnectProp),
                    Slct,

                    // ВНИМАНИЕ ЗДЕСЬ ТРЕБУЕТСЯ ИЗМЕНИТь ISNULL на вычислитель в определенном DATASERVICE
                    "COALESCE(" + sumExpression + ",0)", value.FunctionDef.StringedView);
                for (int k = 0; k < dvd.OwnerConnectProp.Length; k++)
                {
                    res += "," + convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[k]);
                }

                res += "))";

                langDef.retVars = prevRetVars;
                return(res);
            }

            if (value.FunctionDef.StringedView == langDef.funcCountWithLimit || value.FunctionDef.StringedView == "Count")
            {
                var lcs = new ICSSoft.STORMNET.Business.LoadingCustomizationStruct(null);
                var dvd = (DetailVariableDef)value.Parameters[0];
                lcs.LoadingTypes  = new Type[] { dvd.View.DefineClassType };
                lcs.View          = dvd.View.Clone();
                lcs.LimitFunction = value.FunctionDef.StringedView == langDef.funcCountWithLimit
                    ? langDef.TransformVariables((FunctionalLanguage.Function)value.Parameters[1], dvd.StringedView, null)
                    : langDef.GetFunction("True");
                var prevRetVars = langDef.retVars;
                langDef.retVars = new string[] { dvd.ConnectMasterPorp };
                var Slct            = GenerateSQLSelect(lcs, true);
                var CountIdentifier = convertIdentifier("g" + Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 29));

                var res = string.Format(
                    "( COALESCE(  ( SELECT {0} From ( " +
                    "SELECT Count(*) {0},{1} from ( {4} )pip group by {1} ) " +
                    " ahh where {1} in ({3}",
                    CountIdentifier,
                    convertIdentifier(dvd.ConnectMasterPorp),
                    convertIdentifier(Information.GetClassStorageName(dvd.View.DefineClassType)),
                    convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[0]),
                    Slct);
                for (int k = 1; k < dvd.OwnerConnectProp.Length; k++)
                {
                    res += "," + convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[k]);
                }

                res += ")),0))";

                langDef.retVars = prevRetVars;
                return(res);
            }

            if (value.FunctionDef.StringedView == langDef.funcToChar)
            {
                if (value.Parameters.Count == 2)
                {
                    return(string.Format(
                               "({0})::varchar({1})",
                               langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                               value.Parameters[1]));
                }

                if (value.Parameters.Count == 3)
                {
                    return(string.Format(
                               "(to_char({0}, '{2}')::varchar({1}))",
                               langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                               value.Parameters[1],
                               DateFormats.GetPostgresDateFormat((int)value.Parameters[2])));
                }
            }

            throw new NotImplementedException(string.Format(
                                                  "Функция {0} не реализована для Postgres", value.FunctionDef.StringedView));
        }
        /// <summary>
        /// Преобразовать значение в SQL строку
        /// </summary>
        /// <param name="function">Функция</param>
        /// <param name="convertValue">делегат для преобразования констант</param>
        /// <param name="convertIdentifier">делегат для преобразования идентификаторов</param>
        /// <returns></returns>
        public override string FunctionToSql(
            SQLWhereLanguageDef sqlLangDef,
            Function value,
            delegateConvertValueToQueryValueString convertValue,
            delegatePutIdentifierToBrackets convertIdentifier)
        {
            ExternalLangDef langDef = sqlLangDef as ExternalLangDef;

            if (value.FunctionDef.StringedView == "TODAY")
            {
                return("getdate()");
            }

            if (
                value.FunctionDef.StringedView == "YearPart" ||
                value.FunctionDef.StringedView == "MonthPart" ||
                value.FunctionDef.StringedView == "DayPart")
            {
                return(string.Format("{0}({1})", value.FunctionDef.StringedView.Substring(0, value.FunctionDef.StringedView.Length - 4),
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (
                value.FunctionDef.StringedView == "hhPart" ||
                value.FunctionDef.StringedView == "miPart")
            {
                return(string.Format("datepart({0},{1})", value.FunctionDef.StringedView.Substring(0, value.FunctionDef.StringedView.Length - 4),
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "DayOfWeek")
            {
                //здесь требуется преобразование из DATASERVICE
                return(string.Format("(datepart({0}, {1})+@@DATEFIRST-2)%7 + 1", "DW",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcDayOfWeekZeroBased)
            {
                // здесь требуется преобразование из DATASERVICE
                return(string.Format(
                           "(datepart({0}, {1})+@@DATEFIRST-1)%7",
                           "DW",
                           langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcDaysInMonth)
            {
                //здесь требуется преобразование из DATASERVICE
                string monthStr = String.Format("LTRIM(RTRIM(STR({0})))", langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier));
                string yearStr  = String.Format("LTRIM(RTRIM(STR({0})))", langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier));
                monthStr = String.Format("CASE WHEN LEN({0})=1 THEN '0'+{0} ELSE {0} END", monthStr);
                return(string.Format("DAY(DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,CAST({0}+{1}+'01' AS DATETIME))+1,0)))", yearStr, monthStr));
            }

            if (value.FunctionDef.StringedView == "OnlyDate")
            {
                return(string.Format("cast(CONVERT(varchar(8), {1}, {0}) as datetime)", "112",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "CurrentUser")
            {
                return(string.Format("'{0}'", CurrentUserService.CurrentUser.FriendlyName));
            }

            if (value.FunctionDef.StringedView == "OnlyTime")
            {
                return(string.Format("cast(CONVERT(varchar(8), {1}, {0}) as datetime)", "114",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "DATEDIFF")
            {
                return(string.Format("DATEDIFF ( {0} , {1} , {2})",
                                     langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                                     langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                                     langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == "SUM" ||
                value.FunctionDef.StringedView == "AVG" ||
                value.FunctionDef.StringedView == "MAX" ||
                value.FunctionDef.StringedView == "MIN")
            {
                var lcs = new ICSSoft.STORMNET.Business.LoadingCustomizationStruct(null);
                var dvd = (DetailVariableDef)value.Parameters[0];
                lcs.LoadingTypes         = new Type[] { dvd.View.DefineClassType };
                lcs.View                 = new View();
                lcs.View.DefineClassType = dvd.View.DefineClassType;
                lcs.View.AddProperty(dvd.ConnectMasterPorp);
                var prevRetVars = langDef.retVars;
                langDef.retVars = new string[] { dvd.ConnectMasterPorp };
                var al  = new ArrayList();
                var par = langDef.TransformObject(value.Parameters[1], dvd.StringedView, al);
                foreach (string s in al)
                {
                    lcs.View.AddProperty(s);
                }
                var Slct            = GenerateSQLSelect(lcs, false).Replace("STORMGENERATEDQUERY", "SGQ" + Guid.NewGuid().ToString().Replace("-", string.Empty));
                var CountIdentifier = convertIdentifier("g" + Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 29));

                string sumExpression = langDef.SQLTranslSwitch(par, convertValue, convertIdentifier);

                string res = string.Empty;
                res = string.Format(
                    "( SELECT {0} From ( " +
                    "SELECT {6}({5}) {0},{1} from ( {4} )pip group by {1} ) " +
                    " ahh where {1} in ({3}",
                    CountIdentifier,
                    convertIdentifier(dvd.ConnectMasterPorp),
                    convertIdentifier(Information.GetClassStorageName(dvd.View.DefineClassType)),
                    convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[0]),
                    //convertIdentifier(dvd.OwnerConnectProp),
                    Slct,
                    //ВНИМАНИЕ ЗДЕСЬ ТРЕБУЕТСЯ ИЗМЕНИТь ISNULL на вычислитель в определенном DATASERVICE
                    "isnull(" + sumExpression + ",0)", value.FunctionDef.StringedView);
                for (int k = 0; k < dvd.OwnerConnectProp.Length; k++)
                {
                    res += "," + convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[k]);
                }
                res += "))";

                langDef.retVars = prevRetVars;
                return(res);
            }

            if (value.FunctionDef.StringedView == langDef.funcCountWithLimit || value.FunctionDef.StringedView == "Count")
            {
                var lcs = new ICSSoft.STORMNET.Business.LoadingCustomizationStruct(null);
                var dvd = (DetailVariableDef)value.Parameters[0];
                lcs.LoadingTypes  = new Type[] { dvd.View.DefineClassType };
                lcs.View          = dvd.View.Clone();
                lcs.LimitFunction = value.FunctionDef.StringedView == langDef.funcCountWithLimit
                    ? langDef.TransformVariables((FunctionalLanguage.Function)value.Parameters[1], dvd.StringedView, null)
                    : langDef.GetFunction("True");
                var prevRetVars = langDef.retVars;
                langDef.retVars = new string[] { dvd.ConnectMasterPorp };
                var Slct            = GenerateSQLSelect(lcs, true);
                var CountIdentifier = convertIdentifier("g" + Guid.NewGuid().ToString().Replace("-", string.Empty).Substring(0, 29));

                var res = string.Format(
                    "( Isnull(  ( SELECT {0} From ( " +
                    "SELECT Count(*) {0},{1} from ( {4} )pip group by {1} ) " +
                    " ahh where {1} in ({3}",//),0))",
                    CountIdentifier,
                    convertIdentifier(dvd.ConnectMasterPorp),
                    convertIdentifier(Information.GetClassStorageName(dvd.View.DefineClassType)),
                    convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[0]),
                    //convertIdentifier(dvd.OwnerConnectProp),
                    Slct);
                for (int k = 1; k < dvd.OwnerConnectProp.Length; k++)
                {
                    res += "," + convertIdentifier("STORMGENERATEDQUERY") + "." + convertIdentifier(dvd.OwnerConnectProp[k]);
                }
                res += ")),0))";

                langDef.retVars = prevRetVars;
                return(res);
            }

            if (value.FunctionDef.StringedView == langDef.funcToUpper)
            {
                return(string.Format(
                           "Upper({0})",
                           langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcToLower)
            {
                return(string.Format(
                           "Lower({0})",
                           langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcDateAdd)
            {
                return(string.Format(
                           "dateadd({0}, {1}, {2})",
                           langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                           langDef.SQLTranslSwitch(value.Parameters[1], convertValue, convertIdentifier),
                           langDef.SQLTranslSwitch(value.Parameters[2], convertValue, convertIdentifier)));
            }

            if (value.FunctionDef.StringedView == langDef.funcToChar)
            {
                // Общее преобразование в строку, задается значение и длина строки
                if (value.Parameters.Count == 2)
                {
                    return(string.Format(
                               "CONVERT(VARCHAR({1}), {0})",
                               langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                               value.Parameters[1]));
                }

                // Преобразование даты и времени в строку; кроме значения, числом задается стиль
                // даты-времени, например, 104 (dd.mm.yyyy).
                // Стили перечислены здесь: http://msdn.microsoft.com/ru-ru/library/ms187928.aspx
                if (value.Parameters.Count == 3)
                {
                    return(string.Format(
                               "CONVERT(VARCHAR({1}), {0}, {2})",
                               langDef.SQLTranslSwitch(value.Parameters[0], convertValue, convertIdentifier),
                               value.Parameters[1],
                               value.Parameters[2]));
                }
            }
            return(string.Empty);
        }
Exemple #29
0
        // *** Start programmer edit section *** (ПроверкаНаличияТоваров CustomMembers)

        // *** End programmer edit section *** (ПроверкаНаличияТоваров CustomMembers)


        // *** Start programmer edit section *** (OnUpdateЗаказ CustomAttributes)

        // *** End programmer edit section *** (OnUpdateЗаказ CustomAttributes)
        public virtual ICSSoft.STORMNET.DataObject[] OnUpdateЗаказ(АСУ_Склад.Заказ UpdatedObject)
        {
            // *** Start programmer edit section *** (OnUpdateЗаказ)

            // Определим массив, который будем возвращать для обновления.
            DataObject[] ret = new DataObject[0];

            // Проверим  на  то,  что  пришедший  объект  -  это	именно то, что нам нужно (создан или изменён и статус установлен в Оплачено).
            if ((UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Created || UpdatedObject.GetStatus() == ICSSoft.STORMNET.ObjectStatus.Altered) && Array.IndexOf(UpdatedObject.GetAlteredPropertyNames(), "Статус") >= 0 && UpdatedObject.Статус == Состояние_Заказа.Оплаченный)
            {
                // Построим ограничение и вычитаем все объекты ТоварНаСкладе, которые нам подходят.
                Заказ заказ = UpdatedObject;
                SQLWhereLanguageDef langdef = SQLWhereLanguageDef.LanguageDef;
                ICSSoft.STORMNET.FunctionalLanguage.Function lf = null;

                for (int i = 0; i < заказ.Строка_Заказа.Count; i++)
                {
                    if (lf != null)
                    {
                        if (заказ.Строка_Заказа[i].Товар != null)
                        {
                            lf = langdef.GetFunction(langdef.funcOR, lf, langdef.GetFunction(langdef.funcEQ,
                                                                                             new VariableDef(langdef.GuidType, "Товар"),
                                                                                             заказ.Строка_Заказа[i].Товар.__PrimaryKey));
                        }
                    }

                    else
                    {
                        if (заказ.Строка_Заказа[i].Товар != null)
                        {
                            lf = langdef.GetFunction(langdef.funcEQ,
                                                     new VariableDef(langdef.GuidType, "Товар"),
                                                     заказ.Строка_Заказа[i].Товар.__PrimaryKey);
                        }
                    }
                }

                ICSSoft.STORMNET.Business.LoadingCustomizationStruct lcs = ICSSoft.STORMNET.Business.LoadingCustomizationStruct.GetSimpleStruct(typeof(Товар_на_Складе), "ТоварНаСкладеE");
                lcs.LimitFunction = lf;
                ICSSoft.STORMNET.DataObject[] objs = ICSSoft.STORMNET.Business.DataServiceProvider.DataService.LoadObjects(lcs);

                // Разместим вычитанные объекты в отсортированном списке для удобного доступа в дальнейшем.
                System.Collections.SortedList sl = new System.Collections.SortedList();

                //for (int i = 0; i < objs.Length; i++)
                //{
                //    if (sl.ContainsKey(((Товар_на_Складе)objs[i]).Товар.__PrimaryKey))
                //    {
                //        ((System.Collections.ArrayList)sl[objs[i].__PrimaryKey]).Add(objs[i]);
                //    }
                //    else
                //    {
                //        System.Collections.ArrayList списокТоваров = new System.Collections.ArrayList();
                //        списокТоваров.Add(objs[i]);
                //        sl.Add(((Товар_на_Складе)objs[i]).Товар.__PrimaryKey, списокТоваров);
                //    }
                //}

                // Определим строчку для сообщения об ошибке.
                string    errStr  = string.Empty;
                ArrayList retObjs = new ArrayList();

                // Проверим наличие товара на складах, если не хватает, то выдадим сообщение об ошибке, если хватает, то вычитаем количество.
                for (int i = 0; i < заказ.Строка_Заказа.Count; i++)
                {
                    if (sl.ContainsKey(заказ.Строка_Заказа[i].Товар.__PrimaryKey))
                    {
                        ArrayList arl = ((System.Collections.ArrayList)sl[заказ.Строка_Заказа[i].Товар.__PrimaryKey]);

                        int количествоНаСкладах = 0; for (int j = 0; j < arl.Count; j++)
                        {
                            количествоНаСкладах +=
                                ((Товар_на_Складе)arl[j]).Количество;
                        }

                        if (количествоНаСкладах <
                            заказ.Строка_Заказа[i].Количество)
                        {
                            errStr += " Не хватает товара \"" + заказ.Строка_Заказа[i].Товар.Название + "\" в наличии: " + количествоНаСкладах + ", требуется " + заказ.Строка_Заказа[i].Количество + Environment.NewLine;
                        }
                        else
                        {
                            int колич = заказ.Строка_Заказа[i].Количество;
                            for (int j = 0; j < arl.Count; j++)
                            {
                                if (колич > 0 &&
                                    ((Товар_на_Складе)arl[j]).Количество > колич)
                                {
                                    ((Товар_на_Складе)arl[j]).Количество -= колич;
                                    колич = 0; retObjs.Add(arl[j]);
                                }
                                else
                                {
                                    if (колич > 0)
                                    {
                                        колич -= ((Товар_на_Складе)arl[j]).Количество;
                                        ((Товар_на_Складе)arl[j]).Количество = 0;
                                        retObjs.Add(arl[j]);
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        errStr += "Товар	\""+
                                  заказ.Строка_Заказа[i].Товар.Название + "\" в наличии отсутствует." + Environment.NewLine;
                    }
                }

                // В случае, если чего-то не хватило, сообщаем об этом пользователю.
                if (errStr != string.Empty)
                {
                    throw new Exception(errStr);
                }

                // Если всё нормально, то возвращаем массив объектов, которые надо обновить.
                ret = new DataObject[retObjs.Count]; retObjs.CopyTo(ret, 0);
            }
            return(ret);

            // *** End programmer edit section *** (OnUpdateЗаказ)
        }
        // *** Start programmer edit section *** (ЗаказBS CustomMembers)

        // *** End programmer edit section *** (ЗаказBS CustomMembers)


        // *** Start programmer edit section *** (OnUpdateЗаказ CustomAttributes)

        // *** End programmer edit section *** (OnUpdateЗаказ CustomAttributes)
        public virtual ICSSoft.STORMNET.DataObject[] OnUpdateЗаказ(IIS.АСУ_Кондитерская.Заказ UpdatedObject)
        {
            // *** Start programmer edit section *** (OnUpdateЗаказ)
            if (UpdatedObject.IsAlteredProperty("Состояние") && UpdatedObject.Состояние == СостояниеЗаказа.Выполненный)
            {
                // 1) проверить, достаточно ли на складе продуктов для отправки в торговую точку
                // 2) в случае успеха создать объекты ПродуктНаПродажу в торговой точке
                //    и осуществить декрементацию продуктов на складе
                // 3) заблокировать изменение статуса

                // ------------------------- ПРОВЕРКА -----------------------------
                IDataService        ds  = DataService;
                var                 lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(СтрокаЗаказа), "СтрокаЗаказаE");
                SQLWhereLanguageDef ld  = SQLWhereLanguageDef.LanguageDef;
                lcs.LimitFunction = ld.GetFunction(ld.funcEQ,
                                                   new VariableDef(ld.GuidType, Information.ExtractPropertyPath <СтрокаЗаказа>(x => x.Заказ)), UpdatedObject.__PrimaryKey);
                var order_points = ds.LoadObjects(lcs);

                foreach (var point in order_points)
                {
                    var product_key = ((СтрокаЗаказа)point).Продукт.__PrimaryKey;

                    // Загружаем требуемые продукты, которые хранятся на складе в цехе
                    var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(ГотовыйПродукт), "ГотовыйПродуктE");
                    lcs2.LimitFunction = ld.GetFunction(ld.funcEQ,
                                                        new VariableDef(ld.GuidType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.Продукт)), product_key);
                    var complete_products = ds.LoadObjects(lcs2);

                    // Посчитаем, сколько готовых продуктов (с разной датой изготовления) содержится на складе
                    int total_count = 0;
                    foreach (var comp_prod in complete_products)
                    {
                        total_count += ((ГотовыйПродукт)comp_prod).НаСкладе;
                    }

                    // Если продукции меньше, чем требуется в заказе, то кидаем исключение
                    if (total_count < ((СтрокаЗаказа)point).Количество)
                    {
                        throw new Exception(((СтрокаЗаказа)point).Продукт.Наименование.ToString() + ". На складе - " + total_count.ToString() + ". Требуется - " +
                                            ((СтрокаЗаказа)point).Количество.ToString() + ". Перевод заказа в статус \"Выполненный\" невозможно.");
                    }
                }
                // ------------------------- ПРОВЕРКА ЗАВЕРШЕНА -----------------------------

                // --------------------- ОТПРАВКА ПРОДУКТОВ В ТОРГОВУЮ ТОЧКУ -----------------
                List <DataObject> forupdate = new List <DataObject>();
                foreach (var point in order_points)
                {
                    var product_key = ((СтрокаЗаказа)point).Продукт.__PrimaryKey;

                    // Загружаем требуемые продукты, которые хранятся на складе в цехе
                    var lcs2 = LoadingCustomizationStruct.GetSimpleStruct(typeof(ГотовыйПродукт), "ГотовыйПродуктE");
                    lcs2.LimitFunction = ld.GetFunction(ld.funcAND,
                                                        ld.GetFunction(ld.funcEQ,
                                                                       new VariableDef(ld.GuidType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.Продукт)), product_key),
                                                        ld.GetFunction(ld.funcNEQ,
                                                                       new VariableDef(ld.NumericType, Information.ExtractPropertyPath <ГотовыйПродукт>(x => x.НаСкладе)), 0));
                    var complete_products = ds.LoadObjects(lcs2);

                    // Отсортируем все продукты по дате изготовления и будем отправлять по мере "старения" продуктов
                    Array.Sort(complete_products);
                    int req_count = ((СтрокаЗаказа)point).Количество;   // требуемое в заказе количество продукта
                    int i         = 0;                                  // счетчик продукта в списке
                    while (req_count != 0)
                    {
                        int sklad_count = ((ГотовыйПродукт)complete_products[i]).НаСкладе;
                        if (req_count <= sklad_count)
                        {
                            // Создаем детейл для торговой точки
                            var sale_product = new ПродуктНаПродажу()
                            {
                                ДатаИзг       = ((ГотовыйПродукт)complete_products[i]).ДатаИзг,
                                Поступило     = req_count,
                                Осталось      = req_count,
                                ТорговаяТочка = UpdatedObject.ТорговаяТочка,
                                Продукт       = ((СтрокаЗаказа)point).Продукт
                            };
                            sale_product.SetStatus(ObjectStatus.Created);

                            // Обновляем инф-цию на складе
                            ((ГотовыйПродукт)complete_products[i]).НаСкладе -= req_count;
                            complete_products[i].SetStatus(ObjectStatus.Altered);

                            req_count = 0;
                            forupdate.Add(sale_product);
                            forupdate.Add(((ГотовыйПродукт)complete_products[i]));
                        }
                        else // (req_count > sklad_count)
                        {
                            // Создаем детейл для торговой точки
                            var sale_product = new ПродуктНаПродажу()
                            {
                                ДатаИзг       = ((ГотовыйПродукт)complete_products[i]).ДатаИзг,
                                Поступило     = sklad_count,
                                Осталось      = sklad_count,
                                ТорговаяТочка = UpdatedObject.ТорговаяТочка,
                                Продукт       = ((СтрокаЗаказа)point).Продукт
                            };
                            sale_product.SetStatus(ObjectStatus.Created);

                            // Обновляем инф-цию на складе
                            ((ГотовыйПродукт)complete_products[i]).НаСкладе = 0;
                            complete_products[i].SetStatus(ObjectStatus.Altered);

                            req_count -= sklad_count;
                            forupdate.Add(sale_product);
                            forupdate.Add(((ГотовыйПродукт)complete_products[i]));
                        }
                        // Переходим к следующему продукту (более свежему)
                        i++;
                    }
                }
                // --------------------- ПРОДУКТЫ ОТПРАВЛЕНЫ В ТОРГОВУЮ ТОЧКУ -----------------
                UpdatedObject.ДатаПоступления = DateTime.Now;
                return(forupdate.ToArray());
            }
            return(new ICSSoft.STORMNET.DataObject[0]);
            // *** End programmer edit section *** (OnUpdateЗаказ)
        }