问题描述
如何基于网格中的查找过滤器从表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
});
}