Построение запросов к БД

Версия 7.9.2.2410
Нужно сделать несколько похожих запросов выбора контакта и если какой то вернет ID запустить БП.
Как я понял запросы можно сделать и в БП.
Вот пример запроса:
Выбрать контакта у которого поле1 > значение1
и есть активности где активность.поле1 = значение2
Много запросов я не строил но документации есть полно.
Решил строить и выполнять запрос при нажатии на кнопку,

var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
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

Нравится

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

Добрый день, Виталий!

К сожалению, GetSelectQuery - это серверная функция, вызвать ее можно только в C# коде. На клиентской стороне получить текст запроса в данный момент нельзя.

Используйте метод executeQuery.

"Мотков Илья" написал:К сожалению, 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));
Показать все комментарии