通过Web服务更新Dynamics CRM 2013中的Money字段的首选方法是什么?

时间:2014-07-24 03:48:54

标签: web-services rest odata dynamics-crm dynamics-crm-2013

我在CRM中有一个实体,上面有一些Money字段。在创建实体时,这些字段没有任何价值,因此创建并保存实体。但是,如果我有值并继续更新它们(通过UI或Web服务),我基本上会收到错误声明"货币不能为空"。

在用户界面中:

I then get a red circle with an X through it if I go to update the value.

在代码(网络服务电话)中:

var crmService = new CrmServiceReference.IFAAContext(new Uri(crmWebServicesUrl));
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;
var crmAccount = crmService.AccountSet.Where(a => a.AccountId == accountId).FirstOrDefault();
crmAccount.myitems_MoneyValueItem.Value = 10.0m;
crmService.UpdateObject(crmAccount);
crmService.SaveChanges()

然后我得到"货币不能为空"在.SaveChanges()调用。

在代码中(第二次尝试):

var crmService = new CrmServiceReference.IFAAContext(new Uri(crmWebServicesUrl));
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;
var crmAccount = crmService.AccountSet.Where(a => a.AccountId == accountId).FirstOrDefault();
var crmCurrency = crmService.TransactionCurrencySet.Where(c => c.ISOCurrencyCode == "AUD").First();
crmService.SetLink(crmAccount, "TransactionCurrency_Account", crmCurrency);
//crmService.SaveChanges() /* tried with this uncommented as well to try and "set currency" before setting value */

crmAccount.myitems_MoneyValueItem.Value = 10.0m;
crmService.UpdateObject(crmAccount);
crmService.SaveChanges()

所以这个尝试以同样的方式失败,但是如果我再次运行它(没有货币和SetLink)以便货币在之前保存它确实有效 - 因此尝试做第二次.SaveChanges()但是第一次真的需要它才能完成工作。

在代码中(第三次尝试):

var crmService = new CrmServiceReference.IFAAContext(new Uri(crmWebServicesUrl));
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;
var crmAccount = crmService.AccountSet.Where(a => a.AccountId == accountId).FirstOrDefault();

crmAccount.athos_MoneyValueItem= new CrmServiceReference.Money() { Value = 10.0m };
crmService.UpdateObject(crmAccount);
crmService.SaveChanges()

这似乎不起作用

4 个答案:

答案 0 :(得分:2)

当您创建包含Money字段的新记录(或更新之前未填充Money字段的现有字段)时,您需要指定货币,要设置的正确字段为{ {1}}(逻辑名称TransactionCurrencyId),它是对货币实体的查找(因此代码内部是transactioncurrencyid)。

假设您的货币的Guid存储在EntityReference变量中:

currencyId

答案 1 :(得分:0)

CRM 2013期望货币字段的Money对象。

crmAccount.myitems_MoneyValueItem = new Money(10.0m);

除非您的CRM组织没有默认货币集,否则您不必明确申报货币(因为您需要在创建组织时设置此货币,因此应始终设置它。)

答案 2 :(得分:0)

看起来我是在查找货币(羞耻作为额外的数据调用),然后使用它来设置TransactionCurrencyId然后"工作" ...似乎我不应该这样做,因为我确实有一个组织的默认设置。但这似乎有效,因为它可以更新这些字段。

var crmCurrency = crmService.TransactionCurrencySet.Where(c => c.ISOCurrencyCode == currencyCode).First();
var crmService = new CrmServiceReference.IFAAContext(new Uri(crmWebServicesUrl));
crmService.Credentials = System.Net.CredentialCache.DefaultCredentials;
var crmAccount = crmService.AccountSet.Where(a => a.AccountId == accountId).FirstOrDefault();

crmAccount.TransactionCurrencyId = new CrmServiceReference.EntityReference() { Id = crmCurrency.TransactionCurrencyId, LogicalName = "transactioncurrency", Name = crmCurrency.CurrencyName };
crmAccount.myitems_MoneyValueItem.Value = 10.0m;

crmService.UpdateObject(crmAccount);
crmService.SaveChanges();

答案 3 :(得分:0)

我正在做同样的事情,但无法在service.create.

期间设置货币字段值

我已经放入

entity.Attributes["transactioncurrencyid"] = currencyGuid;
entity.Attributes["new_moneyfield"] = new Money(123.45M);

但最后,记录是在填充了transactioncurrency字段的情况下创建的,而money字段是空白的。

顺便提一下CRM online 2016上的自定义工作流程。