Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Связь реляционной бд и DBGrid 
V
    Опции темы
Eva1
Дата 20.3.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Всем привет!

Существует такая проблема:

Имеются таблицы: FIO(id, fio), Address(id, address, telephone), Address_Book(id, fio_id, address_id, birtday) в базе данных MSAccess2000.

С помощью запроса :
Код

ADOQuery1.SQL.Add('select f.fio as ФИО, a.address as адрес, a.telephone as телефон, ab.birtday as день_рождения');
ADOQuery1.SQL.Add('from FIO as f, Address as a, Address_Book as ab ');
ADOQuery1.SQL.Add('where ab.address_id=a.id and ab.fio_id=f.id;');

отображаем данные таблиц в DBGrid.

Далее, когда добавляем новые записи в DBGrid таблицы FIO и Address дополняются, а таблица Address_Book нет.
Как можно решить эту проблему?

ЗАРАНЕЕ СПАСИБО!


PM MAIL   Вверх
Vas
Дата 21.3.2006, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Eva1 @ 20.3.2006, 22:41 Найти цитируемый пост)
Далее, когда добавляем новые записи в DBGrid таблицы FIO и Address дополняются, а таблица Address_Book нет.
Как можно решить эту проблему?

Запретить редактировать данные в DBGrid. А при добавлении записи показывать пользователю модальное диалоговое окно.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
bas
Дата 21.3.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

Репутация: 1
Всего: 2



Цитата(Eva1 @ 20.3.2006, 22:41 Найти цитируемый пост)
Далее, когда добавляем новые записи в DBGrid таблицы FIO и Address дополняются, а таблица Address_Book нет

А почему она должна дополняться? По собственному желанию?
PM MAIL   Вверх
Eva1
Дата 21.3.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Цитата

А почему она должна дополняться? По собственному желанию?

Почему не добавляется по собственному желанию я, наверно, понимаю: в таблице Address_Book полю fio_id и address_id не присваиваются значения FIO.id и Address.id, но может в DBGrid есть какой-то умный обработчик событий, который может это сделать?

Диалоговое окошко пока использовать не хочется, если это конечно не единственный вариант.

ЗАРАНЕЕ СПАСИБО!


PM MAIL   Вверх
SergeBS
Дата 21.3.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Eva1,
1. LookupField.
2. ADOdataset.
И диалоговые окошки будут не нужны.
PM MAIL   Вверх
Eva1
Дата 23.3.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



БОЛЬШОЕ СПАСИБО, SergeBS!
Пытаюсь сделать то, что вы посоветовали, но возникают ошибки.
Не мог бы кто-нибудь подсказать в чем проблема?

В ADODataSet1 установлены такие свойства:

CommandText - select id, fio, address_id, address_id , birtday from Address_Book
Connection - ADOConnection1

Столбцы введены с помощью Add fields в редакторе столбцов: id, fio, Expr1002, address_id, birtday.

Свойства Expr1002:
FildKind - fkLookup
KeyFilds - id
LookupDataSet - ADODataSet2
LookupKeyFilds - id
LookupResultFild - address

Свойства address_id:
FildKind - fkLookup
KeyFilds - id
LookupDataSet - ADODataSet2
LookupKeyFilds - id
LookupResultFild - telephone

В ADODataSet2 установлены такие свойства:

CommandText - select id, address, telephone from Address
Connection - ADOConnection1
Столбцы введены с помощью Add all fields в редакторе столбцов.

Когда пытаешься активизировать ADODataSet1 выводится ошибка:
Invalid value for field 'Expr1002'.



PM MAIL   Вверх
SergeBS
Дата 24.3.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Eva1,
Цитата

Когда пытаешься активизировать ADODataSet1 выводится ошибка:
Invalid value for field 'Expr1002'.

