Запросить список номеров проектов из таблицы проектов через пользовательский плагин CRM - PullRequest
0 голосов
/ 15 мая 2019

У меня есть таблица сущностей проекта в CRM, у каждой сущности проекта есть текстовое поле под названием «номер проекта».Я хочу запросить список всех номеров проектов, доступных в таблице.

Все источники, на которые я смотрел, отметили, что мне нужно использовать ServiceContext или XrmServiceContext(), но, похоже,что они генерируются с помощью инструмента CrmSvcUtil .Учебник, который я использовал для этой части, найден здесь .

Из моего прошлого опыта разработки плагинов CRM, Я обнаружил, что мне не разрешено выполнять какие-либо локальные задачи в пределахвыполнение плагина , поэтому использование инструмента CrmSvcUtil конфликтует с этим.

Я неправильно отношусь к этой ситуации?У меня есть доступ к OrganizationServiceContext, но я не уверен, что это даст мне доступ для запроса объектов моего проекта.

РЕДАКТИРОВАТЬ:
Мои ссылки указаны ниже, но LocalPluginContext не может быть найден.Быстрый поиск в Google предложил мне просто добавить элементы из SDK, но я добавил все.
enter image description here

Ответы [ 3 ]

1 голос
/ 15 мая 2019

Есть 2 способа достичь этого. 1. Консольное приложение, где вам не нужен контекст, а вы входите в систему и получаете IOrganizationService

