首页 > 解决方案 > 利用具有自定义补货需求的创建采购订单处理屏幕

问题描述

我正在添加一个新的 DAC/Graph 来推动购买,并且我想通过 Create Purchase Order 处理屏幕进行路由,以使其与 Acumatica ERP 保持一致。我正在利用 INReplenishmentMaint 创建 INItemPlan 记录,但我需要一个 usrField 来捕获我的源参考号(类似于 SO Order #)。

保存 INItemPlan 记录后,我更新 INItemPlanExt.usrField 以通过以下方式捕获我的源记录:

planExt.UsrField = myData.myKeyField;
graphRepl.Caches[typeof(INItemPlanExt)].Update(planExt);
graphRepl.Caches[typeof(INItemPlanExt)].Persist(PXDBOperation.Update);

但是,如果我尚未创建采购订单,则无法使用采购订单参考更新 myData。因此,如果在我的自定义图表中单击“创建 PO”按钮时存在现有的 INItemPlan 记录,我需要更新它,但要继续创建新的 INItemPlan 记录。

我的困境是与 myData 的连接在 INItemPlanExt 中,我可以从我的 INItemPlan 行中查找,但我需要反向查找...也就是说,我需要从存储在 Ext 上的 usrField 中的值中找到我的 INItemPlan数模转换器。

如何从 Ext DAC 返回基本 DAC?还是我只是在处理这个错误?(如果是这样,请告诉我应该如何将 myData 行处理为 PO 以与 Acumatica ERP 保持一致。)我正在使用 2018R1。

标签: acumatica

解决方案


非常简单的解决方案...我创建了一个继承自 INItemPlan 的自定义类,并在那里添加了我的字段。这允许我在搜索 INItemPlan 表以查找我的自定义参考时访问该字段。

[Serializable()]
public partial class ZZINItemPlan : INItemPlan, IBqlTable
{
    #region UsrTagNbr
    [PXDBString(15)]
    [PXUIField(DisplayName ="Tag Nbr.")]
    public virtual string UsrTagNbr { get; set; }
    public abstract class usrTagNbr : PX.Data.IBqlField { }
    #endregion
}

接下来,从“usrTagNbr”中找到行...

ZZINItemPlan plan =
    PXSelect<ZZINItemPlan, Where<ZZINItemPlan.usrTagNbr, Equal<Required<ZZINItemPlan.usrTagNbr>>>>
    .Select(this, myData.TagNbr);

如果未找到 TagNbr 应用更新,则创建一个新行...

if (plan == null) plan = new ZZINItemPlan();
[set values here]

让我们执行普通图来更新(如果没有找到将插入)到数据库中,以便所有正常的业务逻辑都被命中以进行验证。(我们必须将 ZZINItemPlan 数据转换为图表的 INItemPlan。)

INReplenishmentMaint graphRepl = PXGraph.CreateInstance<INReplenishmentMaint>();
INItemPlan iplan = graphRepl.Plans.Update((INItemPlan) plan);

由于 usrTagNbr 字段已因转换为 INItemPlan 而丢失,因此我们需要将 TagNbr 数据推送到 DAC 扩展中。

INItemPlanExt planExt = PXCache<INItemPlan>.GetExtension<INItemPlanExt>(iplan);

planExt.UsrTagNbr = ncmTag.TagNbr;
graphRepl.Caches[typeof(INItemPlanExt)].Update(planExt);
graphRepl.Caches[typeof(INItemPlanExt)].Persist(PXDBOperation.Update);

推荐阅读