利用具有自定义补货需求的“创建采购订单”处理屏幕

时间:2018-11-15 21:25:53

标签: acumatica

我要添加一个新的DAC /图形来推动购买,我想遍历“创建采购订单”处理屏幕以使其与Acumatica ERP保持一致。我正在利用INReplenishmentMaint创建INItemPlan记录,但是我需要一个usrField来捕获我的源引用号(类似于SO订单号)。

保存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行中进行查找,但是我需要反向查找...也就是说,我需要从存储在usrField中的值中找到我的INItemPlan在Ext DAC上。

如何从Ext DAC返回基本DAC?还是我只是要解决这个问题? (如果是这样,请告诉我如何将myData行处理到PO中以与Acumatica ERP保持一致。)我正在使用2018R1。

1 个答案:

答案 0 :(得分:0)

非常简单的解决方案...我做了一个自定义类,该类继承自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);