为什么我需要 2 API 次调用才能将未确认的包裹添加到货件中

Why do I need 2 API call to add an unconfirmed package to shipment

当我尝试将包裹添加到货件时,即使我将确认值设为 false,Acumatica 似乎也会用真实值覆盖它。

这是我第一次调用时使用的代码示例,因为第二次调用只是再次将确认值设置为 false。

static void Main(string[] args)
{
    DefaultSoapClient client = new DefaultSoapClient();
    client.Login("admin", "admin", "Company", null, null);

    Shipment ship = new Shipment
    {
        ShipmentNbr = new StringSearch { Value = "001301", Condition = StringCondition.Equal },
        Packages = new ShipmentPackage[]
        {
            new ShipmentPackage
            {
                BoxID = new StringValue {Value = "Large" },
                Confirmed = new BooleanValue {Value=false },
                Weight = new DecimalValue {Value = 1.5m }
            }
        }
    };
    client.Put(ship);
    client.Logout();
}

这里的问题是 SOShipment Graph (SOPackageDetail_Weight_FieldUpdated) 中有一个事件会在更新称重字段时将已确认复选框的值更改为 true。

解决此问题的一个简单方法是添加一个小的自定义项,这将在使用基于 API 的合同时禁用该事件的内容。

public class SOShipmentEntry_Extension : PXGraphExtension<SOShipmentEntry>
{

    #region Event Handlers

    protected void SOPackageDetail_Weight_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {
        if (InvokeBaseHandler != null)
            if (!Base.IsContractBasedAPI)
                InvokeBaseHandler(sender, e);
    }
    #endregion
}

尽管如果您不希望此事件在任何其他时间发生,您始终可以添加该事件但将其留空。