var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "EDOSystem");
var edoSystemIdColumn = esq.AddColumn("Id");
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Name", "SomeVAlue"));
Как можно сделать подобный фильтр по колонке Name без учитывания регистра?

 

Нравится

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

А найти записи по другому условию не выйдет?
Там же не одно поле, может есть какие то связи вввиде справочников . которые на странице
 

 

Ну стандартного типа я не нашел для сравнения без регистра, но наверное вы можеет создать группу фильтров

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "qrtEventAddRule"
});
esq.addColumn("qrtEventShipping.Id", "idEvent");
 
 
 
var filterGroup1 = Ext.create("Terrasoft.FilterGroup");
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Name", value);
filterGroup1.add("qrtIsInsuranceTrue", esqSecondFilter);
 
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "qrtService", value.toLowerCase());
filterGroup2.add("esqFirstFilter", esqFirstFilter);	
filterGroup2.logicalOperation = Terrasoft.LogicalOperatorType.OR;
 
esq.filters.add("1",filterGroup1);
}

Я не уверен но можно посмотреть также в сторону CONTAINS. он может без регистра сравнивает

 

самый извращенный и долгий вариант это написать в теле выборки свой фильтр и пройтись по все записям
 

// Определение конфигурационного объекта.
				var config = {
					// Название схемы сущности.
					entitySchemaName: "Contact",
					// Убирать дубли в результирующем наборе данных.
					isDistinct: true
				};
				// Получение данных.
				Terrasoft.DataManager.select(config, function (collection) {
					// Сохранение полученных записей в локальное хранилище.
					collection.each(function (item) {
                       //тут пишешь свое условие
						//this.console.log(item.viewModel.values)//поля записи
						Terrasoft.DataManager.addItem(item);
					});
				}, this);

 

Показать все комментарии
using System;
using System.Collections.Generic;
using Terrasoft.Core;
using Terrasoft.Core.DB;
using Terrasoft.Core.Entities;
 
namespace Norbit.Crm.EsPlus.Common
{
    /// <summary>
    /// Методы расширения для ESQ.
    /// </summary>
    public static class EsqExtensions
    {
        /// <summary>
        /// Постраничное чтение ESQ запроса.
        /// </summary>
        /// <param name="esq">Запрос.</param>
        /// <param name="userConnection">Пользовательское подключение.</param>
        /// <param name="rowCount">Количество считываемых записей за один раз(по умолчанию 1000).</param>
        /// <returns>Коллекция объектов из запроса.</returns>
        public static List<Entity> GetEntityCollectionPaginatedReading(
            this EntitySchemaQuery esq,
            UserConnection userConnection,
            EntitySchemaQueryOptions options = null,
            int rowCount = 1000)
        {
            if (esq == null)
            {
                throw new ArgumentNullException(nameof(esq));
            }
 
            if (userConnection == null)
            {
                throw new ArgumentNullException(nameof(userConnection));
            }
 
            var entityCollection = new List<Entity>();
            esq.UseOffsetFetchPaging = true;                              /// Использовать постраничное чтение.
 
            var esqOptions = options ?? new EntitySchemaQueryOptions                     /// Настройки получения коллекции.
            {
                PageableRowCount = rowCount,                             /// Количество считываемых записей.
                RowsOffset = 0,                                          /// Количество записей, которые необходимо пропустить
                PageableDirection = PageableSelectDirection.Next,
                PageableConditionValues = new Dictionary<string, object>()
            };
 
            var entities = esq.GetEntityCollection(userConnection, esqOptions);
 
            while (entities.Count > 0)
            {
                foreach (var entity in entities)
                {
                    entityCollection.Add(entity);
                }
                esqOptions.RowsOffset += esqOptions.PageableRowCount;
                esq.ResetSelectQuery();                                     /// Обнуление результата запроса.
                entities = esq.GetEntityCollection(userConnection, esqOptions);
            }
 
            return entityCollection;
        }
 
    }
}

 

