Изменение одного поля при изменении другого
Задаю довольно таки распространенный вопрос, как ни странно, я не нашел подобной темы.
Допустим есть поле статус, при его изменении должно автозаполняться другое поле - дата(возможно текстовое или даже справочник). И сразу усложню задание, изменения должны вступить в силу когда поле статус меняет одно конкретное значение в другое(например из "В работе" в "Выполнено").
BPMonline 7.x
Заранее спасибо.
Нравится
Здравствуйте, данный кейс решается стандартной подпиской на событие. И выполнением интересующей Вас логики по событию.
Подписка на событие в том или ином виде проскакивала на форуме, к примеру:
http://www.community.terrasoft.ua/forum/topic/13908
А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности, а в ней уже есть, если посмотреть исходный код, в родительских схемах, атрибут:
"Status": { "isRequired": true, lookupListConfig: { columns: ["Finish"] }, dependencies: [ { columns: ["Status"], methodName: "onStatusChanged" } ] },
В котором задан метод "onStatusChanged" на изменение данной колонки, и метод этот уже написан, достаточно его переопределить, и дописать недостающей логики.
К примеру:
define("ActivityPageV2", ["ActivityPageV2Resources", "GeneralDetails"], function(resources, GeneralDetails) { return { entitySchemaName: "Activity", details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/, diff: /**SCHEMA_DIFF*/[ ]/**SCHEMA_DIFF*/, attributes: { "StatusValue": { dataValueType: this.Terrasoft.DataValueType.TEXT } }, methods: { onEntityInitialized: function() { this.callParent(arguments); var statusValue = this.get("Status"); this.set("StatusValue", statusValue); }, onStatusChanged: function() { this.callParent(arguments); var oldStatus = this.get("StatusValue"); var statusValue = this.get("Status"); console.log("был: " + oldStatus.displayValue + ", стал: " + statusValue.displayValue); // тут любая логика проверки, и установки if (oldStatus.displayValue === "Не начата" && statusValue.displayValue === "В работе") { this.set("DetailedResult", "Взята в работу"); } this.set("StatusValue", statusValue); } }, rules: {}, userCode: {} }; });
"Щиголь Максим" написал:А по скольку Вы говорите про статусы "В работе", "Выполнено" могу предположить что речь идет про карточку активности
Это карточка заказа, нужно поставить дату окончания(текущую дату) в определенное поле когда статус стает определенным значением. Не знаю как это работает но у меня выбивает ошибку, с помощью вывода данных в консоль определил что выбивает на
"Щиголь Максим" написал:this.set("StatusValue", statusValue);
подумал раз это поле то и тип должен быть не DataValueType.TEXT а DataValueType.LOOKUP, но ничего не помогло, этот код: var statusValue = this.get("Status"); срабатывает(вывожу в консоль данные из statusValue)
this.set("StatusValue", statusValue);
В данном месте ошибка может быть только по двум причинам:
1) неправильный контекст выполнения.
2) проблемы с аттрибутом StatusValue.
Предоставте скриншот ошибки в консоли браузера и, по возможности, код вашей реализации данной схемы для более детального анализа причин ошибки.
Получилось, поменял местами немного, написал так:
this.set("StatusValue", statusValue.displayValue);
а в остальных местах пользовался просто statusValue и oldStatus