我有一个自定义工作流活动,可以从我的自定义工作流活动中创建新机会。 我把这项活动作为一个行动步骤。我正在使用动作,因为它有一个输出。我需要获得我创造的机会。 我使用Process.js从JS Web资源调用该操作。之后,我使用Notify.js通知用户创建了机会。在那个通知上,我需要有一个链接到新创建的机会的按钮。
以下是与输出参数相关的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);
以下是调用action的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");
}
);
只是说,它有效,行动被召唤,机会被创造,之后有通知。只是不知道如何使用动作输出参数来设置机会的链接。
答案 0 :(得分:1)
您似乎正在尝试处理CodeActivity
课程中的操作。这不行。 OutArgument
属性只能在工作流程中访问,不能返回到调用进程。
而是使用所需的输入和输出参数创建一个动作。然后创建一个插件并在此操作上注册同步后更新步骤。插件类实现必须将机会ID添加到OutputParameters
集合,如下所示:
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上的此解释。
答案 1 :(得分:0)
正如Henk悲伤,无法通过实体参考,所以我在我的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
的第一部分在Action调用中,但不在通知中,最后一行在通知中,因此它们位于代码的不同部分。因此我将Opport
定义为全局变量,然后我可以在一个函数中设置值,并在通知中从其他函数中调用它。
还有另一个选项,没有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);