Нравится

Поделиться

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

Есть подозрение. что поможет 
PageableDirection = PageableSelectDirection.First  при первом запросе.
потом сменить на Next

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

Приветствую, коллеги. Фильтрацию по содержимому в поле, которое является типом массива байт, можно произвести например таким условием: 

where encode("InputArguments", 'escape') like '%identifierNo=cardnumber123%';

По той же логике пытался сделать фильтр через ESQ такого формата:

esq.Filters.Add(
    esq.CreateFilterWithParameters(
        FilterComparisonType.Contain,
        "InputArguments",
        Encoding.UTF8.GetBytes(inputArguments)
));

В результате получаю исключение:  "42883: function upper(bytea) does not exist". Есть ли обходные пути для реализации данного фильтра?

Нравится

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

Добрый день, Александр.
К сожалению, наше приложение не поддерживает фильтр Contain с типом данных "массив байт". Мы передадим данную проблему разработчикам приложения для исправления в будущих версиях.

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

Добрый день,  коллеги. Помогите пожалуйста сделать ESQ запрос с фильтрацией. Вывести 

TOP1 номер который соответсвует критерию. 

Читал статьи так и не понял.  Данный запрос в разделе контакты.

Select T1."Number" From  "ContactCommunication" T1

LEFT JOIN "Contact" T2 ON T1.Contact=T2.Id

Where T1.CommunicationType='3DDDB3CC-53EE-49C4-A71F-E9E257F59E49'

 

onEntityInitialized: function() {
        this.callParent(arguments);
        this.helping();
    },
    helping: function() {
     // Получаем [Id] объекта карточки.
      // Получаем [Id] объекта карточки.
var recordId = this.get("Id");
// Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "Contact"
});
esq.addColumn("[ContactCommunication:Contact:Id].Number", "Number");
esq.addColumn("[ContactCommunication:Contact:Id].CommunicationType", "CommunicationType");
var esqFirstFilter= esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "CommunicationType", "3DDDB3CC-53EE-49C4-A71F-E9E257F59E49");

// Добавление созданных фильтров в коллекцию запроса. 
esq.filters.add("esqFirstFilter", esqFirstFilter);

// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.
esq.getEntityCollection(function (result) {
    if (result.success) {
      result.collection.each(function (item) {
      this.showInformationDialog(result.entity.get("Number"));
        });
    }
}, this);
        }

Нравится

2 комментария
Лучший ответ

Вот мой пример по копированию всех адресов электронной почты контакта, по аналогии можно выбрать топ1 нужного типа

/** Копирование почты */
copyEmail: function() {
	if (this.get("Contact")) {
		var contact = this.get("Contact");
		contact = contact.value;
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "ContactCommunication"
		});
		var email = "";
		esq.addColumn("Contact");
		esq.addColumn("CommunicationType");
		esq.addColumn("Number");
		// Создание экземпляра первого фильтра.
		var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", contact);
		// Создание экземпляра второго фильтра.
		var esqSecondFilter =	esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"CommunicationType", "ee1c85c3-cfcb-df11-9b2a-001d60e938c6");
		// Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. 
		esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
		// Добавление созданных фильтров в коллекцию запроса. 
		esq.filters.add("esqFirstFilter", esqFirstFilter);
		esq.filters.add("esqSecondFilter", esqSecondFilter);
		// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.
		esq.getEntityCollection(function(result) {
			if (result.success) {
				result.collection.each(function(item) {
					// Обработка элементов коллекции.
					email = email + " " + this.get("Number");
				});
				this.set("UsrEmail", email);
			}
		}, this);
}

 

Вот мой пример по копированию всех адресов электронной почты контакта, по аналогии можно выбрать топ1 нужного типа

