Referenzen auf Records in Workflows/Workflow Activities

Wird in einem Workflow bzw. in einer Workflow Activity auf einen Record einer Entität zugegriffen, muss diese Referenz beim Deployment auf ein anderes System jeweils neu gesetzt werden. Der Grund ist einfach: Die Id’s der Records stimmen nicht überein. Es gibt verschiedene Möglichkeiten wie das gehandelt werden kann. Eine davon zeige ich in diesem Post.

Das Problem an einem Beispiel:
In einem Workflow soll ein neuer Account erstellt werden. Dieser neue Account soll immer denselben Parent Account “test” haben. Dafür wird einfach das Lookup auf den entsprechenden Account gesetzt.
EntityReferenceInWorkflow_1

Wird nun dieser Workflow auf einem anderen System deployt, kann die Referenz nicht aufgelöst werden. Nach jedem Deployment muss also die Referenz von Hand wieder gesetzt werden.

Die Idee ist, ein Record über eine andere Eigenschaft, die auf allen Systemen gleich ist, zu identifizieren. Mit Hilfe einer Custom Workflow Activity wird dann die Referenz auf den Record geholt. Der Code dazu ist relativ simpel. Es gibt ein InArgument welches die zu suchende Eigenschaft entgegen nimmt und ein OutArgument das die Referenz zurückliefert.

public class FindAccountByName : CodeActivity
{
  [Input("Account Name")]
  [RequiredArgument]
  public InArgument<string> AccountNameArgument { get; set; }

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

  protected override void Execute(CodeActivityContext executionContext)
  {
    var context = executionContext.GetExtension<IWorkflowContext>();
    var serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

    var queryByAttribute = new QueryByAttribute("account");
    queryByAttribute.AddAttributeValue("name", AccountNameArgument.Get<string>(executionContext));
    EntityCollection result = service.RetrieveMultiple(queryByAttribute);
    Entity entity = result.Entities.Single();
    AccountArgument.Set(executionContext, entity);
  }
}

Die Custom Workflow Activity wird nun in den Workflow eingefügt
EntityReferenceInWorkflow_2

und der Parameter mit dem entsprechenden Wert gesetzt.
EntityReferenceInWorkflow_3

Im Create kann nun das Lookup auf den Wert des OutArguments, der Custom Activity, gesetzt werden.
EntityReferenceInWorkflow_4

Leider muss für ein In- oder OutArgument, mit dem Typ EntityReference, jeweils das Attribut “ReferenceTarget” angegeben werden. Dadurch ist es nicht möglich eine generische Workflow Activity zu schreiben und diese dann für jede Entity zu verwenden.

One thought on “Referenzen auf Records in Workflows/Workflow Activities

Leave a Reply

Your email address will not be published. Required fields are marked *