我要添加一个新的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。
答案 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);