Цитата:
Иногда требуется, чтобы значение, какого либо поля увеличивалось автоматически, например поле индекса, при вставке новой записи в таблицу, например в Grid control нажатием Ctrl+N. Так вот как это сделать…
Необходимо переопределить метод InitValue у таблицы, к которой хотелось бы добавить эту функциональность, следующим образом:
public void initValue()
{
HB_Tutorial_Company company;
super();
select maxof(ID) from company;
this.ID = company.ID + 1;
this.insert();
}
В данном случае эта функциональность добавляется к таблице HB_Tutorial_Company. Новый индекс будет равен максимальному существующему индексу в таблице, увеличенному на единицу. В принципе можно ставить и другие более сложные условия создания нового индекса. Если не добавлять в конце this.insert(), то при многократном создании записи, например при нажатии Ctrl+N несколько раз подряд, будут создаваться идентичные записи и индекс не будет увеличиваться.
Все бы хорошо, но при работе с другой таблицей HB_Tutorial_Employee, одно поле которой (CompanyID) связано (by relation) с полем HB_Tutorial_Company.ID, возникла следующая проблема. Была создана форма для отображения компаний и их сотрудников, при выборе в одном Grid control компании во втором выводились ее сотрудники, т.е. два Data Source и у того который относится к HB_Tutorial_Employee стоит joint source:HB_Tutorial_Company. К HB_Tutorial_Employee также была добавлена функция автоматического увеличения индекса. Так вот в чем проблема при вставке нескольких записей подряд проблем не возникает, но при вставке одной и тут же ее редактировании, даже просто понажимав enter, CompanyID правильно заполненный автоматом (ID текущей компании) сбрасывается в 0 или любое другое значение, если это поле проинициализировать в InitValue до инсерта. К счастью этого можно избежать, перенеся insert в метод InitValue Data Source’a относящегося к данной таблице.
X++:
public void initValue()
{
HB_Tutorial_Employee employeeCurrent = this.cursor();
HB_Tutorial_Employee employee;
super();
select maxof(EmployeeID) from employee;
employeeCurrent.EmployeeCurrent = employee.EmployeeID + 1;
employeeCurrent.insert();
}
В таком виде все отлично работает, но не является функциональностью таблицы, а лишь функциональностью формы.