Нужно при создании лида проверить есть ли уже компания комбинацией БИН и города. Сделал через валидацию, данные читаются все с базы нормально, но проблема в правильном построении callback функции, так как JS пока запускает проверку в базе уже отвечает return в валидацию. PsCode - это БИН поле, City - это города поле
setValidationConfig: function() {
this.callParent(arguments);
this.addColumnValidator("PsCode", this.validateCodePlusCity);
},
validateCodePlusCity : function() {
var invalidMessage = this.get("Resources.Strings.CodePlusCityErrorMessage");
var code = this.get("PsCode");
var city = this.get("City");
if (!code) {
code = "";
}
if (!city) {
city = "";
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"Code", code));
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"City.Id", city.value));
esq.getEntityCollection(function(result) {
if (result.success) {
invalidMessage = "";
}
}, this);
return {
invalidMessage: invalidMessage
};
}
Нравится
Попробуйте примерно так:
setValidationConfig: function() {
this.callParent(arguments);
this.validateCodePlusCity(function(invalidMessage) {
//Здесь доступно значение invalidMessage
this.addColumnValidator("PsCode", invalidMessage);
}, this);
},
validateCodePlusCity : function(callback, scope) {
var invalidMessage = this.get("Resources.Strings.CodePlusCityErrorMessage");
var code = this.get("PsCode");
var city = this.get("City");
if (!code) {
code = "";
}
if (!city) {
city = "";
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"Code", code));
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"City.Id", city.value));
esq.getEntityCollection(function(result) {
if (result.success) {
invalidMessage = "";
Ext.callback(callback, scope, [invalidMessage]);
}
}, this);
}
В esq.getEntityCollection нужно передавать функцию которая обработает результат выборки, в вашем случае скорее всего выдаст сообщение об неуникальности лида! Смотрите асинхронные события JS
Те обработка полученных в запросе данных идет асинхронно!
Попробуйте примерно так:
setValidationConfig: function() {
this.callParent(arguments);
this.validateCodePlusCity(function(invalidMessage) {
//Здесь доступно значение invalidMessage
this.addColumnValidator("PsCode", invalidMessage);
}, this);
},
validateCodePlusCity : function(callback, scope) {
var invalidMessage = this.get("Resources.Strings.CodePlusCityErrorMessage");
var code = this.get("PsCode");
var city = this.get("City");
if (!code) {
code = "";
}
if (!city) {
city = "";
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Account"});
esq.filters.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"Code", code));
esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
"City.Id", city.value));
esq.getEntityCollection(function(result) {
if (result.success) {
invalidMessage = "";
Ext.callback(callback, scope, [invalidMessage]);
}
}, this);
}
Если вам нужно валидейтить перед сохранением то имхо лучше использовать asyncValidate Пример ниже callback нужно передать в esq.getEntityCollection. Если нужно проверять при изменении, можно создать виртуальную колонку и при смене города или БИН менять ее значение в зависимости от результата проверки. А в setValidationConfig проверять результат проверки уникальности города из виртуальной колонки. Если не получится пишите.
asyncValidate: function(callback, scope) {
this.callParent([function(response) {
if (!this.validateResponse(response)) {
return;
}
Terrasoft.chain(
function(next) {
this.myValidationMethod(function(response) {
if (this.validateResponse(response)) {
next();
}
}, this);
},
function() {
callback.call(scope, response);
},
this);
}, this]);
}
Спасибо! Отличные ответы, думаю применить теперь еще в других частях кода их.