0

我正在尝试研究如何使用 CrmService 关闭 MS CRM 4.0 中的任务

我尝试使用 将SetStateTaskRequest任务的状态和状态设置为 TaskState.Completed 和 5。我也尝试了 TaskState.Completed 和 -1,但也没有骰子。

无论哪种方式,我只在 CrmService.Execute 尝试中收到有用的“服务器无法处理请求”异常。

我可以随心所欲地创建和更新任务。但我似乎无法将它们设置为已完成。这令人沮丧。

我注意到我只能通过关闭任务操作在 CRM 中将任务的状态设置为已完成。我想知道是否需要进行单独的 CrmService 调用来执行关闭任务操作,而不是通过 CrmService.Execute 方法。

哦:我正在以完全权限登录 CrmService。所以我看不出这将是任务项的权限问题。

我想不出还有什么可能导致这个问题。非常感谢任何建议,甚至只是正确方向的一点。

第一次编辑:

感谢grega g回答让我检查异常的详细信息字段。

我现在有更详细的异常消息。在 XML 形式中:

<error>
    <code>0x80040203</code>
    <description>Invalid format of input XML for request SetStateTask: required field 'EntityId' is missing.</description>
    <type>Platform</type>
</error>

这很奇怪 - 考虑一下我的代码(几乎与 greg g 的代码相同:

SetStateTaskRequest request = new SetStateTaskRequest();
request.EntityID = gTaskId;
request.TaskState = TaskState.Completed;

// ETaskStatusCode is an enumeration of the status codes taken from the StringMap in CRM.
//
// ETaskStatusCode.Completed = 5 - I can confirm this is the accurate status value for a Closed Task.
//
// Also, I have attempted this code with -1, which the documentation claims should cause the status
// to automatically be set to the default status for the supplied state. No change there.
request.TaskStatus = (int)ETaskStatusCode.Completed;            

SetStateTaskResponse response = CRMManager.CrmService.Execute(request) as SetStateTaskResponse;

此外,为了确认我有正确的状态代码(并分享我在处理 MS CRM 时发现的非常有用的内容),这是我用来确定实体状态值的 SQL。

SELECT
    MSE.ObjectTypeCode,
    MSE.PhysicalName,
    SM.AttributeName,
    SM.Value,
    SM.AttributeValue
FROM MetadataSchema.Entity MSE
    INNER JOIN StringMap SM on MSE.ObjectTypeCode = SM.ObjectTypeCode
ORDER BY MSE.PhysicalName, SM.AttributeName, SM.AttributeValue  

我可以从 MS CRM Web 界面确认与已完成任务关联的状态值也称为已完成。我可以从上面的 SQL 中确认,对于 Task,此状态的值为 5 - 这是从我的 Enum 传入的值。

我还可以确认 gTaskId 被设置为一个有效的 Guid,该 Guid 引用了一个实际存在的任务,并且在尝试关闭时处于打开状态。

越来越好奇。有什么想法吗?

4

3 回答 3

1

使用SetStateTaskRequest类。

SetStateTaskRequest task2Close = new SetStateTaskRequest();
task2Close.EntityId = <taskGuid>
task2Close.TaskState = TaskState.Completed;
task2Close.TaskStatus = <some value>

try
{
    SetStateTaskResponse r = (SetStateTaskResponse) crmSvc.Execute(task2Close);
}
catch (SoapException e)
{
   //Use e.Details for more info than "server was unable ..."
}

此代码应该可以工作(或让您了解发生错误的原因)

于 2009-10-21T06:23:33.313 回答
0

您确定当您尝试关闭任务时传递的状态值对 Completed状态有效吗?不同的状态码只对对应的状态码有效。你能添加你的源代码和你的状态实体定制的一部分吗?

于 2009-10-21T06:34:27.737 回答
0

找到了!

好的 - 仔细查看我上面的代码和错误消息,我的 CrmService 包含属性 EntityID - 但例外是缺少属性 EntityId。

不知何故,我的 CrmService 将其 EntityId 属性重命名为 EntityID。

重命名属性解决了这个问题。我仍然不知道那是怎么发生的。

为了安全起见,我将重新生成一个新的服务代理,以确保我的属性被正确命名。

查看代码,似乎有人对“Id”进行了查找和替换,并将其转换为“ID”——顺便说一下,这是我工作场所中代表主键的属性字段的命名约定。

再次感谢 grega g 指出 Detail 属性包含我需要的额外信息。

于 2009-10-21T21:43:50.690 回答