Обязательность поля в зависимости от результата фильтрации
В мобильном приложении есть поле "Модель оборудования".
К этому полю применяется фильтр вида:
Terrasoft.sdk.Model.addBusinessRule("Case", {
ruleType: Terrasoft.RuleTypes.Filtration,
events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
triggeredByColumns: ["WorkTypeEquipment"],//Тип оборудования
filteredColumn: "WorkCategoryModelEquipment",//Модель оборудования связана с Тип оборудования по WorkTypeEquipmentId
filters: Ext.create("Terrasoft.Filter", {
property: "WorkTypeEquipment"
})
});
Также это поле Должно быть обязательным, если приведенный выше фильтр возвращает хотя-бы одну запись, иначе поле НЕ обязательное.
Пока есть только идея перед установкой признака Обязательное вручную формировать запрос Select Count(*).... и смотреть на результат....
Но как асинхронный результат выполнения будет сочетаться с бизнес-правилом поля не совсем понятно.
Может если перейти на фильтр, построенный как бизнес-правило можно-будет при определении Обязательности вычитать какие-то его свойства?
Какие могут быть еще решения?
Нравится
Вручную использовать запросы к базе крайне не рекомендуется, т.к. отвалится онлайн режим.
Можно использовать custom бизнес правило. Сначала строим фильтр. Потом этот же фильтр используем его для подсчёта кол-ва записей. Как-то так. Пример оформления custom правила в академии есть.
record.changeProperty("WorkCategoryModelEquipment", { removeFilter: "FilterName" }); var filter = Ext.create("Terrasoft.BaseFilter", { name: "FilterName" //определение фильтра }); record.changeProperty("WorkCategoryModelEquipment", { addFilter: filter }) var store= Ext.create("Terrasoft.store.BaseStore", { model: "WorkCategoryModelEquipment" }); store.setFilters(filter); var queryConfig = Ext.create("Terrasoft.QueryConfig", { modelName: "WorkCategoryModelEquipment", columns: ["Id", "Name"] }); store.load({ queryConfig: queryConfig, callback: function(records, operation, success) { var isRequired = store.data.length > 0; record.changePropery("WorkCategoryModelEquipment", {required: isRequired}); Ext.callback(config.success, config.scope); } })
Полученный конечный результат для одной колонки выглядит так:
//Причины поломки
Terrasoft.sdk.Model.addBusinessRule("Case", {
name: "WorkReasonReqRule",
ruleType: Terrasoft.RuleTypes.Custom,
triggeredByColumns: ["Category", "Status", "WorkCategory", "WorkReason"],
events: [
Terrasoft.BusinessRuleEvents.Load,
Terrasoft.BusinessRuleEvents.ValueChanged,
Terrasoft.BusinessRuleEvents.Save
],
executeFn: function(record, rule, column, customData, callbackConfig) {
let vWorkCategoryId = record.get("WorkCategory.Id");//зона ответственности
let vWorkCategoryEmpty = !!vWorkCategoryId;//зона ответственности
if(!vWorkCategoryEmpty){//если зона ответственности = пусто, то причина поломки - не обязательна
record.changeProperty("WorkReason",
{isValid: {
value: true,
message: ""
}
});
Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
return;
}
let vReasonValid = !!record.get("WorkReason.Id");//причины поломки не пустая
if(vReasonValid){
record.changeProperty("WorkReason",
{isValid: {
value: true,
message: ""
}
});
Ext.callback(callbackConfig.success, callbackConfig.scope, [true]);
return;
}
let vFilter = Ext.create("Terrasoft.Filter", {
name: "WorkReasonFilter",
property: "WorkCategory",
value: vWorkCategoryId
});
let vStore = Ext.create("Terrasoft.store.BaseStore", { model: "WorkReason" });
vStore.setFilters(vFilter);
var vQueryConfig = Ext.create("Terrasoft.QueryConfig", {
modelName: "WorkReason",
columns: ["Id", "Name"]
});
vStore.load({
queryConfig: vQueryConfig,
callback: function(records, operation, success) {
let vEmpty = records.length > 0;
record.changeProperty("WorkReason",
{isValid: {
value: !vEmpty,
message: Terrasoft.LS["Sys.RequirementRule.message"]
}
});
Ext.callback(callbackConfig.success, callbackConfig.scope, [!vEmpty]);
},
scope: this
});
return;
}
});