Редактировать объект CRM при создании объекта. Плагины CRM Dynamics - PullRequest
1 голос
/ 13 мая 2019

У меня есть пользовательский плагин CRM, который зарегистрирован (через инструмент регистрации плагинов CRM) на мероприятии Create Job. «Создать» - это сообщение, а «задание» - основной объект.

После создания новой работы я хочу взять эту сущность и автоматически назначить ей номер проекта. Я всегда устанавливал «Стадию выполнения конвейера событий» как «Постоперацию». Я пробовал оба режима выполнения (асинхронный и синхронный).

Асинхронный всегда выдает мне ошибку по линии "Entity job with ID '' does not exist"

Синхронный никогда не выдает ошибку, но ни один код в моем инструменте не выполняется.

    public void Execute(IServiceProvider serviceProvider)
    {
        var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var orgService = factory.CreateOrganizationService(null);
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));        
        Entity ent = (Entity)context.InputParameters["Target"];

        IOrganizationService service = factory.CreateOrganizationService(null);
                    if (ent.LogicalName == "cmc_job")
        {
            try
            {                   
                ent["cmc_jobnumber"] = "0000001";
                ent["cmc_name"] += " - DEMO";
                service.Update(ent);                    
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
            }

    }

Я также пытался service.Create(entity), но я также склонен сталкиваться с ошибками. Эти ошибки часто связаны с дублированием записей. Также я позаботился о том, чтобы деактивировать любые существующие процессы, связанные с созданием рабочих мест.

Как правильно обновить поле сущности сразу после создания сущности? Какая практика лучше?

Примечание : причина, по которой я решил использовать пользовательский плагин CRM, а не пользовательские процессы, заключается в том, что мне нужно запросить самый большой номер существующего проекта, а затем добавить 1 к нему.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Для плагина автоматической нумерации лучше всего зарегистрироваться в Pre-Operation (Synchronous).Таким образом, автоматически пронумерованные поля будут установлены в той же транзакции базы данных, которая создает запись (избегая ненужных транзакций и запутанной истории аудита).

При написании плагинов перед операцией не следует вызывать service.Update (), но просто установите значения для цели (как вы в настоящее время), и они будут сохранены вместе с другими атрибутами цели.Закомментируйте вашу строку service.Update (), и ваш плагин должен работать в предоперационном режиме.

Асинхронный всегда выдает ошибку, поскольку "Entity job with ID '" не существует

Синхронный никогда не выдает ошибку, но код в моем инструменте не выполняется

Это происходит потому, что во время создания ID не присваивается записям, пока они не будутсохраняется в базе данных. Вы берете Target (у которого нет идентификатора), а затем пытаетесь выполнить service.Update (), который ожидает объект с идентификатором. Вызовы sync и async вызовут ошибку, но произойдет асинхронная ошибкана заднем плане, и вы не видите его.

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

Вы должны перепроверить с асинхронной пошаговой регистрацией в PRT.

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

Но асинхронный плагин будет успешным, поскольку транзакция БД зафиксирована& запись по Id доступна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...