CRM 2011自定义工作流程 [英] CRM 2011 Custom Workflow

查看:126
本文介绍了CRM 2011自定义工作流程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我要进行插件的工作,并且这里已经更新了工作代码。希望它能帮助您!

我正在创建一个工作流,该工作流的插件可以从电子邮件记录的发件人字段。我正在尝试查看联系人实体中是否存在该电子邮件。输入是 FROM电子邮件,输出将返回Contacts实体。我无法使此代码正常工作,我收到了其他错误或没有错误,但我知道它无法正常工作。请帮忙!

I'm creating a workflow which has a plugin to retrieve a contact entity from a "FROM" field of an Email record. I'm trying to see if that email exists in the contact entity. The input is the "FROM" email and the output will return the Contacts entity. I have not been able to get this code working, I've received different errors or no errors, but I know its not working. Please help! Thanks in advance!

using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using System;

namespace GetSenderPlugin
{
  public class GetSenderPlugin : CodeActivity
  {
    protected override void Execute(CodeActivityContext executionContext)
    {
        //Create the tracing service
        ITracingService trace = executionContext.GetExtension<ITracingService>();
        trace.Trace("*****Tracing Initiated*****");

        //Create the IWorkflowContext and the IOrganizationService for communication with CRM
        IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
        IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
        IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
        trace.Trace("*****IOrganizationService created*****");

        trace.Trace("*****Entity logical Name: " + Email.Get<EntityReference>(executionContext).LogicalName + "*****");
        trace.Trace("*****Entity ID: " + Email.Get<EntityReference>(executionContext).Id + "*****");

        if (Email != null && string.Compare(Email.Get<EntityReference>(executionContext).LogicalName, "email", false) == 0)
        {
            EntityReference retrieveEmail = new EntityReference();
            retrieveEmail.Id = Email.Get<EntityReference>(executionContext).Id;
            retrieveEmail.LogicalName = Email.Get<EntityReference>(executionContext).LogicalName;
            retrieveEmail.Name = Email.Get<EntityReference>(executionContext).Name;

            string[] strArrays = new string[1];
            strArrays[0] = "from";

            ColumnSet columnSet = new ColumnSet();
            columnSet.AddColumn(strArrays[0]);

            RetrieveRequest retrieveRequest = new RetrieveRequest();
            retrieveRequest.Target = retrieveEmail;
            retrieveRequest.ColumnSet = columnSet;
            trace.Trace("*****Retrieve Request declared*****");

            RetrieveResponse retrieveResponse = (RetrieveResponse)service.Execute(retrieveRequest);
            trace.Trace("*****Retrieve Response executed*****");

            Email businessEntity = (Email)retrieveResponse.Entity;
            trace.Trace("*****businessEnitity retrieved*****");

            //ActivityParty activitypartyArray = (ActivityParty)businessEntity.From.FirstOrDefault;
            foreach (ActivityParty activityParty in businessEntity.From)
            {
                trace.Trace("*****Activity Party Name: " + activityParty.PartyId.LogicalName + "*****");
                trace.Trace("*****Activity Party Id: " + activityParty.PartyId.Id + "*****");
                if (activityParty != null && activityParty != null && activityParty.PartyId != null)
                {
                    string str = activityParty.PartyId.LogicalName;
                    if (str.CompareTo("contact") != 0)
                    {
                        trace.Trace("*****Not Contact*****");
                        if (str.CompareTo("account") != 0)
                        {
                            trace.Trace("*****Not Account*****");
                            if (str.CompareTo("lead") != 0)
                            {
                                trace.Trace("*****Not Lead*****");
                                if (str.CompareTo("systemuser") != 0)
                                {
                                    trace.Trace("*****Not System User*****");
                                    if (str.CompareTo("queue") == 0)
                                    {
                                        Queue.Set(executionContext, activityParty.PartyId);
                                        Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                        User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                                        Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                                        Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                                    }
                                    else
                                    {
                                        trace.Trace("*****User not found*****");
                                        Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                                        Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                        User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                                        Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                                        Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                                    }
                                }
                                else
                                {
                                    User.Set(executionContext, activityParty.PartyId);
                                    Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                    Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                                    Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                                    Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                                }
                            }
                            else
                            {
                                Lead.Set(executionContext, activityParty.PartyId);
                                Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                                Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                                User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                                Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                            }
                        }
                        else
                        {
                            Account.Set(executionContext, activityParty.PartyId);
                            Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
                            Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                            User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                            Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                        }
                    }
                    else
                    {
                        trace.Trace("*****Contact assigned*****");
                        Contact.Set(executionContext, activityParty.PartyId);
                        Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
                        User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
                        Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
                        Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
                    }
                }
                break;
            }
        }
        else
        {
            trace.Trace("*****Email is null*****");
            Queue.Set(executionContext, new EntityReference("queue", Guid.NewGuid()));
            Contact.Set(executionContext, new EntityReference("contact", Guid.NewGuid()));
            User.Set(executionContext, new EntityReference("systemuser", Guid.NewGuid()));
            Lead.Set(executionContext, new EntityReference("lead", Guid.NewGuid()));
            Account.Set(executionContext, new EntityReference("account", Guid.NewGuid()));
        }
    }

