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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2015, 12:27   #1
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
Восклицание Связывание таблиц

На форме имеется combobox который отображает данные из базы (таблицы customer).

Код:
procedure TForm1.FormShow(Sender: TObject);
begin
  ComboBox1.Items.Clear;
  while not ADOQuery3.EOF do
  begin
    ComboBox1.Items.Add(ADOQuery3.FieldByName('customer').AsString);
    ADOQuery3.Next;
  end;

Так же имеются dbgrid (таблицы address) и dbnavigator для изменения/вставки записи в базе. При выборе поля в Combobox, хотелось бы, чтобы можно было менять запись в базе с помощью dbgrid.



Код:
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  ADOquery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('select * from address where c_id='+ADOQuery3.FieldByName('c_id').asString);
  ADOQuery1.Open;
end;

Koд для вставки новой записи:
Код:
procedure TForm1.ADOQuery1NewRecord(DataSet: TDataSet);
begin
ADOQuery1.FieldByName('c_id').asInteger:=ADOQuery3.FieldByName('c_id').AsInteger;
end;
2 Таблицы в базе (Combobox и DbGrid) связанны ключом (id). При вставки записи берется один и тот же ключ (из таблицы customer), например id равен всегда 12 не зависимо какое поле я в Comboboxe выбираю. Я в этом совсем новичок, помогите пожалуйста, очень нужно....

Последний раз редактировалось Jenny89; 14.07.2015 в 12:45.
Jenny89 вне форума Ответить с цитированием
Старый 14.07.2015, 13:09   #2
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Помогите пожалуйста, очень важно. Может проблема в коде, я в этом совсем новичок
Jenny89 вне форума Ответить с цитированием
Старый 14.07.2015, 13:19   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Jenny89, а поясните, почему не воспользовались DBComboBox ?
там можно получать ключевое значение без дополнительных "танцев с бубном".
А если всё же нужно использовать ComboBox, тогда нужно позаботиться и о сохранении где-то ключевого поля (c_id) и по нему делать то, что Вам нужно, например, позиционироваться в датасете, с которым у Вас связан DBGrid...

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

Последний раз редактировалось Serge_Bliznykov; 14.07.2015 в 13:24.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.07.2015, 13:30   #4
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Дело в том что я в начале использовала DBCombobox, все тоже самое выходило, потом начала с Combobox пробовать
Jenny89 вне форума Ответить с цитированием
Старый 14.07.2015, 13:31   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
При вставки записи берется один и тот же ключ (из таблицы customer), например id равен всегда 12 не зависимо какое поле я в Comboboxe выбираю.
Правильно, поскольку вы никак не пользуетесь информацией combobox. А Query3 данными которого вы пользуетесь, ПОСЛЕ заполнения того самого comboBox (после formShow) имеет текущей строкой(записью) последнюю (с ID =12) и НИКАК не отслеживает (не реагирует) на изменения в ComboBox.
Ни он(query), ни comboBox знать друг про друга ничего не знают.
Надо
Либо хранить в ComboBox значения всех ID связанных со строками.
Код:
ComboBox1.Items.AddObject(ADOQuery3.FieldByName('customer').AsString, Pointer(ADOQuery3.FieldByName('ID').AsInteger));
И использовать ЭТО значение.
Код:
j:=comboBox1.itemIndex; //номер текущей строки 
if j>=0 then // А выбрана ли строка ?
   AdoQuery1.FieldByName('c_id').AsInteger:=Integer(comboBox1.Items.Objects[j]); //достаем из нужной(текущей) строки запомненное значение !
Либо перейти к DB компонентам реализующим списки с тем чтобы они могли и управляли текущей позицией в Query3 в соответствии со свой позицией.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 14.07.2015, 13:50   #6
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Правильно, поскольку вы никак не пользуетесь информацией combobox. А Query3 данными которого вы пользуетесь, ПОСЛЕ заполнения того самого comboBox (после formShow) имеет текущей строкой(записью) последнюю (с ID =12) и НИКАК не отслеживает (не реагирует) на изменения в ComboBox.
Ни он(query), ни comboBox знать друг про друга ничего не знают.
Надо
Либо хранить в ComboBox значения всех ID связанных со строками.
Код:
ComboBox1.Items.AddObject(ADOQuery3.FieldByName('customer').AsString, Pointer(ADOQuery3.FieldByName('ID').AsInteger));
И использовать ЭТО значение.
Код:
j:=comboBox1.itemIndex; //номер текущей строки 
if j>=0 then // А выбрана ли строка ?
   AdoQuery1.FieldByName('c_id').AsInteger:=Integer(comboBox1.Items.Objects[j]); //достаем из нужной(текущей) строки запомненное значение !
