Суть идеи в том, что в этом режиме данные не пишутся сразу в базу, а хранятся в памяти этим и можно воспользоваться. Вот скажем у меня есть вот такая структура и запрос к ней:
Код:
SELECT Building.Building, Floor.Floor, Room.Room, Socket.Socket
FROM ((Building INNER JOIN Floor ON Building.BuildingId = Floor.BuildingID) INNER JOIN Room ON Floor.FloorId = Room.FloorID) INNER JOIN Socket ON Room.RoomId = Socket.RoomId;
Такой запрос нельзя редактировать напрямую, поэтому мы выставляем для него:
Код:
ADOQuery1.LockType := ltBatchOptimistic;
и самостоятельно обрабатываем сохранение данных:
Код:
procedure TForm9.ADOQuery1AfterPost(DataSet: TDataSet);
Var DS: TAdoDataSet;
ID: Integer;
begin
DS := TAdoDataSet.Create(nil);
DS.Connection := AdoConnection1;
DS.CommandText := 'Building';
DS.CommandType := cmdTable;
DS.Open;
DS.AppendRecord([nil, DataSet['Building']]);
ID := DS['BuildingID'];
DS.Close;
DS.CommandText := 'Floor';
DS.CommandType := cmdTable;
DS.Open;
DS.AppendRecord([nil, ID, DataSet['Floor']]);
ID := DS['FloorID'];
DS.Close;
DS.CommandText := 'Room';
DS.CommandType := cmdTable;
DS.Open;
DS.AppendRecord([nil, ID, DataSet['Room']]);
ID := DS['RoomID'];
DS.Close;
DS.CommandText := 'Socket';
DS.CommandType := cmdTable;
DS.Open;
DS.AppendRecord([nil, ID, DataSet['Socket']]);
DS.Close;
DS.Free;
end;