Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2011, 21:10   #1
shatohingv
Новичок
Джуниор
 
Регистрация: 12.10.2011
Сообщений: 2
Радость ADOQuery и sql

добрый день. Нуждаюсь в помощи такого рода.
Имеется таблица в базе access (главная таблица) в нее записываются ключевые значения из других таблиц (второстипенных типа организация, клиенты и т.д.)
Отображаю в Dbgrid значения главной таблицы с подстановкой значений из второстипенных (тоесть не цивры а сопоставленные им значения из других таблиц) скрываю ключевые поля и тд. некрасивые и оставляю только поля: наименование организации и др.
Использую sql запросы.

Вопрос как мне поставивши курсор в Dbgrid на нужной записи (наименование организации) внести в нее изменения (не изменить содержимое а перезаписать туда новое ключевое поле из DBLookupComboBox)??
Заранее благодарен.

пробовал использовать update но указываю там наименование изменяемой таблицы, поля, а вот как указать строку выбранную в Dbgrid??
shatohingv вне форума Ответить с цитированием
Старый 12.10.2011, 22:10   #2
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от shatohingv Посмотреть сообщение
Отображаю в Dbgrid значения главной таблицы с подстановкой значений из второстипенных (тоесть не цивры а сопоставленные им значения из других таблиц) скрываю ключевые поля и тд. некрасивые и оставляю только поля: наименование организации и др.
Использую sql запросы.
Используются подстановочные поля? - они такой проблемы не создают.
SQL запрос в ADO может быть в двух компонентах - ADOQuery и ADODataSet если не ошибаюсь, если датасет, то проблемы нет, и в ADO ЕМНИП так называемые live запросы, т.е. записи ADOQuery тоже редактируемые, без дополнительного кода, и проблемы тоже нет.
Цитата:
Сообщение от shatohingv Посмотреть сообщение
Вопрос как мне поставивши курсор в Dbgrid на нужной записи (наименование организации) внести в нее изменения (не изменить содержимое а перезаписать туда новое ключевое поле из DBLookupComboBox)??
Всеже речь идет об изменении в главной или в справочнике?
И в чем разнича между "изменить" и "перезаписать" ???
Цитата:
Сообщение от shatohingv Посмотреть сообщение
пробовал использовать update но указываю там наименование изменяемой таблицы, поля, а вот как указать строку выбранную в Dbgrid??
Update чего? Или запрос на обновление? Если хочется так то в него ставится условие отбора по равенству ключевого поля, значения передаются через параметры:
Код:
Update megatable
set megavalue1=:MGVL1
where clyuchevoe_pole=:CLHPL1
его значение у выбранной записи можно получить из набора данных отображаемого в DBGrid:
Код:
MYDBGrid.DataSource.DataSet.FieldByName('clyuchevoe_pole').Value
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Старый 13.10.2011, 13:27   #3
shatohingv
Новичок
Джуниор
 
Регистрация: 12.10.2011
Сообщений: 2
По умолчанию

использую query
не использую подстановочные таблицы а просто указываю условие типа where company_id = kompany

показываю данные в dbgrid таким запросом

Код:
procedure Tmainform.Button4Click(Sender: TObject);
begin
sleep (30);
application.ProcessMessages;
dm.ADOQuery6.Active:=false;
 dm.ADOQuery6.SQL.Clear;
 dm.ADOQuery6.SQL.Add('select kompany, company_id, company_name, kontakt, fio, c_id, lico, l_id, l_lico, vtulka, v_id, v_razmer from company, zakaz, contakt, lico, vtulka');
 dm.ADOQuery6.SQL.Add('where company_id = kompany and c_id=kontakt and l_id=lico and v_id=vtulka');
dm.ADOQuery6.Active:=true;
dm.ADOQuery6.FieldByName('company_id').Visible:=false;
dm.ADOQuery6.FieldByName('kompany').Visible:=false;
dm.ADOQuery6.FieldByName('kontakt').Visible:=false;
dm.ADOQuery6.FieldByName('c_id').Visible:=false;
dm.ADOQuery6.FieldByName('l_id').Visible:=false;
dm.ADOQuery6.FieldByName('lico').Visible:=false;
dm.ADOQuery6.FieldByName('v_id').Visible:=false;
dm.ADOQuery6.FieldByName('vtulka').Visible:=false;
end;
изменит надо в главной таблице поле содержащие id номер из другой таблицы


В dbgrid имеются например поля kompany(в главной таблице содержит id номер записи из таблицы kompany) и kompany_name (другая таблица сожержит Имя ""ооо"и т.д.")
отображаю я только kompany_name а редактировать надо содержимое поля kompany



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 13.10.2011 в 13:47.
shatohingv вне форума Ответить с цитированием
Старый 14.10.2011, 10:03   #4
Junsui
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 12
По умолчанию

А поле kompany у Вас в какой таблице находится?

По вашему запросу довольно сложно понять, какое поле какой таблице принадлежит. Запросы правильнее писать в такой виде:
Код:
select z.kompany,
       cm.company_id,
       cm.company_name,
       z.kontakt,
       z.fio,
       ct.c_id,
       ct.lico,
       l.l_id,
       l.l_lico,
       l.vtulka,
       v.v_id,
       v.v_razmer
  from company cm, zakaz z, contakt ct, lico l, vtulka v
 where cm.company_id = z.kompany
   and ct.c_id = z.kontakt
   and l.l_id = ct.lico
   and v.v_id = l.vtulka
Поля естественно отнесла наобум...
Junsui вне форума Ответить с цитированием
Старый 14.10.2011, 10:35   #5
Junsui
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 12
По умолчанию

Вам бы создавать форму для редактирования записи Вашей главной таблицы (я так понимаю, что это таблица zakaz) и потом сохранять изменения - динамически создаем TADOQuery и свойство SQL добавляем приблизительно запрос:
Код:
Update zakaz z
set z.kompany = :in_company,
z.fio = :in_fio и т.д.
where z.id = :in_ind
Затем в параметры присваиваете данные
Код:
ADOQuery1.paramByName('in_ind').asString := edit1.text;
ADOQuery1.paramByName('in_company').asInteger :=DBLookupCombo1.Value; //например так и т.д.
Query1.ExecSQL; //Выполняем запрос
Junsui вне форума Ответить с цитированием
Старый 14.10.2011, 11:52   #6
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Цитата:
Сообщение от shatohingv Посмотреть сообщение
Код:
 dm.ADOQuery6.SQL.Add('select kompany, company_id, company_name, kontakt, fio, c_id, lico, l_id, l_lico, vtulka, v_id, v_razmer from company, zakaz, contakt, lico, vtulka');
 dm.ADOQuery6.SQL.Add('where company_id = kompany and c_id=kontakt and l_id=lico and v_id=vtulka');
изменит надо в главной таблице поле содержащие id номер из другой таблицы
Ага "вот где собака порылась". Объединение таблиц через where - называется неявным, и работает на выборку данных, а на изменение - вот и проблемы. В Access'e попробуйте связи натянуть в штатной схеме данных, связь натягивается визуально а реально при конструировании запросов с участием связанных таблиц используется явное связывание с использованием INNER JOIN.
Там сразу код запроса можно взять и синтаксис посмотреть.
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных. ADOQuery SQL Zohei Помощь студентам 2 01.05.2010 15:28
ADOQuery + SQL-выборка по дате!!! $T@LKER БД в Delphi 14 19.04.2010 11:34
Структура ADOQuery.SQL.Add Explosion БД в Delphi 3 17.04.2010 07:11
ADOQuery.SQL skymaster Общие вопросы Delphi 1 15.06.2009 20:27