static void Main(string[] args)
        {
            IOrganizationService organizationService = null;    
            try
            {
                ClientCredentials clientCredentials = new ClientCredentials();
                clientCredentials.UserName.UserName = "AdminCRM@dabc.onmicrosoft.com";
                clientCredentials.UserName.Password = "pwd";

                //For Dynamics 365 Customer Engagement V9.X, set Security Protocol as TLS12
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                //Get the URL from CRM, Navigate to Settings -> Customizations -> Developer Resources
                //Copy and Paste Organization Service Endpoint Address URL

                organizationService = (IOrganizationService)new OrganizationServiceProxy(new Uri("https:/[OrgUrl]/XRMServices/2011/Organization.svc"),
                    null, clientCredentials, null);

                if (organizationService != null)
                {
                    Guid userid = ((WhoAmIResponse)organizationService.Execute(new WhoAmIRequest())).UserId;

                    if (userid != Guid.Empty)
                    {
                        Console.WriteLine("Connection Established Successfully...");                          
                    FetchXmlTestQuery(organizationService);
                    queryExpressionTest(organizationService);    

                    }
                }
                else
                {
                    Console.WriteLine("Failed to Established Connection!!!");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception caught - " + ex.Message);
            }
            Console.ReadKey();    

        }

 private static void queryExpressionTest(IOrganizationService organizationService)
        {
            QueryExpression qe = new QueryExpression();
            qe.EntityName = "account";
            qe.ColumnSet= new ColumnSet("name", "accountnumber");

            EntityCollection coll = organizationService.RetrieveMultiple(qe);
            foreach (Entity acunt in coll.Entities)
            {
                Console.WriteLine("Name of Account: " + acunt.GetAttributeValue<string>("name"));
                Console.WriteLine("Number of Account: " + acunt.GetAttributeValue<string>("accountnumber"));
            }

        }


private static void FetchXmlTestQuery(IOrganizationService CrmConn)
        {
            // Retrieve all accounts owned by the user with read access rights to the accounts and   
            // where the last name of the user is not Cannon.   
            string fetch = @"  
   <fetch>
  <entity name='account' >
    <attribute name='name' />
<attribute name='accountnumber' />
    <link-entity name='contact' from='parentcustomerid' to='accountid' link-type='inner' alias='Contact' >
      <attribute name='fullname' alias = 'Contact.Fullname' />
    </link-entity>
  </entity>
</fetch> ";

           EntityCollection Coll = CrmConn.RetrieveMultiple(new FetchExpression(fetch));

                foreach (Entity acunt in Coll.Entities)
                {
                    Console.WriteLine("Name of Account: " + acunt.GetAttributeValue<string>("name"));
                    Console.WriteLine("Name of Contact: "  + acunt.GetAttributeValue<AliasedValue>("Contact.Fullname").Value);
                    Console.WriteLine("Number of Account: " + acunt.GetAttributeValue<string>("accountnumber"));
            }


        }

Теперь вы также можете использовать плагин Context

protected override void ExecuteCrmPlugin(LocalPluginContext localContext)
        {
            if (localContext == null)
            {
                throw new ArgumentNullException("localContext");
            }

            // TODO: Implement your custom plug-in business logic.
            IPluginExecutionContext context = localContext.PluginExecutionContext;
            ITracingService tracingService = localContext.TracingService;
            IOrganizationService orgService = localContext.OrganizationService;

            FetchXmlTestQuery(orgService);
            queryExpressionTest(orgService);
}

 private void FetchXmlTestQuery(IOrganizationService orgService)
        {
            // Retrieve all accounts owned by the user with read access rights to the accounts and   
            // where the last name of the user is not Cannon.   
            string fetch = @"  
   <fetch>
  <entity name='account' >
    <attribute name='name' />
<attribute name='accountnumber' />
    <link-entity name='contact' from='parentcustomerid' to='accountid' link-type='inner' alias='Contact' >
      <attribute name='fullname' alias = 'Contact.Fullname' />
    </link-entity>
  </entity>
</fetch> ";

            EntityCollection Coll = orgService.RetrieveMultiple(new FetchExpression(fetch));

            foreach (Entity acunt in Coll.Entities)
            {
              string accountname= acunt.GetAttributeValue<string>("name");
             string accountnr=  acunt.GetAttributeValue<string>("accountnumber");
            }
        }
        private static void queryExpressionTest(IOrganizationService organizationService)
        {
            QueryExpression qe = new QueryExpression();
            qe.EntityName = "account";
            qe.ColumnSet = new ColumnSet("name", "accountnumber");

            EntityCollection coll = organizationService.RetrieveMultiple(qe);
            foreach (Entity acunt in coll.Entities)
            {
                string accountname = acunt.GetAttributeValue<string>("name");
                string accountnr =  acunt.GetAttributeValue<string>("accountnumber");
            }

        }
1 голос
/ 15 мая 2019

Внутри плагина вы получите весь контекст выполнения конвейера и доступ к сервису организации, чтобы расширить бизнес-функциональность в том же конвейере.

Эти фрагменты кода ниже представляют собой базовый код, который даст вам различныенеобходимые части, такие как служба трассировки для ведения журнала, контекст для получения целевой сущности, изображения и т. д. и IOrganizationService для выполнения вызовов службы, таких как обновление, извлечение и т. д., обеспечивают расширение платформы.

Как вы знаете, будет одиноткрытый класс в плагине и единственный открытый метод Execute(IServiceProvider serviceProvider), и мы получим все, используя этот единственный параметр serviceProvider

// Obtain the tracing service
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

// Obtain the execution context from the service provider.  
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

// Obtain the organization service reference which you will need for  
// web service calls.  
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

Когда вы хотите запросить другие номера проектов из базы данных,используйте метод service.RetrieveMultiple для запроса.Вы можете передать запрос fetchxml или использовать выражение запроса, чтобы сделать это.

Вы можете найти множество примеров в Интернете. Пример для стартера .

0 голосов
/ 15 мая 2019

Вот то, что я бы порекомендовал.

  1. Установка XrmToolBox (убедитесь, что вы распаковали zip-файл перед его разархивированием)
  2. Установите генератор раннего связыванияи Visual Studio Solution Accelerator из хранилища плагинов XrmToolBox в этом инструменте.
  3. Запустите Visual Studio Solution Accelerator, либо добавив основные проекты в существующее решение, либо используя его для создания нового решения.Я бы предложил добавить примеры плагинов, чтобы вы могли увидеть, как создать плагин.Также предложите использовать EarlyBinding.
  4. Запустите EarlyBoundGenerator, вставив путь, который был скопирован в буфер обмена из Visual Studio Solution Accelerator.Добавьте все необходимые объекты для вашего плагина.Create All.
  5. Создайте свой плагин в проекте плагина.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...