Значит в таблице Address_book где-то есть значение (id), которого нет в справочнике Address. Да, что за дичь: в одном справочнике и телефон и адрес? Они между собой не связаны, т.е. телефонов может быть несколько (рабочий, домашний, мобила), они могут меняться. Аналогично с адресом: дурной тон держать весь адрес в одном поле. Это тогда не адрес, а контактная информация.
PM MAIL   Вверх
Eva1
Дата 24.3.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Спасибо, будем исправлять эту дичь, если других ошибок нет.
PM MAIL   Вверх
Eva1
Дата 24.3.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Таблицы переделаны: Address(id, address), Telephone(id, telephone), Address_Book(id, fio, address_id, telephone_id, birtday) - база данных MSAccess2000.

Адрес пусть будет пока в одном поле, так как не представляю, как будет смотрется в качестве LookupField номер дома и квартира.

DBGrid выводит строку из БД, толко в полях Lookup пусто и туда ничего нельзя записать.

Привожу часть файла описания, чтобы ничего не упустить:
Код

  object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString =
      'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=bd.mdb;Persist Secu' +
      'rity Info=False'
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 160
    Top = 304
  end
  object ADODataSet1: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select id, address from Address'
    Parameters = <>
    Left = 208
    Top = 304
    object ADODataSet1id: TAutoIncField
      FieldName = 'id'
      ReadOnly = false
    end
    object ADODataSet1address: TWideStringField
      FieldName = 'address'
      Size = 50
    end
  end
  object ADODataSet2: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select id, telephone from Telephone'
    Parameters = <>
    Left = 240
    Top = 304
    object ADODataSet2id: TAutoIncField
      FieldName = 'id'
      ReadOnly = false
    end
    object ADODataSet2telephone: TWideStringField
      FieldName = 'telephone'
      Size = 50
    end
  end
  object ADODataSet3: TADODataSet
    Active = True
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText =
      'select id, fio, telephon_id, address_id, birtday from Address_Bo' +
      'ok'
    Parameters = <>
    Left = 280
    Top = 304
    object ADODataSet3id: TAutoIncField
      DisplayWidth = 12
      FieldName = 'id'
      ReadOnly = false
    end
    object ADODataSet3fio: TWideStringField
      DisplayWidth = 30
      FieldName = 'fio'
      Size = 50
    end
    object ADODataSet3address_id: TIntegerField
      DisplayWidth = 25
      FieldKind = fkLookup
      FieldName = 'address_id'
      LookupDataSet = ADODataSet1
      LookupKeyFields = 'id'
      LookupResultField = 'address'
      KeyFields = 'address_id'
      Lookup = True
    end
    object ADODataSet3telephon_id: TIntegerField
      DisplayWidth = 27
      FieldKind = fkLookup
      FieldName = 'telephon_id'
      LookupDataSet = ADODataSet2
      LookupKeyFields = 'id'
      LookupResultField = 'telephone'
      KeyFields = 'telephon_id'
      Lookup = True
    end
    object ADODataSet3birtday: TDateTimeField
      DisplayWidth = 15
      FieldName = 'birtday'
    end
  end
  object DataSource1: TDataSource
    DataSet = ADODataSet3
    Left = 320
    Top = 304
  end

Кто-нибудь может помочь советом?

ЗАРАНЕЕ СПАСИБО!
PM MAIL   Вверх
Eva1
Дата 26.3.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Кто знает почему поля Lookup не выводят записи и их нельзя редактировать?

Таблицы: Address(id, address), Telephone(id, telephone), Address_Book(id, fio, address_id, telephone_id, birtday) - база данных MSAccess2000.
На форме размещены элементы: ADOConnection1; ADODataSet1, ADODataSet2, ADODataSet3, связанные с ADOConnection1; DataSource1, связанный с ADODataSet3; DBGrid1, связанная с DataSource1.

В ADODataSet3 установлено такое свойство:
CommandText - select id, fio, address_id, telephone_id , birtday from Address_Book
Столбцы введены с помощью Add all fields в редакторе столбцов.

telephone_id:

