![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Есть три таблицы, каждая с автоинкрементируемым полем.
Они же являются и ключевыми. Дом(Object) -> Квартиры(Flats) -> Приборы(Devs) Код:
SELECT
Objects.`ID`,
Flats.`ID` AS FlatID,
Flats.`Title`,
Flats.`Entrance`,
Flats.`Floor`,
Devs.`ID` AS DevID,
Devs.`FlatID` AS DevFlatID,
Devs.`Nr`,
Devs.`Type`,
Devs.`ErrID`,
Devs.`Archive`
FROM
Objects
LEFT JOIN Flats
ON Flats.`ObjectID` = Objects.`ID`
LEFT JOIN Devs
ON Devs.`FlatID` = Flats.`ID`
WHERE Objects.`ID` = :ObjectID Этот запрос храню в ObjectImg: TADODataSet При попытке обновить Devs.Archive вот таким вот методом: Код:
ObjectImg.Edit;
ObjectImg['Archive'] := -1;
ObjectImg.Post;Выдаётся сообщение: Цитата:
Все таблицы связаны Каскадно и на обновление и на удаление (позволительно в моём случае) В поисковиках удалось лишь найти информацию о том, что результат сJOINенных таблиц является статичным и его нельзя редактировать. Совершенно не ясно зачем тогда в БД у связей есть свойства OnUpdate и OnDelete. Что я делаю не так? Последний раз редактировалось Uniq!, 01.03.2016 в 17:36. |
|
#2
|
||||
|
||||
|
Я когда-то пытался сделать рабочими связи между таблицами с помощью свойств DataSource и MasterFields. С двумя таблицами такое работало. Но потом я перешел на принцип: все изменения в БД делаются с помощью хранимых процедур и эта проблема пропала.
|
| Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
Uniq! (01.03.2016)
| ||
|
#3
|
||||
|
||||
|
Вот для таких случаев и сделан LockType = ltBatchOptimistic и обработка через UpdateBatch
|
|
#4
|
||||
|
||||
|
Цитата:
А можно чуть подробнее? Я работал в этом режиме, но использовал его чтобы избежать постоянного обновления БД загружая в неё большой объём данных. Т.е. я сначала делал все изменения на клиенте, а потом переносил их в Базу командой UpdateBatch. Но там я работал с каждой таблицей в отдельности. |
|
#5
|
||||
|
||||
|
Суть идеи в том, что в этом режиме данные не пишутся сразу в базу, а хранятся в памяти этим и можно воспользоваться. Вот скажем у меня есть вот такая структура и запрос к ней:
Код:
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; |
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Uniq! (09.03.2016)
| ||