代码之家  ›  专栏  ›  技术社区  ›  Ubiquitous Che

MS CRM 4.0 CRM服务-关闭任务

  •  0
  • Ubiquitous Che  · 技术社区  · 16 年前

    我正在尝试解决如何使用CRMService关闭MS CRM 4.0中的任务。

    我已经尝试使用setstatetaskrequest将任务的状态和状态设置为task state.completed和5。我还尝试了taskstate.completed和-1,但也没有骰子。

    不管怎样,我只在crmservice.execute上接收到曾经有用的“服务器无法处理请求”异常。

    我可以自由地创建和更新任务。但我似乎不能让他们完成。真令人沮丧。

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

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

    我想不出是什么导致了这个问题。任何建议,甚至是正确的方向上的一个点都会非常感谢。

    第一次编辑:

    感谢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>
    

    这很奇怪-想想我的代码(几乎和格雷格的代码相同:

            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确认,任务的这个状态值是5-这是从枚举传入的值。

    我还可以确认将gtaskid设置为有效的guid,该guid引用了实际存在的任务,并在尝试关闭时打开。

    保管人和保管人。有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  1
  •   grega g    16 年前

    使用 设置状态任务请求 班级。

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

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

        2
  •  0
  •   okutane    16 年前

    你确定当你试图结束任务时你通过了吗? 地位 有效期为“已完成”的值 状态 ?不同的状态代码仅对其对应的状态代码有效。可以添加源代码和状态实体自定义的一部分吗?

        3
  •  0
  •   Ubiquitous Che    16 年前

    找到了!

    好的-仔细查看上面的代码和错误消息,我的crmservice包含属性entityid-但异常是缺少属性entityid。

    不知何故 ,我的crmservice已将其entityid属性重命名为entityid。

    重命名属性修复了问题。一开始我还是不知道是怎么回事。

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

    通过查看代码,似乎有人在“id”上进行了查找和替换,并将其转换为“id”——这在我的工作区中是表示主键的属性字段的命名约定。

    再次感谢Grega G指出细节酒店有我需要的额外信息。