FildKind - fkLookup
KeyFilds - telephone_id Что здесь надо устанавливать id либо telephone_id? И так и так один результат.
LookupDataSet - ADODataSet1
LookupKeyFilds - id
LookupResultFild - address

address_id:

FildKind - fkLookup
KeyFilds - address_id
LookupDataSet - ADODataSet2
LookupKeyFilds - id
LookupResultFild - telephone

В ADODataSet2 установлено такое свойство:
CommandText - select id, address from Address
Столбцы введены с помощью Add all fields в редакторе столбцов.

В ADODataSet1 установлено такое свойство:
CommandText - select id, telephone from Telephone
Столбцы введены с помощью Add all fields в редакторе столбцов.

Нет ли в этом ошибок?





PM MAIL   Вверх
SergeBS
Дата 27.3.2006, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Eva1,
Ну что, совсем лень доки читать smile? Проще 2 дня тыкать в кнопки?
Еще раз:
1. СОЗДАЕТСЯ лукап-поле. Field-New. type - string, length = length(telephone). Реально его в таблице НЕТ!
2. Radiogroup ->field type = lookup.
3. Ниже - dataset - где реальное поле. Key fields - поле которое связано кодом с таблицей телефонов.
lookup key - id из таблицы телефонов. Result - telephone.
В ДБГриде появится поле, по нему пощелкать - вылетит список. Там еще и настройки есть.
В ЛЮБОЙ книжке по Делфи это все есть. И в демках Делфи тоже.


PM MAIL   Вверх
Eva1
Дата 27.3.2006, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Спасибо, SergeBS!
Дело в том, что прочитав книжку, я так и делаю, только там еще необходимо добавить KeyFilds - определяет поле (или поля) из исходного набора данных, для которого создается поле синхронного просмотра или ключевое поле таблицы синхронного просмотра(в одной и той же статье пишется по разному
forum.game-portal.ru/lofiversion/index.php?t101-150.html),
и при этом пощелкав в DBGrid ничего не выводится.

Это сообщение отредактировал(а) Eva1 - 27.3.2006, 17:11
PM MAIL   Вверх
Eva1
Дата 27.3.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Мне не желательно использовать Lookup поля, так как в них не добавляются новые записи, а как пользователь будет добавлять телефоны или адреса в таблицы Address и Telephone.

Можно еще как-нибудь, без дополнительных элементов типа Edit, ComboBox добавлять данные во все таблицы (Address, Telephone, Address_Book) одновременно когда работаешь только с одним DBGrid?
PM MAIL   Вверх
SergeBS
Дата 28.3.2006, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Eva1,
Задача1: заполнение контактных данных - это делают операторы.
Задача2: заполнение справочников. Это делает администратор.
По большому счету выносить номера телефонов в справочник - не обязательно. Т.е. правильно - вынести в справочники названия улиц (и городов/районов/почтовых отделений) - они часто повторяются и их список ограничен. Телефоны - не обязательно и как правило не нужно.
Цитата

Можно еще как-нибудь, без дополнительных элементов типа Edit, ComboBox добавлять данные во все таблицы (Address, Telephone, Address_Book) одновременно когда работаешь только с одним DBGrid?

Невозможно принципиально. Рекомендую почитать книжки на тему принципов построения реляционных баз данных. Например, Дейта (очень рекомендую). Список - на форуме есть.
Приципиально имеется несколько разных сущностей, между которыми устанавливаются (и меняются) связи. Каждая сущность требует свои атрибуты и правила заполнения.

PM MAIL   Вверх
Eva1
Дата 28.3.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



Спасибо, SergeBS.
Я делаю курсовик и мое задание сделать, что-то типа электронной записной книги с разделами: адресная книга, книга расходов и записная - где хотелось, как в обычной тетради, добавлять и изменять записи непосредственно. Поэтому необходимо в DBGrid заполнять три таблицы одновременно при добавлении одной записи. Но теперь придется перегружать форму дополнительными элементами, что не наглядно.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.4715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.