Примеры использования VariableDef и DetailVariableDef

При построении ограничений с помощью метода GetFunction параметром этому методу в зависимости от типа применяемой функции может передаваться описание переменной:

  • при задании ограничения с помощью SQLWhereLanguageDef используется класс VariableDef,
  • при наложении ограничения на детейл с помощью ExternalLangDef для описания переменной-детейла применяется класс DetailVariableDef.

VariableDef

Класс VariableDef служит для определения переменной в ограничении (обычно указывает на атрибут в объекте). Используется вместе с SQLWhereLanguageDef.

Определен в пространстве имен: ICSSoft.STORMNET.FunctionalLanguage.

Сборка: ICSSoft.STORMNET.FunctionalLanguage.dll.

Самый распространённый конструктор, который используется при построении ограничений:

public VariableDef(ObjectType objType, string objStringedView)

Ему передаются параметры:

  • objType - ObjectType-тип переменной (например, langdef.StringType),
  • objStringedView - имя свойства объекта, по которому планируется ограничение.

Примеры конструирования VariableDef при задании ограничений доступны в статье SQLWhereLanguageDef.

VariableDef для PrimaryKey

При построении ограничений на первичные ключи вычитываемых объектов (собственные ключи) стоит учитывать, что SQLWhereLanguageDef не обрабатывает константу PrimaryKey. Вместо константы PrimaryKey лучше использовать StormMainObjectKey (определена соответствующая константа).

Неверно:

var ld = SQLWhereLanguageDef.LanguageDef;
ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, "PrimaryKey"), "64F45BC3-339B-4FBA-A036-C5E9FE9EAE53");

Верно:

var ld = SQLWhereLanguageDef.LanguageDef;
ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, SQLWhereLanguageDef.StormMainObjectKey), "64F45BC3-339B-4FBA-A036-C5E9FE9EAE53");

Стоит отметить, что ограничение на первичный ключ мастера накладывается следующим образом:

var ld = SQLWhereLanguageDef.LanguageDef;
ld.GetFunction(ld.funcEQ, new VariableDef(ld.GuidType, Information.ExtractPropertyPath<СамОбъект>(x => x.СсылкаНаМастера)), "84F456C1-312F-30C0-A238-11E3FE68E852");

где “СсылкаНаМастера” - ссылка на мастера.

DetailVariableDef

Класс DetailVariableDef служит для определения переменной ограничения, предназначенного для описания детейлов. Используется совместно с ExternalLangDef.

Определен в пространстве имен: ICSSoft.STORMNET.Windows.Forms. Сборка: ExternalLangDef.dll.

При конструировании DetailVariableDef следует задать параметры:

  • Type - ObjectType-тип (можно получить ldef.GetObjectType("Details")),
  • View - имя представления детейла,
  • ConnectMasterProp - путь от детейла (см. описание далее),
  • OwnerConnectProp - к детейлу от объекта (см. описание далее).

Примеры конструирования DetailVariableDef при задании ограничений доступны в статьях:

Задание OwnerConnectProp и ConnectMasterProp

Часто возникают сложности при определении, что указывать в качестве ConnectMasterProp и OwnerConnectProp.

ConnectMasterProp указывается путь от детейла, а в OwnerConnectProp - к детейлу от объекта.

Связка происходит следующим образом: Детейл.ConnectMasterProp = Объект.OwnerConnectProp.

Cтоит отметить, что свойство OwnerConnectProp определяет, к какому объекту относятся детейлы. Если свойство не указано (т.е. указан null), то связка происходит по первичному ключу(т.е. по StormMainObjectKey).

Примеры использования

Пример1

Необходимо отфильтровать УдостоверяющиеДокументы для ЗаявленияАбитуриента. При задании DetailVariableDef следует указать: OwnerConnectProp = Личность, ConnectMasterProp = Личность.

Пример2

Необходимо отфильтровать ОбразовательныеДокументы для СтрокиРекомендательногоСписка. При задании DetailVariableDef следует указать: OwnerConnectProp = ЗаявлениеАбитуриента.Личность, ConnectMasterProp = Личность.

Необходимо отфильтровать ОбразовательныеДокументы для СтрокиРекомендательногоСписка. При задании DetailVariableDef следует указать: OwnerConnectProp = ЗаявлениеАбитуриента.Личность, ConnectMasterProp = Личность.

Задание ограничений на псевдодетейлы

Например, сущности “Клиент” и “Кредит” связаны представленным на изображении образом.

Нужно ограничить клиентов, задав при этом ограничение на ссылающихся на них кредиты.

Очевидно, что с точки зрения хранения данной объектной модели в БД в соответствии с существующими правилами, нет различия между агрегацией и простой ассоциацией. Поэтому запросы, ограничивающие выборку по критериям из дочерней таблицы, не отличаются в случае агрегации и ассоциации. Следовательно для построения ограничения в случае всевдодетейла необходимо использовать DetailVariableDef совместно с ExternalLangDef.

Если в описанном примере надо выбрать клиентов, у которых есть кредиты на срок более 15 лет, код будет выглядеть следующим образом:

ExternalLangDef ldef = ExternalLangDef.LanguageDef;
LoadingCustomizationStruct lcsДолгосрочныеКлиенты = LoadingCustomizationStruct.GetSimpleStruct(typeof(Клиент), "КлиентE");
lcsДолгосрочныеКлиенты.LoadingTypes = new[) { typeof(Клиент) };
var view = Information.GetView("КредитE", typeof(Кредит));
var dvd = new DetailVariableDef
{
    ConnectMasterPorp = "Клиент",
    OwnerConnectProp = new[) { SQLWhereLanguageDef.StormMainObjectKey },
    View = view,
    Type = ldef.GetObjectType("Details")
};
lcsДолгосрочныеКлиенты.LimitFunction = ldef.GetFunction(ldef.funcExist, dvd,
                                                        ldef.GetFunction(ldef.funcGEQ, 
                                                        new VariableDef(ldef.GuidType, "СрокКредита"), 15));
ICSSoft.STORMNET.DataObject[) dobjsДолгосрочныеКлиенты = DataServiceProvider.DataService.LoadObjects(lcsДолгосрочныеКлиенты);