Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение текущей записи в DBGrid'e [D6, Access]


able ©   (2004-12-12 09:27:00) 

Здравствуйте, Мастера!
Как узнать на какую строку кликнул пользователь в DBGrid'e и получить, допустим, значение второй колонки этой строки?
Источник данных - ADOQuery


Zacho   (2004-12-12 11:33:00) [1]

able ©   (12.12.04 10:41) [7]

Сразу скажу, с ADO и Access не работаю. Но никакой принципальной разницы между ADO и другими компонентами доступа и Access и другими СУБД в данном случае нет.

Итак, у тебя есть таблицы, связанные Master-Detail (предприятия - Master, прайсы - Detail). В мастере должен быть первичный ключ (или UNIQUE CONSTRAINT, или что там в Access), а в детайл-таблице поле - ссылка на ПК в мастере. Тебе просто нужно выбрать из детайл-таблицы все записи, у которых значение этого поля-ссылки равняется значению ПК текущей записи мастера. Это можно сделать или с помощью WHERE в запросе или с помощью св-ва Filter.
Например, в таблице предприятий есть поле ID - первичный ключ, а в таблице прайсов поле ID_PREDPRIYATIE - ссылка на поле ID в таблице предприятий. Пусть набор данных с предприятиями называется MasterDataSet, c прайсам - DetailDataSet, таблица прайсов - PRICE. Тогда:
1. Используем фильтр.
При открытии окна с прайсами делаем что-то типа:
DetailDataSet.Filter:='ID_PREDPRIYATIE='+MasterDataSet.FieldByName('ID').AsString;

2. Используем запрос с WHERE.
 В DetailDataSet пишем запрос вида : SELECT * FROM PRICE WHERE ID_PREDPRIYATIE=:ID
 Далее есть два способа:
2a) В DetailDataSet.DataSource устанавливаем DataSource, связанный с MasterDataSet.
2б) Перед открытием запроса в DetailDataSet присваиваем параметру ID значене поля ID из MasterDataSet.


able   (2004-12-12 11:06:00) [2]

Dell3r ©   (12.12.04 11:03) [8]
Выдержит ли DBGrid 2000предприятий, где у каждого предприятия прайс до 60000 позиций?


Dell3r   (2004-12-12 11:03:00) [3]

Поддержка вложенных таблиц
Компонент TDBGrid теперь может отображать вложенные таблицы. Для иллюстрации этой возможности воспольуемся таблицами customer.db, orders.db и items.db, поставляемыми вместе с Delphi. Поместим на форму три компонента TTable, три компонента TDataSourse, один компонент TClientDataSet и один компонент TProvider. Установим следующие свойства этих компонентов:
Компонент Свойство Значение
DBGrid1     DataSource   DataSource3
DBNavigator DataSource   DataSource3
Table1     DatabaseName  'DBDEMOS'
    TableName     'customer.db'
    Active       True
DataSource1 DataSet      Table1
Table2     DatabaseName   'DBDEMOS'
    TableName    'orders.db'
    IndexFieldNames 'CustNo'
    MasterFields 'CustNo'
    MasterSource DataSource1
    Active       True
DataSource2 DataSet      Table2
Table3     DatabaseName  'DBDEMOS'
    TableName    'items.db'
    IndexFieldNames 'OrderNo'
    MasterFields 'OrderNo'
    MasterSource DataSource2
    Active       True
Provider1   DataSet      Table1

ClientDataSet1 ProviderName 'Provider1'
        Active    True
DataSource3 DataSet   ClientDataSet1

Сами таблицы формата Paradox, естественно, не поддерживают поля, содержащие вложенные таблицы, но такие поля поддерживает компонент TClientDataSet со страницы MIDAS палитры компонентов. Связав его с компонентом Table1 посредством компонента Provider1, мы получим набор данных, содержащий поле Table2 типа TDataSetField, а внутри вложенной таблицы - поле Table3 того же типа:

Такое представление данных даже в случае использования настольных СУБД весьма удобно просто потому, что оно решает общеизвестную проблему нехватки места на форме при наличии нескольких связанных таблиц. Единственное, о чем при этом следует позаботиться, это вызов метода ApplyUpdates компонента TClientDataSet (например, в обработчике события, связанного с выбором какого-либо пункта меню или с нажатием на кнопку):
ClientDataSet1.ApplyUpdates(-1);
Если не использовать этот метод, данные будут сохраняться только в кэше, которым фактически и является компонент TClientDataSet, а не в самих таблицах.


able   (2004-12-12 10:41:00) [4]

Zacho ©   (12.12.04 10:29) [6]
Ок. В общем, мне надо связать 2 таблицы. Таблица с предприятиями и у каждого предприятия свой прайс. При клике на DBGrid (с предприятиями) вылезает новое окошко, где тоже DBGrid, где прайсы для выделенного предприятия.


Zacho   (2004-12-12 10:29:00) [5]

able ©   (12.12.04 10:12) [5]

Ещё раз подробнее объясни, что тебе надо. А то я так и не понял, в чём конкретно твоя проблема.


able   (2004-12-12 10:12:00) [6]

Zacho ©   (12.12.04 10:07) [4]
Я понял как находить выбранное поле.
А у меня ключевое поле, по которому связаны 2 таблицы.
И по клику на строку открывается окошко с другой таблицей.


Zacho   (2004-12-12 10:07:00) [7]

able ©   (12.12.04 10:04) [3]
Но как получить номер строки?


Зачем ???

Выбранная в гриде запись и так будет текущей в НД.


able   (2004-12-12 10:04:00) [8]

Как имя поля получить я понял..
Но как получить номер строки?


able   (2004-12-12 09:39:00) [9]

Zacho ©   (12.12.04 09:34) [1]
А как получить-то имя поля?


Zacho   (2004-12-12 09:34:00) [10]

Эта запись и будет текущей в НД, подключенном к гриду.

Т.ч., например: MyDBGrid.DataSource.DataSet.FieldByName('..').Value ...

Или: МуDataSet.FieldByName('..').Value ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо