В процессе, в рамках одного "Задания-Сценария" идет цикл по строкам (продуктам).
По логике, в этом цикле идет запрос в другую сущность, и если ничего не возвращает, делает новую строку в той сущности.
Если находит, то делает апдейт найденной строки.

Вопрос: Если в списке строк попадутся обе ситуации, и при первом проходе будет создана нужная запись, то при втором проходе запрос ее не возвращает - это потому что entity.Save реально в базу изменения внесет только после окончания сценария, или даже всего процесса?
Или нужно просто ввести временной лаг после добавления записи, чтобы успела система все сохранить?

Нравится

1 комментарий

Здравствуйте!
Необходимо на странице портального обращения получить некоторые значения, например, Email из справочника контактов для контакта, который указан в поле Контакт. Пишу следующий код:

var contact1 = this.get("Contact");
var contactId = contact1.value;
var esqContact = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Contact"
});
esqContact.addColumn("Email");
esqContact.getEntity(contactId, function(result) {
if (result.entity) {
var ContactEmail = result.entity.get("Email");
this.set("ContactInfo", ContactEmail);
}
}, this);

contactId заполняется правильным Id, но в результате все время получаю result.entity равным null. Причем, result.success равен true.

Подскажите, пожалуйста, что может быть не так?

Нравится

4 комментария

Добрый день, Наталья, я попробовал Ваш код у себя, и могу констатировать, что он вполне рабочий, единственное что менял, это поле вывода, в которое выводил полученный емейл, и поле из которого получал контакт, так что вероятно проблема в них...

Александр,
спасибо за помощь.
Я смотрела под отладчиком, Id берется правильный. До записи в поле дело вообще не доходит, т.к. result.entity равна null.
А Вы тестировали на какой странице?

Александр,
спасибо за участие. Ларчик просто открывался: у пользователя нет прав на контакты.

В разделе "объекты" брал Responsible, как поле со справочником контакты. Насколько я знаю, EntitySchemaQuery выполняет обработку накладывая существующие права. Может быть проблема в правах доступа?

Показать все комментарии

У класса EntitySchema есть метод GetPrimaryColumnName. В SDK, его описание состоит только из одной строчки: "Возвращает имя первичной колонки данной схемы на уровне базы данных.". Т.е., другими словами, этот метод возвращает имя колонки первичного ключа таблицы?

Нравится

7 комментариев

Евгений, первичный ключ - это значение, а GetPrimaryColumnName возвращает название колонки.
Первичной колонкой может быть любая колонка (например, «Name» или «Code»).

Т.е. первая колонка в перечне колонок объекта?

Первичная колонка в объекте. В основном это "Name".
Но первичную колонку объекта может менять на другую любую. Но тех. поддержка не рекомендует, так как на первичную колонку завязана базовая логика.

Вот, например, если взять объект Contact. У него есть поле (колонка) Name, вот она и является первичной колонкой объекта?

Евгений, совершенно верно.

Евгений, совершенно верно.

Хорошо, спасибо.

Показать все комментарии

Здравствуйте.
Я не так давно работаю в BPMonline. Хочу узнать поподробнее - что делает и зачем нужно свойство EntityShemaManager из класса EntitySchemaQuery?

Нравится

1 комментарий

Евгений, про EntityShemaManager Вы можете ознакомиться по следующей ссылке:

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/Terrasoft…

Информацию про классы и про разработку в целом детально описано на SDK.

Показать все комментарии

В SDK bpm'online дополнен раздел "Основные сведения для разработки".
Заходите на сайт Terrasoft Academy в раздел "Документация SDK" и узнайте в чем суть механизма замещения клиентских модулей, а также как

Статьи расположены в разделе "Основные сведения для разработки".

Нравится

Поделиться

0 комментариев
Показать все комментарии

