Значения по умолчанию в форме безмятежности

#serenity-platform

#serenity-платформа

Вопрос:

Как я могу получить максимальное значение из поля идентификатора таблицы на основе фильтра поиска в сетке?

У меня есть сетка, в которой отображаются записи из таблицы customer и фильтр поиска в разных местах. Я хочу установить поле Id в новой форме с максимальным значением от клиентов в фильтре поиска местоположения.

Я могу установить для поля Id статическое значение, например 99. Но как я могу установить для него максимальное значение таблицы customer? Мой код ниже:

 @Serenity.Decorators.registerClass()
    export class UtentesGrid extends Serenity.EntityGrid<UtentesRow, any> {
        protected getColumnsKey() { return 'IpssDB.Utentes'; }
        protected getDialogType() { return UtentesDialog; }
        protected getIdProperty() { return UtentesRow.idProperty; }
        protected getInsertPermission() { return UtentesRow.insertPermission; }
        protected getLocalTextPrefix() { return UtentesRow.localTextPrefix; }
        protected getService() { return UtentesService.baseUrl; }

        constructor(container: JQuery) {
            super(container);
        }

        protected addButtonClick() {
            this.editItem(<IpssDB.UtentesRow>{
                Codigo: 99
            });
        }

    }
  

Также есть ли событие на стороне сервера (возможно, конечная точка), которое вызывается при нажатии кнопки добавления и которое может позволить мне выполнить код на c #? Это дало бы больше «свободы» для сканирования базы данных по своему усмотрению.

PS:

Мне удалось решить проблему следующим образом:

Встроенный помощник:

 public static GetUtenteNextNumberResponse GetUtenteNextNumber(IDbConnection connection, GetUtenteNextNumberRequest request)
    {
        
        var min = connection.Query<string>(new SqlQuery()
            .From("Locais")
            .Select("UtenteCodMin")
            .Where("Codigo = "   request.Local))
            .FirstOrDefault();

        var minN = (string.IsNullOrEmpty(min) ? 0 : int.Parse(min));

        var minCod = connection.Query<string>(new SqlQuery()
            .From("Utentes")
            .Select("Codigo")
            .Where("Codigo >= "   minN ))
            .FirstOrDefault();

        var response = new GetUtenteNextNumberResponse();

        var n = 0;
        response.Number = minCod == null ||
            !int.TryParse(minCod, out n) ? minN   1 : n   1;

        return response;
    }
  

И в Grid.ts:

 protected addButtonClick() {
            var eq = this.view.params.EqualityFilter;
            var local = 0
            local = eq ? eq.Local : 0;
            var ultCod = 0;

            IPSS.IpssDB.UtentesService.GetUtenteNextNumber({
                Local: local,
                User: '' 
            }, response => {
                    this.editItem(<IpssDB.UtentesRow>{
                        Codigo: response.Number,
                        Local: eq ? eq.Local : null
                    });
            });
        }
  

Теперь проблема в том, что новая форма предполагает, что я редактирую запись, а не создаю новую, и кнопка «Сохранить» отображается как «Обновить». Я полагаю, это потому, что я меняю ключевое поле.

Есть ли способ преодолеть это? Или есть другой способ? Если при нажатии кнопки Добавить новую в сетке вызывалось событие или конечная точка, что позволяло возвращать объект со значениями по умолчанию, это было бы идеально.

Ответ №1:

Проблема решена!

Я пытался перехватить неправильное событие. Событие, которое я должен был перехватывать, но о котором не знал, было loadEntity и не afterLoadEntity было .

Поэтому я оставил помощника без изменений и просто заменил код ‘UtentesDialog.ts’ следующим образом:

«UtentesDialog.ts»

         protected loadEntity(data) {
            super.loadEntity(data);
            var local = 0;
            local = data.Local;
            if (this.isNew())
                this.getNextNumber(local);
        }

        private getNextNumber(local) {
            IPSS.IpssDB.UtentesService.GetUtenteNextNumber({
                Local: local,
                User: '' 
            }, response => {
                    this.form.Codigo.value = response.Number;
                    });
            };
  

Мне также пришлось сохранить addButtonClick в файле ‘UtentesGrid.ts’, чтобы получить локальное значение, чтобы я мог получить его в диалоговой форме. В противном случае я не смог бы получить значение локального фильтра (возможно, есть другой способ, я не знаю).

«UtentesGrid.ts»

 protected addButtonClick() {
            var eq = this.view.params.EqualityFilter;
            var local = 0
            local = eq ? eq.Local : 0;
            this.editItem(<IpssDB.UtentesRow>{
                //Codigo: ultCod,
                Local: eq ? eq.Local : null
            });
        }