Плагин CRM для запуска при открытии возможности - PullRequest
4 голосов
/ 26 марта 2010

Мне нужно написать плагин для Dynamics CRM 4.0, который запускается при повторном открытии закрытой возможности для изменения кода salesstage. Мои вопросы:

  • Когда я регистрирую новый шаг в плагине, по каким атрибутам я должен фильтровать?
  • Какое свойство на объекте я должен проверить значение? и
  • Что я должен искать, чтобы значение этой сущности было таким, чтобы я мог определить, должно ли выполнение плагина продолжаться?

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

Пожалуйста, смотрите ниже скелет плагина, который я написал

    public void Execute(IPluginExecutionContext context)
    {
        if (context.InputParameters.Properties.Contains("Target") && context.InputParameters.Properties["Target"] is DynamicEntity)
        {
            ICrmService service = context.CreateCrmService(false);

            DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties["Target"];

            if (entity.Name == EntityName.opportunity.ToString())
            {
                if (entity.Properties.Contains(/*What Property Should I Check Here?*/))
                {
                    //And what value should I be looking for in that property?

                }
            }
        }
    }

Ответы [ 3 ]

8 голосов
/ 31 марта 2010

Я думаю, вы действительно захотите зарегистрировать плагин для стадии публикации в сообщении SetStateDynamicEntity. Вам не нужны никакие атрибуты фильтрации для этого сообщения.

Ваш код будет выглядеть примерно так:

public void Execute(IPluginExecutionContext context)
{
    string state = (string)context.InputParameters["State"];
    if (state == "Open")
    {
        Moniker entityMoniker = (Moniker)context.InputParameters["EntityMoniker"];
        DynamicEntity opp = new DynamicEntity("opportunity");
        opp["opportunityid"] = new Key(entityMoniker.Id);
        opp["salesstagecode"] = new Picklist(/*your value*/);
        context.CreateCrmService(true).Update(opp);
    }
}
1 голос
/ 26 марта 2010

Вы захотите настроить сущность в сообщении SetStateDynamic. Это не обеспечивает цель, поэтому вместо этого вам нужно вытащить EntityMoniker и вручную извлечь объект, как это:

            // If this is a setstate call, we need to manually pull the entity
            if (context.InputParameters.Properties.Contains("EntityMoniker") &&
                    context.InputParameters.Properties["EntityMoniker"] is Moniker)
            {
                Moniker entity = (Moniker)context.InputParameters.Properties["EntityMoniker"];

                // get the entity
                TargetRetrieveDynamic targetRet = new TargetRetrieveDynamic();
                targetRet.EntityId = entity.Id;
                targetRet.EntityName = context.PrimaryEntityName;

                RetrieveRequest retrieveReq = new RetrieveRequest();
                retrieveReq.ColumnSet = new ColumnSet();
                retrieveReq.ColumnSet.AddColumns(new string[]{"opportunityid", "statecode", "statuscode"});
                retrieveReq.Target = targetRet;
                retrieveReq.ReturnDynamicEntities = true;

                RetrieveResponse retrieveRes = this.Service.Execute(retrieveReq) as RetrieveResponse;

                // Set the new entity and the status
                int status = (int)context.InputParameters["Status"];
                dynEntity = (DynamicEntity)retrieveRes.BusinessEntity;                                        
                dynEntity.Properties["statuscode"] = new Status(status);                      
            }
0 голосов
/ 01 апреля 2010

Вот то, к чему я в итоге пришел. Я отмечу это как правильный ответ, но я дам вам обоим (Фокус и Кори) ответ, когда я снова смогу ответить, потому что я включил предложения от вас обоих, чтобы прийти к этому решению.

    public void Execute(IPluginExecutionContext context)
    {
        if (context.InputParameters.Properties.Contains("Target") &&
            context.InputParameters.Properties["Target"] is DynamicEntity)
        {
            DynamicEntity opp = (DynamicEntity)context.InputParameters["Target"];
            Picklist StageCodePicklist = new Picklist(); (Picklist);opp.Properties["salesstagecode"];
            StageCodePicklist.name = "Advocating - Advanced (90%)";
            StageCodePicklist.Value = 200004;
            opp.Properties["salesstagecode"] = StageCodePicklist;
        }
    }
...