|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Join-запрос внутри ADODataSet с последующим изменением записей
Вопрос скорее из серии "реально ли...", а не "как".
Инструменты: MySQL DB, ADO, MySQL ODBC Connector 5.3 (в качестве драйвера соединения) Есть простой запрос в несколько JOIN'ов, которым в ADODataSet запихиваются данные. Для примера: пусть будет таблица Документы и таблица Контрагенты, связанные по: Документы.КонтрагентID = Контрагент.ID. в ADODataSet выполняется запрос: Код:
SELECT Контрагенты.ID AS КонтрагентID, Контрагенты.Название AS контрагентНазвание, Документы.ID AS ДокументID, Документы.КонтрагентID AS ДокументКонтрагентID, Документы.Номер AS ДокументНомер FROM Контрагенты JOIN Документы ON Документы.КонтрагентID = Контрагенты.ID У меня задача, дать пользователю возможность изменить владельца документа из интерфейса программы. Делаю я это вызовом диалогового окна, где просто меняется значение Документы.КонтрагентID: Код:
ADODataSet.Edit; ADODataSet['ДокументКонтрагентID'] := новыйКонтрагентID; ADODataSet.Post; Но в момент ADODataSet.Post появляется ошибка: Цитата:
Исходя из информации гугла, суть оказалась в том, что ADO криво обрабатывает вот это выражение из запроса: Код:
ON Документы.КонтрагентID = Контрагенты.ID Так вот, реально ли как-то заставить этот механизм работать? И может быть у кого-то есть рабочий пример с подобными махинациями? |
#2
|
|||
|
|||
Так не получится. Это ограничение by design в самом языке.
Тут 3 варианта: 1. Либо делаем обновление отдельным запросом с последующим переоткрытием основного. 2. Либо пишем Updatable View и читаем из нее. 3. Ну и последний вариант - делаем Master-Detail, т.е. без JION в основном запросе. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Uniq! (06.08.2017)
|
#3
|
||||
|
||||
Цитата:
1-ый вариант, это то, что я использую сейчас. Думал "костыли", а оказалось по делу. 3-ий вариант не подходит, уж больно здоровые таблицы. А про второй вариант можно поподробнее? Я нагуглил страницу с MySQL документацией по этому вопросу, но что-то не могу понять как это к Delphi прикручивается? |
#4
|
|||
|
|||
Цитата:
Ну, есть еще один вариант, только вспомнил. Можно использовать компонент TUpdateSQL (кажется, так) и его наследники. Там можно прописать правильные запросы на обновление, удаление и т.д. Тогда можно прямо по JOIN'у обновляться. По второму вариату - в базе создается VIEW, у него прописываются триггера на Update/Insert/Delete, тогда эта вью ничем не отличается от таблицы и с ней можно работать как с таблицей, т.е. обновлять, вставлять, удалять записи. Т.е. фактически переносим JOIN с клиента на сервер и прописываем как разбираться с разными полями при измненеии. Последний раз редактировалось lmikle, 07.08.2017 в 18:40. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Uniq! (08.08.2017)
|