宁静表单默认值

问题描述

如何基于网格中的查找过滤器从表ID字段中获取最大值?

我有一个网格,其中显示来自表客户的记录和具有不同位置的查找过滤器。我想使用位置查询过滤器中“客户”的最大值在新表单中设置ID字段。

我可以将Id字段设置为静态值,例如99。但是如何将其设置为客户表的最大值?我的代码如下:

@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
                    });
            });
        }

现在的问题是,新表格假定我正在编辑一条记录而不创建新记录,并且“保存”按钮显示为“更新”。我想这是因为我正在更改关键字段。

有没有办法克服这个问题?还是还有另一条路要走? 如果单击了网格中的“添加新按钮”时有一个事件或端点被调用,则允许返回具有认值的实体,那将是完美的。

解决方法

问题解决了!

我试图拦截错误的事件。我应该拦截但不知道的事件是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”中,以便获取Local值,以便可以在Dialog表单中获取它。否则我将无法获得本地过滤器的值(也许我不知道还有另一种方法)。

“ 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
            });
        }