Serenity 表单默认值
Serenity Form Default Values
如何根据网格中的查找过滤器从 table Id 字段中获取最大值?
我有一个显示 table 客户记录的网格和一个具有不同位置的查找过滤器。我想在位置查找过滤器中使用来自客户的最大值设置新表单中的 ID 字段。
我可以将 Id 字段设置为静态值,如 99。但是如何将其设置为客户的最大值 table?我的代码如下:
@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
});
});
}
现在的问题是新表单假定我正在编辑记录而不是创建新记录,并且“保存”按钮显示为“更新”。我想这是因为我正在更改关键字段。
有办法克服这个问题吗?或者还有别的办法吗?
如果在单击网格中的添加新按钮时调用了一个事件或端点,允许 return 具有默认值的实体,那就完美了。
问题已解决!
我试图拦截错误的事件。我应该拦截但不知道的事件是 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
});
}
如何根据网格中的查找过滤器从 table Id 字段中获取最大值?
我有一个显示 table 客户记录的网格和一个具有不同位置的查找过滤器。我想在位置查找过滤器中使用来自客户的最大值设置新表单中的 ID 字段。
我可以将 Id 字段设置为静态值,如 99。但是如何将其设置为客户的最大值 table?我的代码如下:
@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
});
});
}
现在的问题是新表单假定我正在编辑记录而不是创建新记录,并且“保存”按钮显示为“更新”。我想这是因为我正在更改关键字段。
有办法克服这个问题吗?或者还有别的办法吗? 如果在单击网格中的添加新按钮时调用了一个事件或端点,允许 return 具有默认值的实体,那就完美了。
问题已解决!
我试图拦截错误的事件。我应该拦截但不知道的事件是 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
});
}