Показать сообщение отдельно
Старый 11.12.2001, 01:40   #6  
sguryev is offline
sguryev
Участник
 
24 / 13 (1) ++
Регистрация: 07.12.2001
Адрес: Сергиев Посад
Lightbulb
Цитата:
Иногда требуется, чтобы значение, какого либо поля увеличивалось автоматически, например поле индекса, при вставке новой записи в таблицу, например в 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();
}
В таком виде все отлично работает, но не является функциональностью таблицы, а лишь функциональностью формы.
__________________
Гурьев Сергей