Я пишу плагин CRM.Он должен запускаться в сообщении «RetrieveMultiple» для объекта продавца на этапе 20 (предварительная операция).
Проблема заключается в том, что мне нужен список всех существующих продавцов на той же самой стадии подготовки к операции (вчтобы сравнить список со списком удаленных заказов и, при необходимости, создать новые заказы.
Чтобы получить список всех заказов, наивный подход заключается в использовании service.retrieveMultiple(salesOrderQuery)
, где salesOrderQuery - это выражение QueryExpression для salesorder.
Это приводит к тому, что процесс динамики 365 заходит в бесконечный цикл.
Мой вопрос таков: как я могу "предварительно извлечь" всех продавцов на стадии перед операцией для "RetrieveMultiple"сообщение о заказе, не вызывая бесконечный цикл?
В настоящее время я думаю, что, возможно, мне следует изменить событие, которое вызывает запуск моего плагина.Моя цель - извлечь все вновь созданные заказы из удаленной системы, когда пользователь загружает страницу «Заказы».Единственный подход, который я нашел, - это зарегистрировать мой шаг плагина в сообщении «RetrieveMultiple».
Но как тогда получить все существующие заказы?
Пока мой плагинвыглядит следующим образом:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSPlugins
{
public class RetrieveOrdersPlugin : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
var context = serviceProvider.GetService(typeof(IPluginExecutionContext)) as IPluginExecutionContext;
// check if pre-operation
if (context.Stage != 20)
throw new InvalidPluginExecutionException("Must run as pre-operation stage 20");
if (context.MessageName != "RetrieveMultiple")
throw new InvalidPluginExecutionException("Registered for " + context.MessageName + " only RetrieveMultiple is supported");
if (context.PrimaryEntityName != "salesorder")
throw new InvalidPluginExecutionException("Registered for " + context.PrimaryEntityName + " entity and only salesorder is supported");
var tracingService = serviceProvider.GetService(typeof(ITracingService)) as ITracingService;
var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)) as IOrganizationServiceFactory;
var service = serviceFactory.CreateOrganizationService(context.UserId) as IOrganizationService;
tracingService.Trace("Plug-in RetrieveOrders executed");
QueryExpression soQuery = new QueryExpression();
soQuery.EntityName = "salesorder";
soQuery.ColumnSet = new ColumnSet() { AllColumns = true };
soQuery.Criteria = new FilterExpression();
soQuery.Criteria.FilterOperator = LogicalOperator.And;
// The following line causes an infinite loop...
EntityCollection entities = service.RetrieveMultiple(soQuery);
}
}
}