Нужно при создании лида проверить есть ли уже компания комбинацией БИН и города. Сделал через валидацию, данные читаются все с базы нормально, но проблема в правильном построении 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]); }
Спасибо! Отличные ответы, думаю применить теперь еще в других частях кода их.