Потрібно створити фільтр, який би гарантував пусту вибірку.
Я собі так уявляю, що фільтр має реалізовувати умову типу 0=1.
Але всі методи на створення фільтрів так чи інакше одним з атрибутів мають поле.

Як правильно реалізувати фільтр ?

Нравится

3 комментария

Может, такое сработает?

esq.CreateIsNullFilter("Id");

А [Id] ні за яких умов не стане Guid.Empty() ?

Оно же первичный ключ. Кроме того, фильтр проверяет не Guid.Empty (из нулей), а Null.

Показать все комментарии

Добрый день,
Необходимо добавлять лида после появления активности. Добавил событийный подпроцесс "после добавления записи" в объект "Активность", добавил подпроцесс и стартовое сообщение
1
Собственно вопросы:
- Как в коде обратиться к значениям колонок добавленной записи? что то вроде this.Entity.GetTypedColumnValue("Title"); ?
- Как используя EntitySchemaQuery добавить запись в таблицу лидов? На sdk примеры использования только на выборку, а на форуме находится только добавление через insert или же примеры использования выборки

Нравится

2 комментария

1.

Entity.GetTypedColumnValue<string>("Title");  

2. Добавление ESQ

EntitySchema schema = UserConnection.EntitySchemaManager.GetInstanceByName("Lead");
Entity entity = schema.CreateEntity(UserConnection);
entity.SetDefColumnValues();
entity.SetColumnValue("LeadName", "Новый лид");
entity.Save();

Большое спасибо :smile:

Показать все комментарии

А возможно ли в EntitySchemaQuery использовать order?

Нравится

2 комментария

Здравствуйте, Екатерина!

Можно.

Пример ниже:

var NameField = wordTemplatesESQ.AddColumn("Name"); //добавляем колонку в запрос и одновременно получаем ее экземпляр
NameField.OrderDirection = OrderDirection.Ascending;
NameField.OrderPosition = 1; 

Спасибо Вам огромное!

Показать все комментарии

Добрый день!
BPM 7.1
у меня возникла проблема написать, вроде на первый взгляд не сложная, простой фильтр котрорый должен срабатывать при открытии Lookup.

type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
name: 'UsrPlanningPrice',
columnPath: 'UsrPlanningPrice',   //справочник, таблица [UsrCropInPlanning]
dataValueType: Terrasoft.DataValueType.LOOKUP,
visible: true,
filter: function() {
        var purchaseDate = this.get('UsrDate');
        if (!Ext.isEmpty(purchaseDate)) {

                var subSelect = Ext.create('Terrasoft.EntitySchemaQuery', {
                        rootSchemaName: 'UsrPlanning',
                        rowCount: 1
                });

                subSelect.addColumn('Id');
               
                subSelect.filters.add("TypeFilter",
                        subSelect.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.EQUAL,
                        'UsrType',
                        '1CC0703B-FA0D-4711-A1E4-14DEFA3C19EA')); //const
                               
                subSelect.filters.add("DateFilter",
                        subSelect.createColumnFilterWithParameter(
                        Terrasoft.ComparisonType.LESS_OR_EQUAL,
                        'UsrDate',
                        purchaseDate));

                return Terrasoft.createCompareFilter(
                        Terrasoft.ComparisonType.EQUAL,
                        'UsrPlanning',
                        subSelect);
        }
}

в результате хочу:

SELECT TOP 15 [UsrCropInPlanning].[Id] [Id]
        ,[UsrCropInPlanning].[UsrName] [UsrName]
FROM [dbo].[UsrCropInPlanning] [UsrCropInPlanning]
WHERE [UsrCropInPlanning].[UsrPlanningId] = (SELECT
        TOP 1 [Id]
        FROM [dbo].[UsrPlanning]
        WHERE UsrTypeId = @P1 AND [UsrPlanning].[UsrDate] = @P2)

то есть мне нужно отобрать в таблице поля справочника UsrPlanningPrice только те записи которые относяться к одному "планированию" выбраному по указаной дате.

