Пример для Dynamics AX 2012 QueryService через C# - использование отношений и JoinMode
Попытка получить доступ к AX 2012 QueryService через приложение C# и хотела бы получить только поля CustomerID и Customername. Проблема в том, что CustomerID находится в CustTable, а CustomerName находится в DirPartyTable.
Любая помощь в статье или примеры кода будут оценены.
- Ссылка на QueryDataSourceMetadata для размещения объединения в этих таблицах и получения данных.
- Какие варианты и когда использовать Relations и JoinMode?
Я искал в MSDN, и он просто перечисляет имена свойств и методы и не очень помогает в виде примеров кода.
2 ответа
Насколько мне известно, вы помещаете две таблицы, которые хотите запросить, в свой QueryDataSourceMetadata. Полученный набор данных должен содержать обе таблицы. (Пример кода для создания объекта QueryDataSourceMetadataObject находится здесь: http://msdn.microsoft.com/EN-US/library/gg844682.aspx)
Для таблиц, которые нужно объединить, вам нужно свойство ReturnFlatDataSet. (это может помочь: http://msdn.microsoft.com/EN-US/library/gg841671.aspx)
Надеюсь, я смогу помочь вам или указать правильное направление!
Слишком поздно, чтобы ответить, и я думаю, что вы уже могли найти какие-то решения. В любом случае вот ссылка на мой ответ на сообществе AX:
https://community.dynamics.com/ax/f/33/p/212065/573674
Я нашел 2 способа добавить отношения из C#. Я прокомментировал первый подход, основанный на отношении таблицы AOT. В приведенном ниже коде QueryServiceReference - это имя ссылки на службу в VS. Вы можете удалить его во всех строках, если у вас есть только ссылка QueryService, но нет ссылки MetaDataService. Вот код:
query.DataSources = new QueryServiceReference.QueryDataSourceMetadata[1];
// Set the properties on Customers data source.
customerDataSource = new QueryServiceReference.QueryDataSourceMetadata();
customerDataSource.Name = "Customers";
customerDataSource.Enabled = true;
customerDataSource.FetchMode = QueryServiceReference.FetchMode.OneToOne;
customerDataSource.Table = "CustTable";
//customerDataSource.DynamicFieldList = false;
query.DataSources[0] = customerDataSource;
QueryServiceReference.QueryDataSourceMetadata dirPartyTableDataSource = new QueryServiceReference.QueryDataSourceMetadata();
dirPartyTableDataSource.Name = "DirPartyTable";
dirPartyTableDataSource.Table = "DirPartyTable";
dirPartyTableDataSource.Enabled = true;
dirPartyTableDataSource.DynamicFieldList = true;
customerDataSource.DataSources = new QueryServiceReference.QueryDataSourceMetadata[1] { dirPartyTableDataSource };
QueryServiceReference.QueryRelationMetadata relation = new QueryServiceReference.QueryRelationMetadata();
//this is also one way of setting the relation
//relation.JoinRelation = "DirPartyTable_FK"; //table relation defined in AOT
//relation.JoinDataSource = customerDataSource.Name; //parent datasource name
relation.Table = "CustTable";//Parent table
relation.Field = "Party";
relation.RelatedTable = "DirPartyTable"; // child table
relation.RelatedField = "RecId";
relation.JoinDataSource = customerDataSource.Name;
dirPartyTableDataSource.Relations = new QueryServiceReference.QueryRelationMetadata[1] { relation };