/** Копирование почты */
copyEmail: function() {
	if (this.get("Contact")) {
		var contact = this.get("Contact");
		contact = contact.value;
		var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "ContactCommunication"
		});
		var email = "";
		esq.addColumn("Contact");
		esq.addColumn("CommunicationType");
		esq.addColumn("Number");
		// Создание экземпляра первого фильтра.
		var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Contact", contact);
		// Создание экземпляра второго фильтра.
		var esqSecondFilter =	esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
							"CommunicationType", "ee1c85c3-cfcb-df11-9b2a-001d60e938c6");
		// Фильтры в коллекции фильтров запроса будут объединяться логическим оператором OR. 
		esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
		// Добавление созданных фильтров в коллекцию запроса. 
		esq.filters.add("esqFirstFilter", esqFirstFilter);
		esq.filters.add("esqSecondFilter", esqSecondFilter);
		// В данную коллекцию попадут объекты - результаты запроса, отфильтрованные по двум фильтрам.
		esq.getEntityCollection(function(result) {
			if (result.success) {
				result.collection.each(function(item) {
					// Обработка элементов коллекции.
					email = email + " " + this.get("Number");
				});
				this.set("UsrEmail", email);
			}
		}, this);
}

 

Быстров Сергей, Спасибо, сейчас попробуем. 

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

Добрый вечер! Не знаю как такое возможно, чтобы ESQ.GetEntity() возвращал другую строку, при заданном первичном ключе в параметре функции. На скрине видно, что Id который задан и тот который вернул запрос совсем разные, а именно эта запись которую он взял идёт первой в таблице, что я не так делаю или в чём может ошибка? 

Прикрепленные файлы

Нравится

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

Здравствуйте.

Мне такую же ошибку не удалось воспроизвести - GetEntity отрабатывает правильно.

Попробуйте явно указать id, вот так: esq.GetEntity(UserConnection, new Guid("e76f59d2-c8ca-4bc1-80fd-0cdf02ab92dc"));

Ещё отловить бы запрос, который уходит в БД, возможно он некорректно формируется.

 

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

Здравствуйте. Задача была в валидации по полю и системной настройке. Читал статьи по фильтрам в ESQ и по форуму перелистал всё.

Всё работает, кроме одного момента.

 

Валидация:

Если значение выпадающего списка frequency равно "Ежедневно" и в выпадающем списке active поле = "Да" и количество записей в базе больше чем системной настройке(в данном случае 5) - срабатывает валидация на поле и всплывающее уведомление при попытке сохранения, или изменения записи.

 

frequency - выпадающий список периодичностей;

active - выпадающий список активности;

ermsg - сообщение ошибки;

maxCount - системная настройка (ранее "MaxAmountofDailyActivities");

response.collection.getCount() - актуальное кол-во записей;

 

При сохранении записи с полем "Ежедневно" + "Да", если таких записей уже 5  - валидация работает и правильно выдаёт ошибку. 

1.Но если любую другую запись, например с полем "Еженедельно" + "Да" изменить на "Ежедневно" + "Да", то ошибка не показывается и запись сохраняется. В данный момент записей становится уже 6.

2.Но если далее создавать записи с "Ежедневно" + "Да" или изменять другие на "Ежедневно" + "Да", ошибка показывается и всё продолжает работать нормально.

код метода прикрепил ниже + скриншоты 

 

