通过Dynamics GP API创建订单时修改UnitPrice失败的问题求助
解决Dynamics GP API创建订单时UnitPrice不生效的问题
我来帮你排查下这个单价设置不生效的问题,在Dynamics GP API里调整销售订单行的UnitPrice确实有几个容易忽略的细节,咱们一步步来梳理:
常见原因及解决方案
1. 业务政策(Policy)限制了手动修改单价
Dynamics GP的API操作会受业务规则政策约束,默认情况下,CreateSalesOrder的政策可能把UnitPrice设为只读状态,优先使用系统预设的价格(比如物品默认价、客户专属价目表),导致你手动设置的价格被覆盖。
解决方法:获取创建政策后,修改对应字段的只读属性:
// 获取创建政策后,添加这段代码修改权限 foreach (var policyDetail in salesOrderCreatePolicy.PolicyDetails) { // 匹配UnitPrice相关的政策项,不同API版本可能用DisplayName或PropertyName if (policyDetail.PropertyName.Equals("UnitPrice", StringComparison.OrdinalIgnoreCase)) { policyDetail.IsReadOnly = false; // 可选:如果需要强制使用手动输入的价格,可调整其他规则限制 } }
2. 货币设置不匹配
你在UnitPrice里指定了USD,但如果订单本身没有设置对应的货币属性,GP可能会忽略这个单价设置,或者自动用客户默认货币覆盖。
解决方法:给销售订单对象统一设置货币键:
// 在创建salesOrder后添加货币设置 var currencyKey = new CurrencyKey(); currencyKey.Id = "USD"; // 确保这个货币ID在你的GP系统中已配置 salesOrder.CurrencyKey = currencyKey; // 之后设置UnitPrice时,Currency可省略(和订单货币一致即可) salesOrderLine.UnitPrice = new MoneyAmount { Value = 1.11m };
3. 价格等级(PriceLevel)优先级更高
如果客户或物品关联了特定的价格等级,GP会自动从价格等级中取价,直接覆盖你手动设置的UnitPrice。
解决方法:清空订单行的价格等级,取消自动取价:
// 在salesOrderLine里添加这行,取消价格等级的自动取价逻辑 salesOrderLine.PriceLevelKey = null;
4. 检查API版本和权限
不同版本的Dynamics GP API对单价字段的处理逻辑可能有差异,另外要确保调用API的账号拥有修改销售订单价格的权限(比如GP系统内的销售订单编辑权限)。
修改后的完整代码示例
把上述修改整合到你的代码中,大概是这样:
// Create a sales order object var salesOrder = new SalesOrder(); // 设置订单货币(新增) var currencyKey = new CurrencyKey(); currencyKey.Id = "USD"; salesOrder.CurrencyKey = currencyKey; // Create a sales document type key for the sales order var salesOrderType = new SalesDocumentTypeKey(); salesOrderType.Type = SalesDocumentType.Order; salesOrder.DocumentTypeKey = salesOrderType; // Create a customer key var customerKey = new CustomerKey(); customerKey.Id = customerSummary[0].Key.Id; salesOrder.CustomerKey = customerKey; // Create a batch key var batchKey = new BatchKey(); batchKey.Id = "01-INBOUND"; salesOrder.BatchKey = batchKey; // Create a sales order line to specify the ordered item var salesOrderLine = new SalesOrderLine(); // Create an item key var orderedItem = new ItemKey(); orderedItem.Id = "AA1111"; salesOrderLine.ItemKey = orderedItem; // 取消价格等级自动取价(新增) salesOrderLine.PriceLevelKey = null; // Create a sales order quantity object var orderedAmount = new Quantity(); orderedAmount.Value = 1; salesOrderLine.Quantity = orderedAmount; // 现在设置UnitPrice应该可以生效了 salesOrderLine.UnitPrice = new MoneyAmount { Value = 1.11m }; // Create an array of sales order lines SalesOrderLine[] orders = { salesOrderLine }; salesOrder.Lines = orders; // Get the create policy for the sales order object var salesOrderCreatePolicy = dynamicsGP.GetPolicyByOperation("CreateSalesOrder", context); // 修改政策允许手动修改单价(新增) foreach (var policyDetail in salesOrderCreatePolicy.PolicyDetails) { if (policyDetail.PropertyName.Equals("UnitPrice", StringComparison.OrdinalIgnoreCase)) { policyDetail.IsReadOnly = false; } } // Create the sales order dynamicsGP.CreateSalesOrder(salesOrder, context, salesOrderCreatePolicy);
你可以先试下修改政策和货币设置这两个关键点,这是最常见的导致UnitPrice不生效的原因。
内容的提问来源于stack exchange,提问作者ihorko
相关产品推荐
相关产品推荐

