/// <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(); }
/// <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; } }
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); }
public void FunctionalLanguageDefGetObjectTypeForNetType1Test() { FunctionalLanguageDef langDef = new SQLWhereLanguageDef(); var result = langDef.GetObjectTypeForNetType(typeof(DetailArray)); Assert.Null(result); }
public void FunctionalLanguageDefGetObjectTypeForNetTypeTest() { FunctionalLanguageDef langDef = new SQLWhereLanguageDef(); var result = langDef.GetObjectTypeForNetType(typeof(System.Decimal)); Assert.Equal(result.NetCompatibilityType.Name, "Decimal"); }
/// <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")); }
public void FunctionalLanguageDefGetFunctionExceptionTest() { var exception = Xunit.Record.Exception(() => { FunctionalLanguageDef langDef = new SQLWhereLanguageDef(); var result = langDef.GetFunction("functionString"); }); Assert.IsType(typeof(FunctionalLanguageDef.NotFoundFunctionBySignatureException), exception); }
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); }
public void FunctionalLanguageDefGetFunctionDefExceptionTest() { var exception = Xunit.Record.Exception(() => { FunctionalLanguageDef langDef = new SQLWhereLanguageDef(); // Вызов функции с несуществующим идентификатором. langDef.GetFunctionDef(0); }); Assert.IsType(typeof(Exception), exception); }
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); }
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); }
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)); }
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); }
// *** 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); }
/// <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); }
// *** 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Заказ) }