Автор: andreybear
Дата сообщения: 11.01.2012 15:52
Baklan_vs
Не знаю какие компоненты "DataAccess" используете и уровень знаний, поэтому привожу несколько вариантов с комментариями. Основной вариант реализован с использованием компонентов DOA.
[more=Подробнее...]{
Поля:
ID - идентификатор записей (на этом поле основан ключ целевой таблицы БД);
BOOL - поле, которое отвечает за отображение "положения" ("вкл", "выкл")
колонки таблицы c Properties = RadioGroup.
В Items создан 1 TcxRadioGroupItem, свойства Type = Smallint, Value = 1.
}
procedure TForm1.DBVeiwEditChanged(Sender: TcxCustomGridTableView;
AItem: TcxCustomGridTableItem);
// Событие, возникающее при изменении записи в таблице
var RecID: integer; // идентификтор исходной записи
begin
// Если изменяется целевая колонка (можно также проверить по имени колонки)
if AItem.Index = 0 then
// Если записей в наборе больше 1
if odsTest.RecordCount > 1 then
begin
// Идентификатор текущей записи
RecID := odsTestID.AsInteger;
{
Можно записать odsTest.RecNo, только надо проверить
допустима ли навигация по "по номеру записи", например,
var RecNo: integer;
...
if odsTest.IsSequenced then
RecNo := odsTest.RecNo;
Либо использовать навигацию по закладкам для возврата к текущей записи.
var BkMrk: TBookmark;
...
BkMrk := odsTest.GetBook;
}
// Отключение связанных с DataSet контролов
odsTest.DisableControls;
// Установка "курсора" на первую запись набора
odsTest.First;
// Перебор всех записей набора
while not odsTest.Eof do
begin
// Если идентификатор записи не равен исходному
if odsTestID.AsInteger <> RecID then
begin
// Если RadioButton в состоянии "вкл"
if odsTestBOOL.AsInteger <> 0 then
begin
// Первод набора в режим редактирования
odsTest.Edit;
// Установка значения поля
odsTestBOOL.Value := 0;
{
Либо odsTest['BOOL'] := 0;
Либо odsTest.FieldByName('BOOL').AsInteger := 0;
Либо odsTest.FieldValues['BOOL'] := 0;
Либо odsTest.Fields[0].AsInteger := 0;
}
// "Подтверждение" записи
odsTest.Post;
end; // if odsTestBOOL.AsInteger <> 0 then
end // if odsTestID.AsInteger <> RecID then
// Иначе установка RadioButton в положение "вкл", если не установлен
else
if odsTestBOOL.Value <> 1 then
begin
odsTest.Edit;
odsTestBOOL.Value := 1;
odsTest.Post;
end; // if odsTestBOOL.Value <> 1 then
// Следующая запись набора
odsTest.Next;
end; // while not odsTest.Eof do
// Возврат к исходной записи
odsTest.SearchRecord('ID', RecID, [srFromBeginning]);
{
Либо odsTest.Locate('ID', RecID, []);
Если записывался odsTest.RecNo, то odsTest.RecNo := RecNo;
Если создавалась закладка, то
if odsTest.BookmarkValid(BkMrk) then
begin
odsTest.GotoBookmark(BkMrk);
odsTest.FreeBookmark(BkMrk);
end;
}
// Подключение связанных с DataSet контролов
odsTest.EnableControls;
end;
end;[/more]