Показать сообщение отдельно
Старый 12.12.2001, 03:24   #1  
sguryev is offline
sguryev
Участник
 
24 / 13 (1) ++
Регистрация: 07.12.2001
Адрес: Сергиев Посад
Автоматическое увеличение значения поля при создании новой записи.
Автоматическое увеличение значения поля при создании новой записи.

Иногда требуется, чтобы значение, какого либо поля увеличивалось автоматически, например поле индекса, при вставке новой записи в таблицу, например в Grid control нажатием Ctrl+N. Так вот как это сделать…

Необходимо переопределить метод InitValue у таблицы, к которой хотелось бы добавить эту функциональность, следующим образом:<pre>public void initValue()
{
HB_Tutorial_Company company;

super();

select maxof(ID) from company;
this.ID = company.ID + 1;
this.insert();
}
</pre>
&nbsp;
В данном случае эта функциональность добавляется к таблице 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 относящегося к данной таблице.<pre>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();
}
</pre>
&nbsp;

В таком виде все отлично работает, но не является функциональностью таблицы, а лишь функциональностью формы.
__________________
Гурьев Сергей