Добрый день.
Версия 7.9.0
Пробую добавить валидацию полей в редактируемую деталь с реестром и вычислаемы полями по примеру
https://academy.terrasoft.ru/documents/technic-sdk/7-9/dobavlenie-valida...
Но пример для страницы редактирования раздела. Может я не в ту схему вставляю методы? Или же я просто не вижу ошибку которую допускаю ? Буду признателен за подсказку
return {
entitySchemaName: "UsrOrderOnField",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
attributes: {
"UsrReservRemains": {
dataValueType: Terrasoft.DataValueType.INTEGER,
dependencies: [
{
columns: ["UsrQuantity"],
methodName: "calculateUsrReservRemains"
}
]
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "UsrQuantityWorkOrdere",
"values": {
"layout": { "colSpan": 12,"rowSpan": 1,"column": 12,"row": 4,"layoutName": "Header"},
"bindTo": "UsrQuantityWorkOrder"
},
"parentName": "Header",
"propertyName": "items",
"index": 4
},
{
"operation": "insert",
"name": "UsrQuantity",
"values": {
"layout": {"colSpan": 12,"rowSpan": 1,"column": 0,"row": 3,"layoutName": "Header"
},
"bindTo": "UsrQuantity"
},
"parentName": "Header",
"propertyName": "items",
"index": 5
},
{
"operation": "insert",
"name": "UsrReservRemains",
"values": {
"layout": {"colSpan": 12,"rowSpan": 1,"column": 0,"row": 4,"layoutName": "Header"
},
"bindTo": "UsrReservRemains"
},
"parentName": "Header",
"propertyName": "items",
"index": 6
},
{
"operation": "insert",
"name": "UsrToWorkOrder",
"values": {
"layout": {"colSpan": 12,"rowSpan": 1,"column": 12,"row": 3,"layoutName": "Header"
},
"bindTo": "UsrToWorkOrder"
},
"parentName": "Header",
"propertyName": "items",
"index": 7
}
]/**SCHEMA_DIFF*/,
methods: {
calculateUsrReservRemains: function() {
if (!this.get("UsrLastQuantity")) {
this.set("UsrLastQuantity", 0);
}
if (!this.get("UsrReservRemains")) {
this.set("UsrReservRemains", 0);
}
var result = this.get("UsrReservRemains") + this.get("UsrQuantity") - this.get("UsrLastQuantity");
this.set("UsrReservRemains", result);
this.set("UsrLastQuantity", this.get("UsrQuantity"));
},
quantityVlidator: function() {
var invalidMessage = "";
if (this.get("UsrQuantity") this.get("UsrReservRemains")) {
invalidMessage = this.get("Resources.Strings.ValueOfReservGraterThenQuantity");
}
return {
fullInvalidMessage: invalidMessage
invalidMessage: invalidMessage
};
},
setValidationConfig: function() {
this.callParent(arguments);
this.addColumnValidator("UsrQuantity", this.quantityVlidator);
this.addColumnValidator("UsrReservRemains", this.quantityVlidator);
}
},
rules: {}
};
});
Нравится
"Сергей Джулай" написал:Буду признателен за подсказку
Скрин консоли с ошибкой приложите, пожалуйста
Да дело в том что ошибки в консоли нету. На странице редактирования заказа деталь с редактируемым реестром(21.jpg), и валидация там не работает (но и ошибок нет). Когда же на странице редактирования самой детали работает все отлично(20.jpg).
А нужна валидация, что бы не открывать новую страницу.
А код немного сменил (Упростил)
quantityVlidator: function() { var invalidMessage = ""; if (this.get("UsrQuantity") < 1) { nvalidMessage = this.get("Resources.Strings.ValueOfReservGraterThenQuantity"); } return { fullInvalidMessage: invalidMessage, invalidMessage: invalidMessage }; }, setValidationConfig: function() { this.callParent(arguments); this.addColumnValidator("UsrQuantity", this.quantityVlidator); }
Здравствуйте,
Валидация колонки не будет работать для РР, и на сколько мне известно будет реализована в следующих версиях, но вы можете переопределить метод сохранения на странице, проверять там все нужные вам колонки, которые вы хотите валидировать, и в случае не соответствия, не вызывать родительский код, а выдавать сообщение о некорректных данных. Пример:
save: function() { if (this.get("UsrString").length === 12) { this.callParent(arguments); } else { this.showInformationDialog("Колонка String должна содержать 12 символов!"); } }
Спасибо Максим. Я так и реализовал валидацию, но это слабовато, так как в РР если внести неверное значение, то оно все равно сохранится, хоть и выдаст информационное окно с ошибкой. А это уже риск сломать некую логику. Может можно как то реализовать некую валидацию в момент события сохранения в GRIDе ? Например на событие выделения строки, поля которые должны проверяться сохраняются в временные переменные, а по событию save происходит валидация и если она не проходит, то значения возвращаются с временных переменных.
Посмотрите в сторону ConfigurationGridUtilities, там есть onActiveRowAction, можете переопределить его, и добавить валидацию там. Переопределять этот метод необходимо на схеме детали, и общатся со схемой карточки через sandbox.
Спасибо Максим. За подсказку - буду дальше размышлять в подсказанном направлении.
Сергей,
Поделитесь, пожалуйста, решением данной задачи.
Добрый день Алла. К сожалению до правильной реализации руки так и не дошли. Сейчас проверки выполнена с помощью предупреждения.
attributes: { "UsrQuantityWorkOrder": { dataValueType: Terrasoft.DataValueType.INTEGER, dependencies: [ { columns: ["UsrQuantityWorkOrder"], methodName: "validationUsrQuantityWorkOrdere" } ] } }, methods: { validationUsrQuantityWorkOrdere: function() { if (this.get("UsrQuantityWorkOrder") > this.get("UsrReservRemains")) { this.showInformationDialog("Значение больше чем значиние Остаток в резерве"); } } }
Сергей, спасибо за информацию.
Получается, что пользователь при такой реализации может всё-таки внести некорректные данные, но при этом он будет предупрежден.
Кстати, интересно реализована ли валидация для редактируемого реестра в версии 7.10?
Кто в курсе?
Да, вы правы, пользователь может внести неверное значение, нужно все таки разобраться с sandbox и ConfigurationGridUtilities.
Как собственно и в обычных деталях и карточках - Ваша задача изучить цепочку вызовов функций сохранения (в каждом случае все немного отличается).
Определите подходящий метод в цепочке вызовов (который вызывается на исполнение до непосредственной записи в БД, обладает необходимым контекстом (this) и т.д.), ну и переопределите его - обогатив своей логикой валидации.
Валидация пройдена - "отпускаем" по this.callParent(arguments) [По естественной ветке]
Не пройдена - прерываем выполнение, и всего делов (показываем наши сообщения, открываем справочники - все что душе угодно)
Если в валидации задействованы асинхронные вызовы - например ESQ запросы.
вам вот сюда "Раcширить логику save, после валидации. Контроль Chain выполнения"
Илья,
в моем кейсе все усложняется тем, что это редактируемый реестр и согласно всему написанному выше не факт, что даже можно напилить свой костыль, чтобы пользователь всё-таки не мог сохранить изменения, если они не валидны. Попробовать, конечно, можно :wink:
Пока решили реализовать только само предупреждение и соответственно планирую создать обращение на support с пожеланием (чем больше будет пожеланий от пользователей, тем выше вероятность реализации базовых механизмов в ближайших релизах)!
Спасибо за то, что поделились опытом!
Илья,
спасибо Вам за помощь в поиске подходящего решения :smile:
В анонсе 7,13 єтого нет (не кидайте в меня тапками если не заметил) Так что ждите или программируйте!
Григорий Чех,
Думаю, что такой доработки в коробке ещё долго не будет, учитывая дату публикации данного поста и все сложности, которые возникают при малейшей попытке доработки редактируемого реестра в базовой версии
Значит или ждать или кастомно делать под себя, (Проверять до сохранения и потом если все ок сохранять )
Григорий Чех пишет:Получается в saveRowChanges изменять условие под себя из ответа Севостьянов Илья Сергеевич?