Вопрос

Обязательность поля в зависимости от результата фильтрации

В мобильном приложении есть поле "Модель оборудования".

К этому полю применяется фильтр вида:



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(*).... и смотреть на результат....

Но как асинхронный результат выполнения будет сочетаться с бизнес-правилом поля не совсем понятно.



Может если перейти на фильтр, построенный как бизнес-правило можно-будет при определении Обязательности вычитать какие-то его свойства?



Какие могут быть еще решения?

Нравится

2 комментария

Вручную использовать запросы к базе крайне не рекомендуется, т.к. отвалится онлайн режим.

Можно использовать 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;

    }

});

 

Показать все комментарии