methods: {
	asyncValidate: function(callback, scope) {
		this.callParent([function(response) {
			if (!this.validateResponse(response)) {
				return;
			}
			Terrasoft.chain(
				function(next) {
					this.validateSwimmingPrograms(function(response) {
						if (this.validateResponse(response)) {
							next();
						}
					}, this);
				},
				function(next) {
					callback.call(scope, response);
					next();
				}, this);
		}, this]);
	},
	validateSwimmingPrograms: function(callback, scope) {
		Terrasoft.SysSettings.querySysSettingsItem("MaxAmountofDailyActivities", function(maxCount) {
			var frequency = "";
			var active = "";
			var ermsg = this.get("Resources.Strings.ErrorMessage");
			var result = {success: true};
			if (this.get("UsrFrequency")) {
				frequency = this.get("UsrFrequency").displayValue;
			}
			if (this.get("UsrActive")) {
				active = this.get("UsrActive").displayValue;
			}
			var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrSwimmingPrograms" });
			esq.addColumn("UsrFrequency.Name", "UsrFrequencyName");
			esq.addColumn("UsrActive.Name", "UsrActiveName");
			esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, 
				"UsrFrequency.Name", "Ежедневно"));
			esq.filters.addItem(esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
				"UsrActive.Name", "Да"));
			esq.getEntityCollection(function(response) {
				if (response.success && frequency === "Еженедельно" || frequency === "Ежемесячно" ||
					frequency === "Ежедневно" && active === "Нет"){
					result.success = true;
				}
				else if (response.success && frequency === "Ежедневно" && active === "Да" && (!this.isAddMode() && 
					response.collection.getCount() > maxCount) || (this.isAddMode() && 
					response.collection.getCount() >= maxCount)) {
						result.message = maxCount + ermsg + active;
						result.success = false;
				}
				callback.call(scope || this, result);
			}, this);
		}, this);
	}
},

Ниже по очереди: 

- Уже созданные 5 записей;

- при создании 6-ой с "Ежедневно" + "Да" выдаёт ошибку(выводит системную настройку(5), и в конце активность;

- При создании другой записи с другиме полями - ошибку не выводит(как и надо);

- При смене в пред. записи поля на "Ежедневно" - сохраняет (должно выводить ошибку);

- При последующих сохранения изменения записей всё работает корректно(где надо выдаёт ошибку, где не надо - не выдёт).

Нравится

8 комментариев
Лучший ответ

То есть Ваша функция не вызывается при изменении существующей записи, а только для новых? Проверьте, выполняется ли вообще перед сохранением функция, добавленная в asyncValidate и доходит ли до вызова validateSwimmingPrograms. 

 

Правильные примеры валидации есть в этой теме  и в DocumentPageV2 пакета Document в «коробке»:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.validateAccountOrContactFilling(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				this.validateUniqueNumber(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				callback.call(scope, response);
				next();
			}, this);
	}, this]);
},

 

Василий, попробуйте в браузере поставить отладчик и пошагово посмотреть, как выполняется эта функция. Заходит ли вообще в неё, правильно считает количество? Может, меняемая запись не учитывается, поскольку проверка идёт по последней ветке с «>=»?

Также лучше не завязываться на текстовые названия справочных полей, могут потом быть неожиданности при смене локализации интерфейса или каких-нибудь изменениях в значении в справочнике.

Зверев Александр,

Поставил отладчик, показывает только одно предупреждение при входе в карточку. 

В разделе Активности ничего не делал, не пойму почему ругается на это.

Названия справочных полей заменю на id полей, пока для вида оставил текст. 

Имею в виду, посмотреть, как по строкам выполняется скрипт, по каким ветвям условий выполняется в этом случае.

Зверев Александр,

 Отработка скрипта при сохранении 5-ой записи с полями "Ежедневно" и "Да"
-Показывает, что перед добавлением было 4 записи: 

 

 

Далее, при попытке сохранить 6-ю записи с нужными полями, показывает что 5шт уже есть, то-есть пред. запись сохранилась и записалась:

 

 

Окей, работает, пробую изменить другую запись с рандомными полями на нужные.

Результат показывает, кол-во записей до изменения и сохранения записи на нужные поля.

 

 

Пробую еще раз добавить запись с нужными полями:

 

Попробуйте выполнить скрипт в отладке!

Зверев Александр,

currentCount - кол-во существующих записей с нужными полями.

Тут показывает, что есть уже 5(при попытке создать 6-ю)

Тут исполнение функции происходит после изменения и сохранения другой записи с произвольными полями на нужные.

