Acumatica 21R1 OpenAPI 2.0创建采购收据报curyid不能为空问题咨询
问题原因
- 会话分支上下文初始化异常
就算Acumatica实例没有配置多分支机构,采购收据这类涉及财务核算的单据,也依赖分支上下文获取默认币种配置。你登录时将branch参数传为空值,且错误地将预生成的JSON字符串传给RestSharp的AddJsonBody方法,导致请求体被二次转义,最终会话的分支上下文没有正确初始化,系统无法取到默认币种,抛出curyid can not be null错误。 - 单据提交参数格式异常
你手动将PurchaseReceipt对象序列化后再传给AddJsonBody,同样会触发二次序列化,导致提交的JSON结构不符合Acumatica OpenAPI要求,即便你取消币种参数的注释,字段也无法被系统正确识别。
修复方案
- 修正登录请求逻辑
不要传入预生成的JSON字符串,直接传入匿名对象让AddJsonBody自动序列化,同时补充实例的默认分支ID(可到Acumatica后台分支管理页面查询,哪怕仅有一个默认分支也必须填写):
// 替换原有的strBody定义和AddJsonBody代码 var loginBody = new { name = "admin", password = "[proper password]", tenant = "PWS Milwaukee", branch = "替换为你的实例默认分支编码" }; request.AddJsonBody(loginBody);
- 修正采购收据提交逻辑
不要手动序列化PurchaseReceipt对象,直接将对象传给AddJsonBody即可,也可以按需显式指定币种参数:
PurchaseReceipt theRec = new PurchaseReceipt{ Type = new StringValue { Value = "Receipt" }, VendorID = new StringValue { Value = "V1002" }, CurrencyID = new StringValue { Value = "USD" } }; // 去掉JsonConvert.SerializeObject调用,直接传对象 request.AddJsonBody(theRec);
- 可选校验:若修复后仍报错,可检查供应商
V1002的基础配置,确认其默认币种字段未被设为空值。
内容的提问来源于stack exchange,提问作者T-Rav
相关产品推荐
相关产品推荐

