Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
1

DBGrid с двумя таблицами

06.10.2016, 19:57. Просмотров 1081. Ответов 41
Метки нет (Все метки)

в MS SQL созданы две таблицы.
как в 1 DBGrid закинуть определенные поля из двух таблиц?
в дальнейшем эти таблицы будут изменятся(добавление. удаление записей)
(представление которое можно создать и использовать ..этот вариант уже попробовал ... но с добавлением данных проблемы .якобы нельзя добавлять в такие таблицы из-за того что может повлиять на изменение записей в используемых таблицах)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
Form1.ADOQuery1.SQL.Clear;
Form1.ADOQuery1.SQL.Text:='insert into ViewClientCar(name, surname,lastname,model,produce_year,gos_number) Values(:name, :surname, :lastname, :model, roduce_year, :gos_number )';
Form1.ADOQuery1.Parameters.ParamByName('name').Value:=Edit1.Text;
Form1.ADOQuery1.Parameters.ParamByName('surname').Value:=Edit2.Text;
Form1.ADOQuery1.Parameters.ParamByName('lastname').Value:=Edit3.Text;
Form1.ADOQuery1.Parameters.ParamByName('model').Value:=Edit4.Text;
Form1.ADOQuery1.Parameters.ParamByName('produce_year').Value:=Edit5.Text;
Form1.ADOQuery1.Parameters.ParamByName('gos_number').Value:=Edit6.Text;
Form1.ADOQuery1.ExecSQL;
Form1.ADOQuery1.Close;
 
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2016, 19:57
Ответы с готовыми решениями:

Запрос с двумя таблицами
Здравствуйте, помогите составить SQL запрос с двумя таблицами(Access база)....

Создание запроса с двумя таблицами
Здравствуйте, помогите пожалуйста составить запрос, состоящий из двух таблиц....

DBgrid связь между таблицами
Дело в том, что у меня полетела одна функция, а вернуть её я не знаю как, суть...

Работа с таблицами DBGrid Delphi7
У меня ест DBGrid,Button. В DBGride есть таблица, поля ('m1') и поля('m2'). В...

Переход с DBGrid'a к DBEdit'y между таблицами
Здравствуйте! Скажите пожалуйста как реализовать следующее: Есть таблицы: 1...

41
kwinto
55 / 83 / 24
Регистрация: 27.02.2010
Сообщений: 397
09.10.2016, 19:08 21
и в воздух чепчики бросали))))
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 22:23  [ТС] 22
kwinto, сейчас новый вопрос )
как в запросе select ! в части where присвоить idOwnerУ результат из ComboBox.ItemIndex


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if ComboBox1.ItemIndex=0 then begin
   label4.Caption:='Редактируем имя';
   if ComboBox2.ItemIndex=0 then  // если id выбран 1 то 
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='select FirstName from Owners where idOwner=1';
ADOQuery1.Open;
Label6.Caption:= ADOQuery1.Fields[0].AsString; // выводим имя  владельца чей ид =1
ADOQuery1.Close;
end;
if COmboBox2.ItemIndex=1 then begin  // если ид выбран 2 то уже другой человек .
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='select FirstName from Owners where idOwner LIKE  ComboBox1.Items;' ; пытался автоматизировать
ADOQuery1.Open;
Label6.Caption:=ADOQuery1.Fields[0].AsString;
   end;
 
   end;
вот ладно если 2-3 записи..не в лом написать несколько раз if combobox и одинаковый sql запрос только ид другой...
а если данных больше 10 шт? .. примерная форма !
в первой мы выбираем ИМЯ-фамилию и т.д и в дальнейшем выводится в лабел что будем редактировать.. и т.д

Delphi
1
2
3
4
5
6
7
8
if ComboBox1.ItemIndex=0 then begin
   label4.Caption:='Редактируем имя';
 
 
if ComboBox1.ItemIndex=1 then
   label4.Caption:='Редактируем фамилию';
   и т.д
   end;
0
Миниатюры
DBGrid с двумя таблицами  
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 22:32  [ТС] 23
и правильно ли будет выглядеть запрос на обновление данных?
SQL
1
UPDATE Owners SET FirstName VALUES(:Data1) WHERE id= .... но сюда бы тоже  хотелось бы вставить данные из Combobox
и в дальнейшем
AdoQuery1.Parameters.ParamByName('Data1').Value:=Edit1.Text; берем из -Ввод данных
0
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
09.10.2016, 23:08 24
Для этого нужно использовать DBLookupCombobox (пожалуй, второй и последний компонент, который имеет префикс DB и который можно использовать в любом проекте).
1. Разместить на форме отдельный ADOTable с привязкой через свой DataSource к нужной таблице.
2. В своействе ListSource DBLookupCombobox указать этот DataSource (свойство DataSource компонента не трогать).
3. В свойстве ListField указать поле из связанной таблицы которое будет отображаться для пользователя (допустим, имя).
4. В свойстве KeyField указать поле-идентификатор (ID).
5. При запуске не забыть открыть ADOTable (ADOTable1.Open).

Чтобы узнать значение ID, выбранного пользователем из выпадающего списка пункта используют свойство KeyValue.
Например.
Delphi
1
2
  ADOQuery1.SQL.Text := 
       'select FirstName from Owners where idOwner='+IntToStr(DBLookupCombobox.KeyValue);