прошу помочь, либо сказать как такое можно реализовать?
спасибо.

Нравится

5 комментариев

Добрый день!

Воспользуйтесь бизнес-правилом с типом "Фильтрация". Ниже пример из документации.

{
    type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE,
    name: 'Contact',
    columnPath: 'Contact',
    dataValueType: Terrasoft.DataValueType.ENUM,
    visible: true,
    rules: [{
        //Указываем тип правила
        ruleType: BusinessRuleModule.enums.RuleType.FILTRATION,
        //Указываем будет ли обратное автозаполнение
        autocomplete: true, 
        //Указываем мета-путь относительно базового обьекта('Contact')
        //по которому будем фильтровать
        baseAttributePatch: 'Account',
        //Указываем тип фильтрации
        comparisonType: Terrasoft.ComparisonType.EQUAL,
        //Указываем тип значения для фильтрации
        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
        //Указываем атрибут модели для сравнения (если тип значения - атрибут) 
        attribute: 'Account',
        //Указываем мета-путь значения в выбранном атрибуте (если нужно)
        attributePath: '',
        //Если тип значения не атрибут, указываем значение 
        //(константа | имя системной настройки | имя системного значения)
        value: ''
    }]
}

Дмитрий, спасибо за предоставленный пример.

у моего случая есть одна особенность, записей в таблице может не быть за указаное число и нужно брать первый что был до указаной даты, для этого я и написал условия "TOP 1" и "<=":

SELECT TOP 1 
	[Id]
FROM [dbo].[UsrPlanning]
WHERE UsrTypeId = @P1
	AND [UsrPlanning].[UsrDate] <= @P2

Владимир, здравствуйте.

Попробую уточнить возможна ли такая реализация и сообщу Вам результат завтра в этой теме в течении дня.

Дмитрий, сообщите пожалуйста что удалось выяснить по данному вопросу.

С уважением,
Владимир Саварин
Айти-Сфера

Владимир, здравствуйте. С фильтрацией по типу и по дате проблем нет (можно указать два и более бизнес правила фильтрации), а вот вызвать топ(1), к сожалению, не выйдет. Возможно следует наложить дополнительные фильтры? Если они значения не имеют, тогда без разницы что выберет пользователь с этого набора.

Показать все комментарии

При задании колонки или фильтра в EntitySchemaQuery можно указать тип соединения который будет использоваться. По умолчанию LEFT OUTER JOIN

Пример:

var esq = new EntitySchemaQuery(EntitySchemaManager, "City");
esq.AddColumn("Country.Name");
esq.AddColumn("=Country.Name");
esq.AddColumn(">Country.);
var filter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, ">Region.Name", "SomeRegion");
esq.Filters.Add(filter);

Получаем запрос(как пример для Oracle):

SELECT
  "Country"."Name" "Country.Name",
  "Country1"."Name" "Country1.Name",
  "Country2"."Name" "Country2.Name",
  "Contact"."Name" "Contact.Name"
FROM  "City"
  LEFT OUTER JOIN "Country" "Country" ON ("Country"."Id" = "City"."CountryId")
  INNER JOIN "Country" "Country1" ON ("Country1"."Id" = "City"."CountryId")
  LEFT OUTER JOIN "Country" "Country2" ON ("Country2"."Id" = "City"."CountryId")
    RIGTH OUTER JOIN "Contact" "Contact" ON ("Contact"."Id" = "Country2"."CreatedById")
  FULL OUTER JOIN "Region" "Region" ON ("Region"."Id" = "City"."RegionId")
WHERE
  "Region"."Name" = :P1

Полный список поддерживаемых типов соединений и их коды:

InnerJoinSpecSymbol = "=";
LeftJoinSpecSymbol = ">";
RightJoinSpecSymbol = "";
FullJoinSpecSymbol = ">";
CrossJoinSpecSymbol = "*";

Нравится

Поделиться

1 комментарий