Ошибку не выкидывает, а просто сохраняет и уже currentCount = 6

 

Но когда уже есть 6, функция не позволяет дальше создавать с нужными полями или даже изменять произвольную запись на запись с "Ежедневно" / "Да". 

 

То есть Ваша функция не вызывается при изменении существующей записи, а только для новых? Проверьте, выполняется ли вообще перед сохранением функция, добавленная в asyncValidate и доходит ли до вызова validateSwimmingPrograms. 

 

Правильные примеры валидации есть в этой теме  и в DocumentPageV2 пакета Document в «коробке»:

asyncValidate: function(callback, scope) {
	this.callParent([function(response) {
		if (!this.validateResponse(response)) {
			return;
		}
		Terrasoft.chain(
			function(next) {
				this.validateAccountOrContactFilling(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				this.validateUniqueNumber(function(response) {
					if (this.validateResponse(response)) {
						next();
					}
				}, this);
			},
			function(next) {
				callback.call(scope, response);
				next();
			}, this);
	}, this]);
},

 

Зверев Александр,

Спасибо огромное за наводку, разобрался.

Переделал что-бы функция реагировала на изменения: 

 

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

Добрый день коммьюнити,

Просто оставлю это здесь, чтобы самому потом не забыть как этим пользоваться)

Итак, у нас есть запрос с двумя where in или exists. В приведенном ниже примере он должен выбрать из перечня схем в SysSchema только те, UId которых есть в таблице SysModuleEntity в поле SysEntitySchemaUid и при этом сами значения SysModuleEntity должны быть в таблице SysModule и там признак IsSystem не должен быть false.

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

select * 
from sysschema 
where uid in (
    select sysentityschemauid from sysmoduleentity 
    where id in (
        select sysmoduleentityid from sysmodule
        where issystem = 'false'
    )
)
 
--он же, только через exists
select * 
from sysschema 
where exists (
    select id from sysmoduleentity 
    where sysentityschemauid = uid and exists(
        select id from sysmodule 
        where sysmoduleentityid = sysmoduleentity.id
        and issystem = 'false'
    )
)

Выполнить его нужно на клиентской части и по каким-то причинам нужно выполнить только через ESQ и лучше всего одним запросом. Например, мне это было нужно, чтобы вставить свой фильтр справочного поля в уже существующий экземпляр esq вместо того, чтобы городить тонны замещающей логики.
Чтобы это выполнить, нам нужно внимательно руководствоваться вот этой великолепной статьей https://community.terrasoft.ru/articles/kak-sdelat-filtraciu-pola-po-exists-filtru-s-parametrom-znacenie-drugogo-pola и проявить немного смекалочки) 
Сколько ни бейтесь у вас не выйдет сделать подобным образом:
 

esq.filters.addItem(Terrasoft.createExistsFilter("[SysModule:SysModuleEntity:SysEntitySchemaUId:UId].Id")

а жаль, было бы удобно)

Вместо этого нам нужно сделать сразу несколько вложенных фильтров, вот так:
 

var subSubFilters = Terrasoft.createFilterGroup();
subSubFilters.addItem(Terrasoft.createColumnFilterWithParameter(
    Terrasoft.ComparisonType.EQUAL,
    "IsSystem", false));
var subFilters = Terrasoft.createFilterGroup();
subFilters.addItem(Terrasoft.createExistsFilter("[SysModule:SysModuleEntity].Id", subSubFilters));
esq.filters.addItem(Terrasoft.createExistsFilter("[SysModuleEntity:SysEntitySchemaUId:UId].Id", subFilters));

Фух, работа сделана, можно наградить себя чем-то вкусным и лучше всего очень вредным :)

Нравится

Поделиться

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

А почему бы вообще не вывернуть наизнанку, написав запрос к SysModule, связанным при помощи inner join с SysModuleEntity и затем с SysSchema?

