Версия 7.9.2.2410
Нужно сделать несколько похожих запросов выбора контакта и если какой то вернет ID запустить БП.
Как я понял запросы можно сделать и в БП.
Вот пример запроса:
Выбрать контакта у которого поле1 > значение1
и есть активности где активность.поле1 = значение2
Много запросов я не строил но документации есть полно.
Решил строить и выполнять запрос при нажатии на кнопку,
rootSchemaName: "Contact"});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Id");
var exists = this.Terrasoft.createExistsFilter("[Activity:Contact].Name");
esq.filters.addItem(exists);
для проверки Запроса должна работать функция esq.GetSelectQuery(), но выдает - esq.getSelectQuery is not a function
будет 4-8 запросов, меняться будет только значение1 и значение2
Нравится
Добрый день, Виталий!
К сожалению, GetSelectQuery - это серверная функция, вызвать ее можно только в C# коде. На клиентской стороне получить текст запроса в данный момент нельзя.
"Мотков Илья" написал:К сожалению, GetSelectQuery - это серверная функция, вызвать ее можно только в C# коде.
Подозревал это, а как продебажить код С# в БП?
"Мотков Илья" написал:Используйте метод executeQuery.
Примера я не нашел нигде, ни здесь ни в гугле не нашел примеров и через отладчик.
Делаю через БП, будет 1 запрос, остальное кодом переберу, проблема в добавлении дополнительных фильтров, вот что сейчас есть:
UserConnection userConnection = Get<UserConnection>("UserConnection"); var esqContact = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact"); esqContact.AddColumn("Name"); var exists = esqContact.CreateExistsFilter("[Activity:Contact:Id].Id"); var subQueryFilters = new EntitySchemaQueryFilterCollection(esqContact, LogicalOperationStrict.Or); subQueryFilters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "Result", "b85afbbc-8c0b-472a-8808-680911ceec75")); exists.SubFilters.AddItem(subQueryFilters); esqContact.Filters.Add(exists); var esqOptions = new EntitySchemaQueryOptions() { PageableDirection = PageableSelectDirection.First, PageableRowCount = 1, PageableConditionValues = new Dictionary<string, object>() }; var Contact = esqContact.GetEntityCollection(userConnection, esqOptions); Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "CreateActivityForContact", esqContact.GetSelectQuery(userConnection).GetSqlText()); return true;
ошибку выбивает на .SubFilters.AddItem, но я видел примеры таких решений на комюнити и в академии
Решил, если написать так:
UserConnection userConnection = Get<UserConnection>("UserConnection"); var esqContact = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact"); esqContact.AddColumn("Name"); var GroupFilters = new EntitySchemaQueryFilterCollection(esqContact, LogicalOperationStrict.Or); GroupFilters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "[Activity:Contact:Id].Result", "b85afbbc-8c0b-472a-8808-680911ceec75")); GroupFilters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "[Activity:Contact:Id].Result", "6e6b0240-dd96-4db7-b549-2d4c468ae035")); GroupFilters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "[Activity:Contact:Id].Result", "2394c81b-cad7-4bd0-9404-4b72772a8f83")); GroupFilters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "[Activity:Contact:Id].Result", "608a810c-396d-49fd-851b-9e7f39b9dbf7")); GroupFilters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "[Activity:Contact:Id].Result", "c73d5e1f-978c-4f62-9a3f-80d24a5d389d")); esqContact.Filters.Add(GroupFilters); var Contact = esqContact.GetEntityCollection(userConnection); Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, "CreateActivityForContact", esqContact.GetSelectQuery(userConnection).GetSqlText()); return true;
то получится это:
SELECT [Contact].[Name] [Name] FROM [dbo].[Contact] [Contact] WITH(NOLOCK) WHERE EXISTS ( SELECT [Activity].[Id] [Id] FROM [dbo].[Activity] [Activity] WITH(NOLOCK) WHERE [Contact].[Id] = [Activity].[ContactId] AND ([Activity].[ResultId] = @P1 OR [Activity].[ResultId] = @P2 OR [Activity].[ResultId] = @P3 OR [Activity].[ResultId] = @P4 OR [Activity].[ResultId] = @P5))
как объяснить ошибку?
если я прописал
var esqContact = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact"); esqContact.AddColumn("Name"); esqContact.AddColumn("Id"); .... foreach(var Contact in Contacts) { var Contact = Contact.GetTypedColumnValue<Guid>("Id"); } ....
другие поля нормально видит и выбирает
"Радчук Виталий Владимирович" написал:как объяснить ошибку
если я прописал
Приведите весь код, вероятно ошибка не в esqContact.AddColumn("Id");, а в моменте получения данных по этой колонке, и стоит использовать алиас. var contactIdColumnName = esqContact.AddColumn("Name");
и уже вот имя записанное тут contactIdColumnName использовать при получении.
"Радчук Виталий Владимирович" написал:как объяснить ошибку
если я прописал
Приведите весь код, вероятно ошибка не в esqContact.AddColumn("Id");, а в моменте получения данных по этой колонке, и стоит использовать алиас. var contactIdColumnName = esqContact.AddColumn("Name");
и уже вот имя записанное тут contactIdColumnName использовать при получении.
вот код
UserConnection userConnection = Get<UserConnection>("UserConnection"); var esqContact = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Contact"); esqContact.AddColumn("Name"); esqContact.AddColumn("Id"); var UsrCounterTOLLColumn = esqContact.AddColumn("UsrCounterTOLL"); UsrCounterTOLLColumn.OrderByAsc(1); var CreatedOnLColumn = esqContact.AddColumn("CreatedOn"); CreatedOnLColumn.OrderByAsc(2); esqContact.Filters.Add(esqContact.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrContactStage", "b9f5501f-d028-4547-b694-ea7c2dbf8006")); фильтры var Contacts = esqContact.GetEntityCollection(userConnection); foreach(var Contact in Contacts) { var contact = Contact.GetTypedColumnValue<Guid>("Id"); }
нужна именно айдишка для дальнейшего выполнения БП
все получилось:
var IdColumnName = esqContact.AddColumn("Id").Name; ... Set("Contact", Contact.GetTypedColumnValue<string>(IdColumnName));