Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.04.2009, 17:54
czuryk czuryk вне форума
Прохожий
 
Регистрация: 23.01.2009
Сообщения: 12
Репутация: 10
По умолчанию DBGrid и сложный запрос

Приветствую братьев программеров!
Уже не один день бьюсь над решением задачи.

Нужно стандартным набором (ADOConnection, ADODataSource, ADOTable или ADOQuery и конечно же DBGrid), реализовать некоторую систему.
Суть конкретики заключается в том, что есть база MSSQL, в которой, примерно 5 таблиц, и есть одна таблица, которая эти таблицы собирает в одну по индексам. И по вычисляемым критериям.
В итоге в BDGrid, выводятся собранная таблица, уже с конкретными значениями вместо ID-шников, я написал для ADOQuery запросище и у меня все отлично работает, но вот теперь главный косяк, у меня должно одно поле из этого выбираться из списка! Не беда! Я сделал как рассказано вот тут http://delphi.about.com/od/usedbvcl/l/aa092703a.htm и у меня все получилось, Проблема только одна, за UPDATить выбранную информацию из списка DBGrid->ADOQuery не может, так как пытается записать не в нужную таблицу (т.е. нужно прописать индекс нужного элемента в связующую таблицу), а в другую. И я его понимаю, весь запрос сосотоит из сплошных JOINов...
Сделал попытку разбить все на подстановки, т.е. несколько основную и дополнительные TABLE, в которой поля типа Lookup, но у меня почему-то Unknown Error выпадает, хотя связал вроде правильно, но даже если это и заработает, я всеравно не уверен что все это поможет.

Есть варианты как решить эту проблему?
Ответить с цитированием
  #2  
Старый 20.04.2009, 19:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Вариант очевиден. Поскольку у вас MSSQL то напишите хранимку с тучей параметров, которая знает куда и какое значение распихать по таблицам.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 20.04.2009, 20:40
czuryk czuryk вне форума
Прохожий
 
Регистрация: 23.01.2009
Сообщения: 12
Репутация: 10
По умолчанию

Спасибо за идею!

Вот только один нюанс, я с ними до этого никогда не работал, если тебе не очень сложно, можешь помочь разобраться как лучше это реализовать (приминимо к моей задаче)...
Про саму идиологию хранимых процедур, я конечто же почита.

Последний раз редактировалось czuryk, 20.04.2009 в 20:51.
Ответить с цитированием
  #4  
Старый 20.04.2009, 21:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну вот допустим есть запрос вида:
Код:
select Table1.Field1,Table2.Field1 from Table1 left join Table2 on Table1.ID=Table2.ID
Очевидно наш запрос необновляемый т.к. нет возможности однозначно определить скока и куда положить, а нам позарез надо в Table1 и Table2 положить значения.
Мы тогда вызываем хринимку:
Код:
AdoStoredProc1.ProcedureName := 'UpdateTable1Table2;1';
AdoStoredProc1.Parameters.ParamValues['ID'] := 1;
AdoStoredProc1.Parameters.ParamValues['Val1'] := 'Новое значение Table1Field1';
AdoStoredProc1.Parameters.ParamValues['Val2'] := 'Новое значение Table2Field1';
AdoStoredProc1.ExecProc;

а на сервере у нас есть хранимка:
Код:
create procedure UpdateTable1Table2(@ID int, @Val1 as varchar(50),@Val2 as varchar(50))
as 
begin
 update table Table1 set Field1=@Val1 where Id = @ID
 update table Table2 set Field1=@Val2 where Id = @ID
end
Если не наврал с синтаксисом, то где-то так.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 20.04.2009, 21:43
czuryk czuryk вне форума
Прохожий
 
Регистрация: 23.01.2009
Сообщения: 12
Репутация: 10
По умолчанию

А как мне это увязать с DBGrid и что более того - с DBComboBox?
Дело в том, что обновление вызывается не явно, оно вызывается событием обновления DBGrid и происходит вне поля моего контроля. Я могу только перехватить еще событием BeforeEdit, но грамотно вмешатся уже сложнее.

Последний раз редактировалось czuryk, 20.04.2009 в 21:46.
Ответить с цитированием
  #6  
Старый 21.04.2009, 11:00
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ага, дошло наконец что вы хотите. Вы хотите выводить в грид запрос, и в гриде же править его результат? Тогда конечно то что я вам понаписал, мало вам подходит. Вы выложите сюда свой "запросище", будет понятнее проблема.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 21.04.2009, 19:40
czuryk czuryk вне форума
Прохожий
 
Регистрация: 23.01.2009
Сообщения: 12
Репутация: 10
По умолчанию

Мне посоветовали поэксперементировать с Unique Table, в ходе которых проанализировал более глубоко, мой способ получения данных и понял что с ним самим проблемы. Т.е. у меня таблица которую нужно изменить, она на самом деле косвенная, (т.е. запрос примерно такой: SELECT a.aaa, b.bbb c.ccc FROM table1 a INNER JOIN table2 b ON a.id=b.field_id LEFT JOIN table3 c ON c.id = (SELECT id FROM table4 WHERE тра-ляля, где table4 и является таблицей, в которую нужно записать обновление) и соответственно Unique Table не помогает. Т.к. он даже ее не видит. Тогда я немного перестроил запрос, включив нужную мне таблицу в LEFT JOIN и стало чуть лучше, он нашел таблицу, но не смог внести изменения т.к. не смог найти правильные ключевые поля и я его понимаю, т.к. в DBGrid-е больше никаких полей кроме того, единственного из table4 нет. Вот в этом и проблема. И никак мне больше запрос свой не перестроить...
Просто у меня есть особенность.
Есть таблица с наименованием объеков, которая выводится в DBGrid всегда, остальные ячейки получают информацию по связям с другими таблицами, если эта информация есть, и должно менятся одна из ячеек, которая в режиме запроса является только справочником, а не основной таблицей.
В этом примере, http://www.delphikingdom.ru/asp/view...?catalogid=420 тоже происходит подобное, но толи там больше полей в таблице, толи еще из-за чего у меня это не работает... ругается на PK, как я писал выше.
Вот такие дела...
Ответить с цитированием
  #8  
Старый 23.04.2009, 17:40
krasnov krasnov вне форума
Прохожий
 
Регистрация: 23.04.2009
Адрес: Ростов-на-Дону
Сообщения: 1
Репутация: 10
Сообщение

Попробуйте использовать стиль cbsEllipsis (свойство ButtonStyle у столбца (TColumn) DBGrid), т.е. выбирать значения по нажатию кнопки, а не выбор из списка. Так вы реализуете любую логику, в том числе и запись с помощью процедуры, при желании конечно.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:06.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter