Вопрос

Нужна помощь с построением ESQ запроса.

Добрый день.

Стоит задача из таблицы детали достать все записи по полю UsrSchoolName1Id равные Id раздела(this.get("Id")).

И посчитать количество записей по UsrPositionStaffId равной 07D2E5FA-1B0F-4B54-90AB-CCE23678ECFD.

Мой код:

isAccountPrimaryContactSet: function() {
var message = "";
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "UsrEntity1DetailStaff"
});
esq.addColumn("Id");
esq.addColumn("UsrPositionStaffId");
esq.addColumn("UsrSchoolName1Id");
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrSchoolName1Id", this.get("Id"));
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrPositionStaffId", "07e2e5fa-1b0f-4b54-90ab-cce23678ecfd");
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.filters.add("esqSecondFilter", esqSecondFilter);
esq.addAggregationSchemaColumn("UsrPositionStaffId", Terrasoft.AggregationType.COUNT, Terrasoft.AggregationEvalType.ALL);
esq.getEntityCollection(function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    result.collection.each(function (item) {
        message += "Количество младших сотрудников: " + item.get("UsrPositionStaffId") + "\n";
    });
    this.showInformationDialog(message);
}, this);
 
 
 
}

Фото моей таблицы:

 

 

 

 

После нажатия кнопки данный код выводит следующую ошибку в консоли:

 

У меня такой же вопрос

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

Все id для js приводите к нижнему регистру те использовать вместо 

"77250D61-1612-4D2B-BE38-361AF1E27E59"

нужно

"77250d61-1612-4d2b-be38-361af1e27e59"

Для решение вашей проблемы посмотрите через профайлер sql запросов какой запрос идет в базу это поможет вам понять что не так с запросом и почему он не возвращает записей

Насколько я понимаю, то в колонках "UsrPositionStaffId" и "UsrSchoolName1Id" Вам нужно убрать в конце "Id".

Alex Zaslavsky пишет:

Насколько я понимаю, то в колонках "UsrPositionStaffId" и "UsrSchoolName1Id" Вам нужно убрать в конце "Id".

 

Ошибка ушла теперь просто возвращает пустое поле. 

Казанцев Андрей Юрьевич,

я, честно говоря, ниразу не использовал AggregationSchemaColumn, я обычно пишу:

if (!result.success) {
  this.showInformationDialog("Ошибка запроса данных");
    return;
  }
this.showInformationDialog(result.collection.collection.length);

Это так, чисто протестить сколько записей я получил.

Alex Zaslavsky пишет:

Казанцев Андрей Юрьевич,

я, честно говоря, ниразу не использовал AggregationSchemaColumn, я обычно пишу:


 
if (!result.success) {
  this.showInformationDialog("Ошибка запроса данных");
    return;
  }
this.showInformationDialog(result.collection.collection.length);

Это так, чисто протестить что я получил.

Тут пока проблема не в агрегации, а фильтрации. Для отладки закоментировал  часть кода:

var message = "";
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "UsrEntity1DetailStaff"
});
esq.addColumn("UsrPositionStaff");
esq.addColumn("UsrSchoolName1");
var esqFirstFilter = esq.createColumnFilterWithParameter("UsrSchoolName1",Terrasoft.ComparisonType.EQUAL,"UsrSchoolName1", "77250D61-1612-4D2B-BE38-361AF1E27E59");
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.getEntityCollection(function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    result.collection.each(function (item) {
        message += "Количество младших сотрудников: " + item.get("UsrSchoolName1") + "\n";
    });
    this.showInformationDialog(message);
}, this);

Все id для js приводите к нижнему регистру те использовать вместо 

"77250D61-1612-4D2B-BE38-361AF1E27E59"

нужно

"77250d61-1612-4d2b-be38-361af1e27e59"

Для решение вашей проблемы посмотрите через профайлер sql запросов какой запрос идет в базу это поможет вам понять что не так с запросом и почему он не возвращает записей

Метод createColumnFilterWithParameter содержит 3 параметра, а у Вас 4:

createColumnFilterWithParameter(comparisonType, columnPath, paramValue)

Попробуйте написать вот так:

esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrSchoolName1", "77250d61-1612-4d2b-be38-361af1e27e59")

Казанцев Андрей Юрьевич,

так что в итоге, все получилось?

Григорий Чех пишет:

Большое спасибо за подсказку с профайлером. Айди через get сделал.

Alex Zaslavsky пишет:

Спасибо и тебе Алекс. А то я с постоянным использованием  sql запросах в поддержке. Везде пихал за место объектов название запросов в базе.

Алла Савельева пишет:

Да, Алла ваш способ заработал. Хотя я все делал по примерам с академии.

У меня теперь такая проблема. Я не могу синхронно вывести подсчет.

Сам код подгружается так:

 onEntityInitialized: function() {
            	this.callParent(arguments);
            	  this.methodChain();
            },
	numberOfDetail: function(IdDetail) {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "UsrEntity1DetailStaff"
});
esq.addColumn("UsrPositionStaff","UsrPositionStaff");
esq.addColumn("UsrSchoolName1","UsrSchoolName1");
var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"UsrSchoolName1", this.get("Id"));
var esqSecondFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,"UsrPositionStaff", IdDetail);
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.add("esqFirstFilter", esqFirstFilter);
esq.filters.add("esqSecondFilter", esqSecondFilter);
esq.addAggregationSchemaColumn("UsrPositionStaff", Terrasoft.AggregationType.COUNT,"detailOfNumber",
Terrasoft.AggregationEvalType.NONE);
esq.getEntityCollection(function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных");
        return;
    }
    result.collection.each(function (item) {
 
        return item.get("detailOfNumber");
    });
}, this);
},
methodChain: function(){
 this.showInformationDialog("Младших учителей:" + this.numberOfDetail("07D2E5FA-1B0F-4B54-90AB-CCE23678ECFD") + "\n"+
"Старших учителей:" + this.numberOfDetail("019EF537-F8F1-4C01-BA2B-4B17D1285231") + "\n" +
"Ведущих учителей:" + this.numberOfDetail("F02850E9-264A-4D57-B64C-7409F0A84322") + "\n");
 
 
}

 

return в асинхронном обработчике плохая идея вам нужно вызывать methodChain втом же месте где вы получили(вычитали данные) те после 

(result.success)

для каждого элемента коллекции или после их перебора /(это смотря что вам нужно). Как вариант можно создать свои виртуальные колонки (атрибуты) вычитать туда нужные вам данные а потом в обработчике (например по нажатию кнопки) брать оттуда данные.

Григорий Чех пишет:
return в асинхронном обработчике плохая идея вам нужно вызывать methodChain втом же месте где вы получили(вычитали данные) те после 

Задача в том чтобы при открытии страницы выходило это окно. 

Войдите или зарегистрируйтесь, чтобы комментировать