Отношения Delphi7, dbExpress и Master Detail - PullRequest
3 голосов
/ 21 ноября 2011

Я новичок в Delphi.Я получил две TSQLTables (скажем, A и B), связанные с двумя TClientDataSets (скажем, cdsA и cdsB соответственно) двумя TDataSetProviders, два источника данных (dsA и dsB) завершают сценарий.

Пусть A будет основным, а B - подробным.

B.MasterSource установлен в значение dsA, а значение B.MasterFields ссылается на поле, которое не существует в cdsA (но существует в запросе).Когда я запускаю приложение, сначала открываю cdsA, а затем открываю cdsB.Что-то идет не так.DBGrid, который ссылается на источник данных dsA, показывает данные, DBGrid, который ссылается на dsB, ничего не показывает.Лог-файл SQLMonitor показывает, что запрос, реализованный в B, выполняется (простой select a, b, c from tableB).Все работает нормально, если я изменяю запрос и показываю поле 'X' (select a, b, c, X from tableB), где 'X' - это поле, указанное в свойстве B.IndexFieldNames.

Почему DBGrid, ссылающийся на dsB, не работаетпоказать запись B, связанную с текущей записью cdsA?Работает ли это, только если я укажу IndexFieldNames в столбцах запроса?Что я упустил?ТИА.

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Я объясню полный сценарий, используя AdventureWorks база данных для SQL Server 2008 R2 . Я также предполагаю, что вы уже разместили компонент TSQLConnection и правильно установили его параметры для установленного соединения с вашей базой данных. В этом примере я также приму имя для него Conn1 .

В форме поместите 2 TSQLTable (с именем tableA и tableB ), 2 TDataSetProvider (с именем dspA и dspB ), 2 TClientDataSet (с именем cdsA и cdsB ), 2 TDataSource (с именем dsA и dsB ) и 2 TDBGrid (названные gridA и gridB ) компоненты.

Установить свойства следующим образом:

tableA.SQLConnection = Conn1
tableA.SchemaName = Sales
tableA.TableName = Customer
tableA.Active = True

dspA.DataSet = tableA

cdsA.ProviderName = dspA
cdsA.Active = True

dsA.DataSet = cdsA

gridA.DataSource = dsA

tableB.SQLConnection = Conn1
tableB.SchemaName = Sales
tableB.TableName = SalesOrderHeader
tableB.Active = True

dspB.DataSet = tableB

cdsB.ProviderName = dspB
cdsB.MasterSource = cdsA
cdsB.MasterFields = CustomerID
cdsB.Active = True

dsB.DataSet = cdsB

gridB.DataSource = dsB

В gridA должны отображаться все Клиенты , а в gridB вы должны видеть только Заказы , относящиеся к текущему выбранному клиенту.

Это основной пример установления отношения мастер / подробности между двумя компонентами TClientDataSet в Delphi. Однако есть и другие способы сделать это.

0 голосов
/ 22 ноября 2011

Способ, которым я связываю ClientDataSets, описан в Книга Кэри Дженсена "Delphi In Depth: Client DataSets" .Настройте наборы данных Master и Detail в соответствии с обычным режимом и убедитесь, что они связаны через TDataSource (у вас будет параметр в Detail SQL, который связывает его с Master).Тем не менее, CJ предлагает использовать только один DataSetProvider, который подключен к мастеру.Но мастер (и, следовательно, DSP) будет иметь вложенный набор данных, повторно представляющий таблицу подробностей.Подробный / вложенный набор данных может отображаться в основной таблице DBGrid или в ее собственной DBGrid.Ваша gridB будет связана с вложенным набором данных.

Проблема в прямой привязке gridB к TSQLQuery (насколько я понимаю) заключается в том, что любые обновления мастераCDS не отражаются в gridB.Если вы хотите увидеть больше, вы можете скачать проект NestedFromMasterDetail с веб-сайта Кэри.

Если вы действительно хотите узнать больше, купите копию книги Кэри.Я нашел это неоценимым в понимании наборов данных клиента.Они настроены несколько иначе, и Кэри хорошо объясняет их архитектуру.

...