|
|
Регистрация | << Правила форума >> | 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)
|