у меня есть две таблицы в БД на PostgreSQL
Таблица 1:
uchenik (Ученики)
Поля:
Название поля (Тип поля)
ID_uchenik (serial)
FIO_uchenik (varchar)
Adres_uchenik (varchar)
и т.д.
Таблица 2:
rod (Родители учеников)
Поля:
Название поля (Тип поля)
uchenik_ID (integer)
FIO_rod (varchar)
Adres_rod (varchar)
и т.д.
Создаю всё в EMS SQL Manager for PostgreSQL.
Поле ID_uchenik в uchenik ставлю как первичный ключ.
Далее создаю с помощью конструктора связь один ко многим. в таблице rod во вкладке"Внешние ключи" создался rod_fk на поле uchenik_ID
Теперь собственно о Lazarus. Установил я туда Zeos.Кидаю на форму ZConnection1, два ZTable для каждой из таблиц, ну и т.д. ставлю на форму два DBGrid , в первом у меня выводятся все ученики, а во втором мне надо чтоб отображались для конкретного ученика только его родители(то есть для кокретного выделенного в DBGrid1 ученика на DBGrid2 отображались только его родители).
Как мне это правильно сделать? расскажите, пожалуйста.
как связать таблицы БД в Lazarus?
Модератор: Модераторы
- FeodoR
- новенький
- Сообщения: 59
- Зарегистрирован: 16.04.2010 12:11:34
- Откуда: MSK, ЮАО
- Контактная информация:
С точностью до свойств и процедур в Лазаре не скажу, ибо с ZeOS не работал, но логика такая:
Для того ZTable, который выводит сведения по ученику, установить фильтр на вывод вида (опять же примерно)
А для DBGrid c учениками написать процедурку для свойства OnChange, чтобы она обновляла вывод для DBGrid с родителями. И всё должно заработать. ИМХО.
Для того ZTable, который выводит сведения по ученику, установить фильтр на вывод вида (опять же примерно)
Код: Выделить всё
WHERE Uchenik.ID=ZTable1.FieldByName('ID_uchenik').AsStringА для DBGrid c учениками написать процедурку для свойства OnChange, чтобы она обновляла вывод для DBGrid с родителями. И всё должно заработать. ИМХО.
FeodoR
Человек просит с использованием TTable, а не с применением SQL запросов в TQuery.
AlekTv
Смысл заморачиваться со всякими TTable, если вы используете полноценный SQL сервер?
Человек просит с использованием TTable, а не с применением SQL запросов в TQuery.
AlekTv
Смысл заморачиваться со всякими TTable, если вы используете полноценный SQL сервер?
- AlekTv
- новенький
- Сообщения: 16
- Зарегистрирован: 15.04.2010 17:08:35
- Откуда: Тверь и Кабардино-Балкария. когда как...
да мне то впринципе всё равно, буду ZQuery использовать вместо ZTable, правда вот SQL совсем не знаю, думал как с Access в Delphi прокатит, где компоненты настраиваешь должным образом и радуешься(ничего прописывать не надо)
- FeodoR
- новенький
- Сообщения: 59
- Зарегистрирован: 16.04.2010 12:11:34
- Откуда: MSK, ЮАО
- Контактная информация:
Прописать всё равно надо. Потому как Primary key->Foreign key отношения относятся только к моменту ввода данных, но никак ни к отображению. В tTable должно быть свойство Filter. Согласно этому фильтру будут выбираться записи из таблицы. Отличия tTable и tQuery будут (с точки зрения фильтра) только в синтаксисе.
Добавлено спустя 29 минут 44 секунды:
Дело в том, что Access избавляет от таких операций. А на самом деле получается, что два DBGrid'a, точнее два tTable, так как DBGrid это отображение, знать друг про друга не знают. И для того, чтобы их друг с другом связать и надо задать условие связки. В данном случае через фильтр.
Выражаясь по-колхозному это выглядит так:
Выбрав поле в первой таблице, она (первая) пинает вторую со словами "Отобрази-ка мне свои поля по моему выбранному в соответствии с ключом у меня. Ключ вот.". Вторая таблица говорит "Ахха" и в её результатах появляется то, что отображает DBGrid. Примерно так.
Добавлено спустя 29 минут 44 секунды:
Дело в том, что Access избавляет от таких операций. А на самом деле получается, что два DBGrid'a, точнее два tTable, так как DBGrid это отображение, знать друг про друга не знают. И для того, чтобы их друг с другом связать и надо задать условие связки. В данном случае через фильтр.
Выражаясь по-колхозному это выглядит так:
Выбрав поле в первой таблице, она (первая) пинает вторую со словами "Отобрази-ка мне свои поля по моему выбранному в соответствии с ключом у меня. Ключ вот.". Вторая таблица говорит "Ахха" и в её результатах появляется то, что отображает DBGrid. Примерно так.
У подчиненной ZTable2 выставить свойства MasterSource=DataSource1 (который к ZTable1 привязан), MasterFields=ID_uchenik, LinkedFields=uchenik_ID.
Добавлено спустя 3 минуты 37 секунд:
ZTable2 - это у которой TableName='rod'
Добавлено спустя 3 минуты 37 секунд:
ZTable2 - это у которой TableName='rod'
- AlekTv
- новенький
- Сообщения: 16
- Зарегистрирован: 15.04.2010 17:08:35
- Откуда: Тверь и Кабардино-Балкария. когда как...
сделал так как написал v-t-l и всё отобразилось.
странно раньше тоже так пытался сделать, но не получалось, видимо я тогда DataSource2 не активировал или ещё где нибудь ошибку допускал
странно раньше тоже так пытался сделать, но не получалось, видимо я тогда DataSource2 не активировал или ещё где нибудь ошибку допускал
