我正在尝试使用Silverlight将现有发票标记为动态CRM 2011中的付款。
根据documentation,我需要做的就是设置状态代码= 100001和州代码= 2.
当我这样做时,我得到一个“NotFound”异常。
Guid invoiceID = new Guid("Existing Invoice Guid");
IOrganizationService orgService = OrgServiceFactory.GetInstance();
orgService.BeginRetrieve("invoice", invoiceID, new ColumnSet(new string[] { "invoiceid", "statecode", "statuscode" }), (result) =>
{
var fetchResp = orgService.EndRetrieve(result);
var statecodeAttrib = fetchResp.Attributes.Single(a => a.Key == "statecode");
OptionSetValue statecode = (OptionSetValue)statecodeAttrib.Value;
statecode.Value = 2;
var statuscodeAttrib = fetchResp.Attributes.Single(a => a.Key == "statuscode");
OptionSetValue statuscode = (OptionSetValue)statuscodeAttrib.Value;
statuscode.Value = 100001;
orgService.BeginUpdate(fetchResp, (updateResult) =>
{
/* Web Exception thrown here */
orgService.EndUpdate(updateResult);
Console.Write("");
}, orgService);
}, orgService);
如果我删除“状态代码”位,并尝试将状态代码设置为2 - (部分发货)或4 - (结算),则按预期工作。
只有当我尝试设置时它才会失败。如果我只是尝试设置statuscode = 100001,100002,100003(完成,部分,取消),它也会失败
还有另一种方法可以将发票标记为付款吗?
答案 0 :(得分:5)
要更改记录的状态,您始终需要执行单独的SetState请求,而不是仅对状态和状态代码进行简单更新。在您的情况下,您可以执行SetStateDynamicEntity或SetStateInvoice请求。
不幸的是,CRM 2011中的OData服务无法提供这些消息。您需要做的是通过Silverlight使用SOAP Web服务。 SDK has a walkthrough,如果您想要先行一步,SilverCRMSoap库可以快速实现该演练。
答案 1 :(得分:4)
执行标准SetState请求也将起作用,无需建立SOAP连接。
SetStateRequest request = new SetStateRequest();
request.EntityMoniker = new EntityReference(Invoice.EntityLogicalName, invoice.Id);
request.State = new OptionSetValue ((int)InvoiceState.Paid);
request.Status = new OptionSetValue (100001); // Complete
SetStateResponse response = (SetStateResponse)_service.Execute(request);