2013-02-20 135 views
1

我去插件工作,我在這裏更新了工作代碼。希望能幫助到你!!客戶關係管理2011定製工作流程

我創建了一個工作流程,它有一個插件可以從電子郵件記錄的「FROM」字段檢索聯繫人實體。我試圖查看該電子郵件是否存在於聯繫人實體中。輸入是「FROM」電子郵件,輸出將返回Contacts實體。我一直無法獲得此代碼的工作,我收到了不同的錯誤或沒有錯誤,但我知道它不工作。請幫忙!提前致謝!

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   
    } 
} 

因此,我們正在將我們的內部CRM系統從4.0升級到2011年,這是一個工作流程上的插件。我沒有原始的源代碼,所以我不知道代碼在做什麼。但在導出解決方案後,我對原始.dll文件進行了反編譯。我試圖重寫CRM 2011的代碼,這裏是我的。在測試完工作流程後,我收到錯誤消息:「預期的非空Guid」。代碼在循環之後到達最後一行然後給我錯誤。下面是跟蹤:

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) 

回答

3

我收到了不同的錯誤或沒有錯誤,但我知道它不工作

首先,我建議你列出你的問題的錯誤。回答你並避免-1s會容易得多。 :)其次,在工作流程中使用跟蹤服務。如果聯繫與指定的電子郵件沒有找到

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

應該發生什麼?你必須處理這種情況。可能它在這裏失敗了。發佈錯誤日誌問題,以檢查此問題。

2

如果我要給出一個從臀部開始的答案,我猜這是問題在於,在某些情況下,您無法匹配並過濾掉所有內容。然後,在某處(或嘗試引用空的 guid),或嘗試選擇一個尚未輸入的屬性,以使其儘管已定義,但未送達)。

你會得到什麼確切的錯誤?你什麼時候得到他們,什麼時候不要?

此外,我注意到的代碼的一些問題(不是解決方案,但仍可能會改進)。

錯字的名稱。我想你想要ContactReference

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

我會以不同的方式設計查詢。既然你知道你想要匹配什麼地址,你可能想精確地過濾它。此外,你似乎只需要基於電子郵件的匹配guid,所以你只需要獲取。

private Guid MatchSenderWithExistingContact(
    IOrganizationService service, String fromAddress) 
{ 
    QueryExpression query = new QueryExpression 
    { 
    EntityName = "contact", 
    ColumnSet = new ColumnSet("emailaddress1"), 
    Criteria = new FilterExpression 
    { 
     Filters = 
     { 
     new FilterExpression 
     { 
      Conditions = 
      { 
      new ConditionExpression(
       "emailaddress1", ConditionOperator.Equal, fromAddress) 
      } 
     } 
     } 
    } 
    }; 

    EntityCollection retrieveMultipleRequest = service.RetrieveMultiple(query); 
    IEnumerable<Entity> entities = retrieveMultipleRequest.Entities; 
    return entities.FirstOrDefault().Id; 
} 

你可能想要把查詢的聲明上一步一步的語法。我更喜歡這種方式,因爲創建高級查詢更方便。但是,如上所示,當您迭代並使用中斷的部分肯定會更好。

快樂編碼!

它可能適合你使用跟蹤。通常,我將追蹤對象聲明爲插件類中的成員變量,然後在每次操作時寫入它。這樣,至少我知道其中糞便擊中AC並且可以在此之前記錄變量的值。

private ITracingService trace; 

public void Execute(IServiceProvider serviceProvider) 
{ 
    trace = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); 
    _trace.Trace("Tracing successful!"); 
    throw new Exception("Intentional! Nice."); 
} 

請記住,除非發生未捕獲的異常,否則跟蹤不會顯示。事實上,我有意故意崩潰執行,只是爲了看看變量中有什麼。因此,請記住,如果您有全局的try-catch,則需要手動重新引發異常。

此方法的優勢在於您可以在本地和在線上進行跟蹤。它適用於除異步以外的所有插件註冊。對此也有解決方法,但這不是你問題的主題,我已經離題了。

+0

我發佈了日誌,你能幫忙嗎?謝謝! – anis0315 2013-02-23 16:21:57

+0

@ anis0315它說在你的文章中,你得到它的工作。那很棒。你願意解釋一下問題是什麼,以便下一個人能解決他的問題嗎? – 2013-02-24 22:25:05

相關問題