Добрый день. Прошу помощи - третий день мучаюсь с этой задачкой. Есть страница редактирования. В ней есть деталь, отображающая (только чтение) записи из того же реестра. Отбор записей в деталь должен проводиться по ряду условий, связанных с полями основной записи на странице редактирования. Мысль в том, чтобы по этим условиям отобрать через EntitySchemaQuery несколько Id и назначить их в фильтр детали через createColumnInFilterWithParameters.
Проблема в том, что результаты EntitySchemaQuery.getEntityCollection отрабатываются в callback-функции, и происходит это в большинстве случаев позже, чем завершается работа функции filterMethod детали, в которой делается вызов getEntityCollection. Фильтр получается пустым.
Ниже проблемный код:
// функция назначена как "filterMethod" детали
applyFilter: function() {
//
var vFGroup = Terrasoft.createFilterGroup();
vFGroup.logicalOperation = Terrasoft.LogicalOperatorType.AND;
//
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Tenants"
});
esq.addColumn("Id");
esq.addColumn("ReportMonth");
esq.addColumn("Area");
var vArea = this.get("Area");
// фильтры запроса - должна совпадать дата, и площадь быть в +-20%
esq.filters.add("ReportMonthFilter",
esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"ReportMonth", this.get("ReportMonth")));
esq.filters.add("AreaFilter",
esq.createColumnBetweenFilterWithParameters("Area",
vArea * 0.8, vArea * 1.2));
// до этого места все работает корректно
// теперь запускаем запрос и получаем данные
// насколько я понимаю, архитектурно система распараллеливает задачи,
// т.е. function(result) и следующая инструкция после getEntityCollection()
// начинают отрабатываться одновременно
esq.getEntityCollection(function (result) {
if (result.success) {
// добавляем фильтр как UID по списку
// здесь так можно, больших выборок не предполагается
var vSelected = [];
result.collection.each(function (item) {
vSelected.push(item.get("Id"));
});
var vIdF = Terrasoft.createColumnInFilterWithParameters("Id", vSelected);
// нужно как-то гарантировать, чтобы эта операция всегда выполнялась раньше, чем
// return vFGroup; в конце функции. Иначе в фильтры попадает пустой список, и фильтр
// не работает.
vFGroup.add("vIdF", vIdF);
}
}, this);
// Интересно, что при первом открытии детали после обновления
// страницы операция return vFGroup;
// выполняется корректно, т.е. после vFGroup.add("vIdF", vIdF);.
//Если дальше закрыть страницу и через реестр
// открыть другую запись - уже не работает.
// Также интересно, что если вбить вот сюда:
// window.alert("!");
// то пауза будет достаточна для формирования vFGroup
// независимо от того, в первый раз я открываю
// запись или нет
return vFGroup;
},