1
MyEternity
96 / 96 / 25
Регистрация: 25.04.2016
Сообщений: 525
09.10.2016, 23:19 25
Цитата Сообщение от diegovoin Посмотреть сообщение
вот ладно если 2-3 записи..не в лом написать несколько раз if combobox и одинаковый sql запрос только ид другой...
а если данных больше 10 шт? .. примерная форма !
Вот для таких случаев я просто использую хранимку на MSSQL. Которая принимает несколько параметров: например тип значения, и само значение. Если вам надоест на каждый Edit писать Insert/Update то посмотрите в эту сторону.
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 23:33  [ТС] 26
Скандербег, попробую! спасибо!Скандербег, сделал.. вставил ..но свойства KeyValue не могу найти! я как понимаю это свойства аналогично Items
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 23:34  [ТС] 27
Скандербег, и не активный он (..
0
Миниатюры
DBGrid с двумя таблицами  
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
09.10.2016, 23:42 28
KeyValue свойство не публичное и его не видно в инспекторе объектов.
Чтобы активизировать нужно чтобы DataSet (ADOTable) с ним связанный был открыт (был активным), пункт 5 из моей инструкции.
А зачем на форме идентификатор?

Добавлено через 7 минут
Сейчас не мешало бы выложить проект с базой. Помощь будет более эффективной.
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 23:43  [ТС] 29
Скандербег, Мы выбираем что редактировать 1 комбо в нем - фамилия имя отчество . данные авто и т.д
индентификатором мы уточняем .. у кого редактируем ..
а через обычный комбобокс можно это сделать?
0
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
09.10.2016, 23:44 30
Можно и через обычный, но через DBLookupCombobox проще и без ненужной писанины.
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 23:44  [ТС] 31
Скандербег, пожалуйста) правда бред еще ну да ладно)
0
Вложения
Тип файла: rar sqlCars.rar (496.3 Кб, 5 просмотров)
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
09.10.2016, 23:47 32
Цитата Сообщение от diegovoin Посмотреть сообщение
индентификатором мы уточняем .. у кого редактируем ..
Это не требуется.
Значение идентификаторов не должны мешать пользователю, т.к. он все равно их не может ни редактировать, ни как либо использовать.

Добавлено через 1 минуту
Цитата Сообщение от diegovoin Посмотреть сообщение
правда бред еще ну да ладно
Чепуха, все прекрасно понимают, кто пишет и не обращают внимание на "бред".
Если БД откроется, то посмотрю в части лукапа чего не так.
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 23:48  [ТС] 33
Скандербег, ну ...в общем я уже запутался . проект кинул... а щас запускаю и ошибки...чтоб его!
0
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
09.10.2016, 23:55 34
Любопытно узнать, что предполагается редактировать на форме 3?
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
09.10.2016, 23:58  [ТС] 35
Скандербег, Форма 3 это как мульти редактор .. редактируем поля из таблиц Owners и Cars
в комбобоксе 1 естественно выбираем что редактировать -Имя фамилия ... Модель авто и т.д
если имя и фамилия то запрос идет на таблицу Owners а если модель авто или гос номер то идем в cars

мне бы сейчас эту часть разобрать .. дальше будет практически все по аналогии
сам запрос на обновление еще не успел вставить в делфи
0
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
10.10.2016, 00:05 36
Но так не делают. Для владельца и авто нужны отдельные формы, т.к. по определению у них разные структуры данных,
а, следовательно, и состав компонентов для ввода данных тоже разный.
Комбобокс (лукапКомбобокс) требуется в текущей ситуации только для редактирования данных по автомобилям (табл. cars), где нужно будет выбрать соответствующего владельца.
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
10.10.2016, 00:08  [ТС] 37
Скандербег, так я хотел через условие... использователь отдельные АДОквери....блин.............можешь внести свою идею в проект?
0
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
10.10.2016, 00:15 38
Идею я уже озвучил: для каждой таблицы своя форма для добавления данных и их редактирования.
Отдельные ADOQuery здесь ни при чем. Нужно иметь один который будет добавлять данные в разные таблицы.

Его размещают (равно как и общий компонент ADOConnection) на специальной форме, которую зовут DataNodule.
Удобна тем, что при разработке проекта есть куда положить не визуальные компоненты для разных нужд и общего достояния.
0
diegovoin
0 / 0 / 0
Регистрация: 13.04.2014
Сообщений: 98
10.10.2016, 00:17  [ТС] 39
Скандербег, хорошо..но ... как данные комбобокса вставить в запрос? не db...и т.д
0
Скандербег
939 / 895 / 297
Регистрация: 07.08.2012
Сообщений: 2,496
10.10.2016, 00:36 40
Упорство достойное другого применения.

1. Надо выбрать данные из таблицы (через ADOTable, к примеру).
2. В цикле while not ADOTable.Eof do ... вставить данные: имя для выбора и идентификтор
Delphi
1
  ComBoBox1.AddObject(ADOTable['LastName'], TObject(ADOTable.FieldByName('IDOwner').AsInteger);
3. Для изъятия идентификатора нужно приложить тоже немалые усилия:
Delphi
1
'... IDOwner = ' + IntToStr(Integer(ComBoBox1.Items.Objects[ComBoBox1.ItemIndex]))
Ну что, вдохновляет?
А при использование DBLookupComboBox'а только нужно взять значение свойства KeyValue, а выше приведенная писанина не требуется.

Добавлено через 4 минуты
И лукапкомбобокс не активен, разумеется, потому что не выполнены как нужно инструкции, приведенные в посте #24.
0
10.10.2016, 00:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2016, 00:36

Вопрос про связь между двумя таблицами
Привет всем. Помогите встать на путь истинный что-то я немного запутался. В...

Как создать связь между двумя таблицами
Я создала две таблицы в Database Desktop, но не могу их связать один-ко-многим....

Создание связи между двумя таблицами MS Access, используя ADOQuery
Здравствуйте! У меня в Access есть две связанные между собой таблицы. Я в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru