2016-10-09 8 views
0

カスタムワークフローアクティビティから新しいチャンスを作成するカスタムワークフローアクティビティがあります。 私はアクションステップとしてそのアクティビティを持っています。私は出力を持っているので、アクションを使用しています。私は創造された機会のIDを取得する必要があります。 Process.jsを使用してJS Webリソースからそのアクションを呼び出します。その後、Notify.jsを使用して、機会が作成されたことをユーザーに通知します。その通知では、新しく作成された機会へのリンクとなるボタンが必要です。Notify.jsを使用して新しく作成されたエンティティレコードにリンクを追加する - CRM

出力パラメータに関連するC#コードの一部です。ただ、機会を作成するためのコードの一部に気づき、そしていくつかのより多くの作業を行うと、正常に動作します:ここで

//define variable 
[Output("Opportunity")] 
[ReferenceTarget("opportunity")] 
public OutArgument<EntityReference> NewOpportunity { get; set; } 

//create opportunity and entity reference(i am not sure do ineed entity reference, or something else for that link) 
Guid opportunityId = service.Create(opportunity); 
EntityReference OppId = new EntityReference(opportunity.LogicalName, opportunityId); 

//assign value to the output variable 
NewOpportunity.Set(Econtext, OppId); 

は、私はアクション定義で私のアクションパラメータを作成する方法である: enter image description here

そして、ここでは、JSですアクションが呼び出されるコード:

function toOpportunity(){ 

Process.callAction("ad_opportunity", 
    [{ 
     key: "Target", 
     type: Process.Type.EntityReference, 
     value: { id: Xrm.Page.data.entity.getId(), entityType: "ad_productsamplerequest" } 
    }], 
    function (param) { 
     //Success    
     Notify.add("New Opportunity was created:", "INFO", "opportunity", 
    [{ 
     type: "button", 
     text: "Go to opportunity", 
     callback: function() { 

     } 
    }]); 
    }, 
    function() { 
     // Error 
     alert("Opportunity was not created"); 
    } 
); 

アクションが呼び出され、機会が作成され、その後に通知があります。機会へのリンクを設定するためにアクション出力パラメータを使用する方法を知らないだけです。

答えて

1

CodeActivityクラスのアクションを処理しようとしているようです。これは動作しません。 OutArgumentのプロパティはワークフロー内でのみアクセス可能であり、呼び出し元のプロセスに返すことはできません。

代わりに、目的の入力パラメータと出力パラメータでアクションを作成します。次に、プラグインを作成し、このアクションに対して同期後の更新手順を登録します。プラグインクラスの実装では、このように、OutputParametersコレクションに機会のIDを追加する必要があります。

public void Execute(IServiceProvider serviceProvider) 
{ 
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
    var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); 
    var service = factory.CreateOrganizationService(context.UserId); 

    Entity opportunity; 
    // TODO: add code here to build the opportunity. 

    Guid opportunityId = service.Create(opportunity); 
    context.OutputParameters.Add("NewOpportunity", new EntityReference("opportunity", opportunityId)); 
} 

MSDNにも、この説明を参照してください。

ヘンク悲しいよう
+0

コードアクティビティでこれを行うことはどうしてですか? このコードアクティビティをアクションから呼び出す必要があります。なぜなら、この条件を呼び出すと、実際に特定の条件があるからです。私は出力パラメータを持っているので、私はアクションを使用しています、そして、私はそのパラメータを使用してIDを取得するように教えました。 –

+0

IDのためだけに新しいプラグインを持つことは可能でしょうか。 Opportunityが作成されたときにpost create stepを登録し、作成したOpportunityのIDを取得するために使用するだけですか? –

+1

@MilosNikolic:アクションとコードアクティビティは、2つの異なるコンポーネントです。私はもう少し説明を与えるために私の答えを広げた。これは役に立ちますか? –

0

、エンティティ参照を渡すことはできませんので、私は私のCodeActivityに文字列としてGUIDを渡さ:

[Output("Opportunity")] 
public OutArgument<string> NewOpportunity { get; set; } 

...

Guid opportunityId = service.Create(opportunity); 
string guidSend = opportunityId.ToString(); 
NewOpportunity.Set(Econtext, guidSend); 

私がいることを使用した後JSで出力:

var OGuid = param["NewOpportunity"]; 
     Opport = OGuid.replace(/ /g,''); 

このような新しい機会に関係を設定してください:

Xrm.Utility.openEntityForm("opportunity",""+Opport); 

JavaScriptの最初の部分は、アクションの呼び出しではなく、通知であり、そして最後の行は通知にあるので、彼らは、コードの異なる部分です。したがって、私はグローバル変数としてOpportを定義して、1つの関数に値を設定して、通知内の他の関数から値を呼び出すことができます。

C#部分がない別のオプションがあります。通知コールバック関数でフェッチを作成し、最後に作成した案件IDを返すことができます。これは簡単ですが、それほど簡単ではありません。

 var contactFetchXML = "<fetch mapping='logical' version='1.0' distinct='true' count='1' >"+ 
           "<entity name='opportunity' >"+ 
           "<attribute name='opportunityid' />"+ 
           "<order attribute='createdon' descending='true' />"+ 
           "</entity>"+ 
          "</fetch>"; 


    var Guid = XrmServiceToolkit.Soap.Fetch(contactFetchXML); 

    Xrm.Utility.openEntityForm("opportunity",""+Guid[0].id); 
関連する問題