Пример для Dynamics AX 2012 QueryService через C# - использование отношений и JoinMode

Попытка получить доступ к AX 2012 QueryService через приложение C# и хотела бы получить только поля CustomerID и Customername. Проблема в том, что CustomerID находится в CustTable, а CustomerName находится в DirPartyTable.

Любая помощь в статье или примеры кода будут оценены.

  1. Ссылка на QueryDataSourceMetadata для размещения объединения в этих таблицах и получения данных.
  2. Какие варианты и когда использовать 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 };
Другие вопросы по тегам