select distinct sysschema.* from sysmodule 
inner join sysmoduleentity on sysmodule.sysmoduleentityid = sysmoduleentity.id
inner join sysschema on  sysmoduleentity.sysentityschemauid = sysschema.uid
where issystem  = 'false'

 

Зверев Александр,

выглядит интересно, но как это написать с помощью фильтра в esq?)

Как добавляются join разных типов, см. тут. А distinct включается в конструкторе ESQ при помощи isDistinct: true (через запятую после значения rootSchemaName).

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

Доброго времени суток!Возникла необходимость учитывать регистр строки в фильтре при запросе esq С# . Никто не встречался с такой проблемой?Как это можно реализовать?

Нравится

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

Система полагается на стандартные настройки базы данных. В MS SQL по умолчанию регистр не учитывается, настройка меняется на уровне всей базы, как описано тут. Только учтите, что работу системы с изменёнными настройками регистрозависимости никто не тестировал и сайт может заработать некорректно в других местах.

Зверев Александр,

Благодарю за ответ

Может кому пригодится. Решили эту проблему следующим образом - конвертировали строку в base64.

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

Добрый день, подскажите, как можно написать подобный запрос на esq? Желательно на стороне сервера. Смотрел в сторону addAggregationSchemaColumn, но там можно либо посчитать количество, либо применить min, max и т.п, а эти функции работают только с числовыми полями.

select
(select top 1 Number from ContactCommunication where ContactId = c.Id and CommunicationTypeId = 'EE1C85C3-CFCB-DF11-9B2A-001D60E938C6')
from Contact c

Нравится

3 комментария
Лучший ответ

 Запрос в скобках:

var esq = new EntitySchemaQuery(userConn.EntitySchemaManager, "ContactCommunication");
esq.AddColumn("Number");
esq.RowCount = 1;
esq.Filters.Add(esq.CreateFilterWithParameters(
	FilterComparisonType.Equal,
	"ContactId ", contactId));
esq.Filters.Add(esq.CreateFilterWithParameters(
	FilterComparisonType.Equal,
	"CommunicationTypeId", "EE1C85C3-CFCB-DF11-9B2A-001D60E938C6"));
var collection = esq.GetEntityCollection(userConn);

 

 Запрос в скобках:

var esq = new EntitySchemaQuery(userConn.EntitySchemaManager, "ContactCommunication");
esq.AddColumn("Number");
esq.RowCount = 1;
esq.Filters.Add(esq.CreateFilterWithParameters(
	FilterComparisonType.Equal,
	"ContactId ", contactId));
esq.Filters.Add(esq.CreateFilterWithParameters(
	FilterComparisonType.Equal,
	"CommunicationTypeId", "EE1C85C3-CFCB-DF11-9B2A-001D60E938C6"));
var collection = esq.GetEntityCollection(userConn);

 

Литвинко Павел, спасибо! Попробую. Только не разбираясь в деталях, увидел проблему, что в таком случае в выборку не по попадут контакты с незаполненным полем, потому запрос не подойдет.

В идеале нужно получить поля из Контакта и поле из средств связи (в том числе пустое)

Павел, такой результат из таблицы средств связи получить не получится, ведь там нет записей о контактах без средств связи.

В Вашем случае нужно будет действовать наоборот, выбирать из таблицы Contact с добавлением колонок из таблицы детали средств связи, таких как [ContactCommunication:Contact:Id].CommunicationType и [ContactCommunication:Contact:Id].Number, по таким же колонкам можно и накладывать фильтр.

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

Для отладки необходимо получить SQL текст ESQ запроса на front-end

Нравится

1 комментарий
Лучший ответ

Насколько мне известно, такой возможности нет.

В случае с фронтендом можно смотреть запрос через SQL профайлер.

Насколько мне известно, такой возможности нет.

В случае с фронтендом можно смотреть запрос через SQL профайлер.

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