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