You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:52:36