Либо перейти к DB компонентам реализующим списки с тем чтобы они могли и управляли текущей позицией в Query3 в соответствии со свой позицией.
Спасибо. Скажите если я использую DBCombobox и при этом datasource, datafield у DBCombobox задан, но в DBGrid все равно (как и с простым Combobox) заносится последняя строка ID (12), что в этом случаи не так?
Jenny89 вне форума Ответить с цитированием
Старый 14.07.2015, 15:51   #7
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Скажите если я использую DBCombobox и при этом datasource, datafield у DBCombobox задан, но в DBGrid все равно (как и с простым Combobox) заносится последняя строка ID (12), что в этом случаи не так?

Подскажите кто нибудь, важно!!

Последний раз редактировалось Jenny89; 14.07.2015 в 16:32.
Jenny89 вне форума Ответить с цитированием
Старый 14.07.2015, 19:06   #8
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
При выборе поля в Combobox, хотелось бы, чтобы можно было менять запись в базе с помощью dbgrid.
Каторый вы выбрали Combobox -е ?
Цитата:
Подскажите кто нибудь,
Выбирайте данных Combobox-е из полеи (Name) примерно есть поля
(Name)
-------------
Чай
Кофе
Сохар
----------------
Вы на пример выбрали Кофе и что надо потом ?

Последний раз редактировалось xxbesoxx; 14.07.2015 в 19:15.
xxbesoxx вне форума Ответить с цитированием
Старый 14.07.2015, 20:39   #9
Jenny89
Пользователь
 
Регистрация: 14.07.2015
Сообщений: 30
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Каторый вы выбрали Combobox -е ?

Выбирайте данных Combobox-е из полеи (Name) примерно есть поля
(Name)
-------------
Чай
Кофе
Сохар
----------------
Вы на пример выбрали Кофе и что надо потом ?
объясню на моем примере: В Combobox-e выбираю клиента например Иван Петров, после этого в DBGrid-e высвечивается/ются адрес/aдреса выбранного клиента (Ивана Петрова), которые можно изменять или добавить(если поле пустое).

Первичный ключ ( например id Ивана Петрова = 3) таблицы "клиент" равен внешнему ключу таблицы "адрес", как то так....

Вообщем в DBCombobox-e я выбираю Ивана Петрова, в DBGrid-e вписываю адрес, и тут адрес Ивана Петрова получает автоматически внешний ключ (id) не 3, a 12 (id последнего клиента)

Последний раз редактировалось Jenny89; 14.07.2015 в 20:47.
Jenny89 вне форума Ответить с цитированием
Старый 14.07.2015, 21:37   #10
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
объясню на моем примере: В Combobox-e выбираю клиента например Иван Петров, после этого в DBGrid-e высвечивается/ются адрес/aдреса выбранного клиента
1)
Код:
procedure TForm1.FormShow(Sender: TObject);
begin
  ComboBox1.Items.Clear;
  while not qryCust.EOF do
  begin
    ComboBox1.Items.Add(qryCust.FieldByName('C_name').AsString);
    qryCust.Next;
end;
end;
2)
Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 if ComboBox1.Text<>'' then
 begin
   with qryCust do
    begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT* FROM Cust ');
        SQL.Add('WHERE C_name = '''+ ComboBox1.Text +'''');
        Open;
    end;
 end;
end;
3)
Код:
procedure TForm1.qryCustAfterScroll(DataSet: TDataSet);
begin
  if qryCust.FieldByName('C_id').AsString<>'' then
    begin
      with qryAdress do
      begin
        Filtered:=False;
        Filter:='Cust_ID ='+qryCust.FieldByName('C_id').AsString;
        Filtered:=True;
      end;
    end;
end;
Цитата:
которые можно изменять или добавить
Это изменять или добавить сам будите делать ?
Изображения
Тип файла: jpg 1.jpg (28.8 Кб, 60 просмотров)
Вложения
Тип файла: rar PK_FK.part1.rar (500.0 Кб, 7 просмотров)
Тип файла: rar PK_FK.part2.rar (45.4 Кб, 6 просмотров)

Последний раз редактировалось xxbesoxx; 14.07.2015 в 21:45.
xxbesoxx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связывание таблиц Pyxy Microsoft Office Access 1 12.11.2013 07:22
Связывание таблиц Pyxy Microsoft Office Access 0 30.10.2013 18:05
Связывание таблиц Nastya_cutie Microsoft Office Excel 6 06.03.2012 18:04
связывание таблиц RamireZ БД в Delphi 0 25.05.2010 15:40
Связывание таблиц stscolt БД в Delphi 0 21.03.2010 11:29