    #region Properties
    [Input("E-mail")]
    [ReferenceTarget("email")]
    public InArgument<EntityReference> Email { get; set; }

    [Output("Account")]
    [ReferenceTarget("account")]
    public OutArgument<EntityReference> Account { get; set; }

    [Output("Contact")]
    [ReferenceTarget("contact")]
    public OutArgument<EntityReference> Contact { get; set; }

    [Output("Lead")]
    [ReferenceTarget("lead")]
    public OutArgument<EntityReference> Lead { get; set; }

    [Output("Queue")]
    [ReferenceTarget("queue")]
    public OutArgument<EntityReference> Queue { get; set; }

    [Output("User")]
    [ReferenceTarget("systemuser")]
    public OutArgument<EntityReference> User { get; set; }
    #endregion        
  }
}

因此我们正在升级我们从4.0到2011年的内部CRM系统,这是一个工作流程中的插件。我没有原始的源代码,所以我真的不知道代码在做什么。但是在导出解决方案后,我反编译了原始的.dll文件。我试图重写CRM 2011的代码,这就是我所拥有的。在测试了工作流程之后,出现错误消息:预期的非空Guid。代码进入循环后的最后一行,然后给我错误。这是跟踪:

So we are upgrading our internal CRM system from 4.0 to 2011, and this was a plugin that was on a workflow. I didn't have the original source code so I didn't really know what the code was doing. But I decompiled the original .dll file after I exported the solution. I tried to rewrite the code for CRM 2011, and here is what I have. After I tested the workflow, I get error saying: "Expected non-empty Guid." The code goes to the very last line after the loop then gives me the error. Here is the trace:

Workflow paused due to error: Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Expected non-empty Guid.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220989</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
  <Message>Expected non-empty Guid.</Message>
  <Timestamp>2013-02-21T23:46:37.0376093Z</Timestamp>
  <InnerFault>
   <ErrorCode>-2147220970</ErrorCode>
    <ErrorDetails xmlns:d3p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
    <Message>System.ArgumentException: Expected non-empty Guid.
Parameter name: id</Message>
    <Timestamp>2013-02-21T23:46:37.0376093Z</Timestamp>
    <InnerFault i:nil="true" />
    <TraceText i:nil="true" />
 </InnerFault>
 <TraceText>[Microsoft.Xrm.Sdk.Workflow: Microsoft.Xrm.Sdk.Workflow.Activities.RetrieveEntity]
[RetrieveEntity]
    *****Tracing Initiated*****
    *****IOrganizationService created*****
    *****Entity logical Name: email*****
    *****Entity ID: c49e4c7c-8724-de11-86ce-000c290f83d7*****
    *****Retrieve Request declared*****
    *****Retrieve Response executed*****
    *****businessEnitity retrieved*****
    *****Activity Party Name: contact*****
    *****Activity Party Id: 79ed3a33-8eb9-dc11-8edd-00c09f226ebb*****
    *****Activity Party not null*****
    *****Contact assigned*****
    *****foreach ended*****</TraceText>
</OrganizationServiceFault>
   at Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Retrieve(String entityName, Guid id, ColumnSet columnSet, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)
   at Microsoft.Crm.Extensibility.InprocessServiceProxy.RetrieveCore(String entityName, Guid id, ColumnSet columnSet)
   at Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.Retrieve(String entityName, Guid id, ColumnSet columnSet)
   at Microsoft.Crm.Workflow.Services.RetrieveActivityService.<>c__DisplayClass1.<RetrieveInternal>b__0(IOrganizationService sdkService)
   at Microsoft.Crm.Workflow.Services.ActivityServiceBase.ExecuteInTransactedContext(ActivityDelegate activityDelegate)
   at Microsoft.Crm.Workflow.Services.RetrieveActivityService.ExecuteInternal(ActivityContext executionContext, RetrieveEntity retrieveEntity)
   at Microsoft.Crm.Workflow.Services.RetrieveActivityService.Execute(ActivityContext executionContext, RetrieveEntity retrieveEntity)
   at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
   at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)


推荐答案


I '收到了其他错误或没有错误,但我知道它不起作用

I've received different errors or no errors, but I know its not working

首先,建议您列出问题中的错误。回答您的问题和避免出现-1秒将更加容易。 :)其次,在工作流中使用跟踪服务。

First, I suggest you to list errors in your question. It will be much easier to answer you and to avoid -1s. :) Second, use tracing service in workflow.

ITracingService tracingService = context.GetExtension<ITracingService>();
tracingService.Trace("I'm tracing something....");

如果找不到带有指定电子邮件的 Contact 怎么办?您必须处理这种情况。可能在这里失败。发布有问题的错误日志,以进行检查。

What should happen if Contact with specified email is not found? You have to handle this case. Probably it fails here. Post error log in question, to check this.

这篇关于CRM 2011自定义工作流程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