【问题标题】:Unable to create Sales Order via API with items from Inactive Vendor无法通过 API 使用来自非活动供应商的项目创建销售订单
【发布时间】:2017-08-10 02:57:20
【问题描述】:

当尝试通过 API 调用创建销售订单时,如果订单上任何项目标记为默认的供应商状态为非活动状态,则会返回错误并显示以下消息:“PX.Data.PXException:供应商状态为'不活动'"

但是,通过标准屏幕创建销售订单时,使用非活动默认供应商订购商品没有问题。

我们希望将供应商标记为非活动,但需要为屏幕允许的项目创建销售订单。如何做到这一点?

【问题讨论】:

  • 使用屏幕接收消息,但仅作为在跟踪窗口中发现的警告。我认为 API 调用中不会出现警告(只有错误)。该消息来自 SOLine.VendorID 上的限制器。要按原样解决,请通过站点上的扩展覆盖验证字段或在 API 调用中将供应商 ID 设为空

标签: acumatica


【解决方案1】:

我假设错误来自 Brendan 评论中的 SOLine.VendorID。

以下是调试该问题并使用 FieldVerifying 事件修复它的步骤。

在 SalesOrder 屏幕上添加 SOLine.VendorID 字段:

使用您添加的字段重现 SalesOrder 中的错误:

检查跟踪错误,它表明错误来自 PXRestrictor 属性:

检查 VendorID 字段,它有一个 PXRestrictor 和您收到的 VendorIsInStatus 错误消息:

可以使用 FieldVerifying 事件取消 PXRestrictor 属性验证,将该处理程序添加到 SOLine.VendorID 的 SalesOrder:

public class SOOrderEntry_Extension:PXGraphExtension<SOOrderEntry>
{
    protected void SOLine_VendorID_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
    {
        e.Cancel = true;
    }
}

再次测试 SalesOrder,如果有效,您可以删除您添加到网格中的 VendorID/VendorName 进行调试:

【讨论】:

    【解决方案2】:

    根据 Brendan 的评论,我修改了 SOLine.VendorID 的 PXRestrictor 属性以允许处于非活动状态:

    public class SOLineExt : PXCacheExtension<PX.Objects.SO.SOLine> {
      [PXMergeAttributes(Method = MergeMethod.Merge)]
      [PXRestrictor(typeof(Where<Vendor.status, IsNull,
                Or<Vendor.status, Equal<BAccount.status.active>,
                Or<Vendor.status, Equal<BAccount.status.inactive>,
                Or<Vendor.status, Equal<BAccount.status.oneTime>>>>>), PX.Objects.AP.Messages.VendorIsInStatus, typeof(Vendor.status))]
      public virtual Int32? VendorID { get; set; }
    }
    

    【讨论】:

    • 一种替代方法可能是扩展 SOLine.VendorID 的字段验证并查看 IsImport、IsMobile 和/或 IsContractBasedAPI 并根据需要调整逻辑。例如,您可以让它验证,除非使用合同 Web 服务 (myGraph.IsContractBasedAPI == true)。
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多