在使用自定义“标签”表创建要通过PO履行的销售订单后,我需要将自定义“标签ID”附加到INItemPlan记录中,以备将来在购买过程中使用。虽然我可以在其他地方成功完成此操作,但是现在无法重复使用相同的方法。
在代码中,将为INItemPlan对象检索INItemPlanExt对象。将一个值分配给UsrTagID字段,并且可以按照Persist从缓存中检索数据。
下面的代码显示了从SOLine到SOLineSplit(s)到INItemPlan记录的查找,该记录旨在稍后通过PO Create图形处理购买。为了进行测试,它会设置值,保留数据,然后再次检索它。跟踪显示该值似乎是可写的并且可以检索,但是在事后直接查看SQL时,数据库未在UsrTagID字段中显示该值。我看不到代码可能在哪里重置数据库中的记录,因为此代码是作为添加到菜单中的“创建SO”操作中的最后一个调用执行的。
(A)在第一部分中显示了如何检索和设置/保存UsrTagID字段时出错吗?
(B)是否有更好的方法将标记ID存储在INItemPlan(数据库表)记录上?
(C)我应该寻找一些东西来重置其他地方的数据吗? (尽管我可能错过了一些东西,但在事件处理程序中没有发现任何意外的东西。)
版本为:Acumatica 2018R1 Build 18.114.0018
public static void StoreSoTagID(SOOrderEntry graph, int? tagID, string orderType, string orderNbr, int? lineNbr)
{
PXResultset<SOLine> Results = PXSelectJoin<SOLine,
InnerJoin<SOOrder, On<SOOrder.orderNbr, Equal<SOLine.orderNbr>,
And<SOOrder.orderType, Equal<SOLine.orderType>>>,
InnerJoin<SOLineSplit, On<SOLineSplit.orderType, Equal<SOLine.orderType>,
And<SOLineSplit.orderNbr, Equal<SOLine.orderNbr>,
And<SOLineSplit.lineNbr, Equal<SOLine.lineNbr>>>>,
InnerJoin<INItemPlan, On<INItemPlan.planID, Equal<SOLineSplit.planID>>
>>>,
Where<SOLine.orderType, Equal<Required<SOLine.orderType>>,
And<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>,
And<SOLine.lineNbr, Equal<Required<SOLine.lineNbr>>>>>>
.Select(graph, orderType, orderNbr, lineNbr);
foreach (PXResult<SOLine, SOOrder, SOLineSplit, INItemPlan> result in Results)
{
INItemPlan plan = result;
INItemPlanExt planExt = PXCache<INItemPlan>.GetExtension<INItemPlanExt>(plan);
planExt.UsrTagID = tagID;
graph.Caches[typeof(INItemPlanExt)].Update(planExt);
graph.Caches[typeof(INItemPlanExt)].Persist(PXDBOperation.Update);
PXTrace.WriteInformation("Setting: {0} {1}", plan.PlanID, planExt.UsrTagID);
}
Results = PXSelectJoin<SOLine,
InnerJoin<SOOrder, On<SOOrder.orderNbr, Equal<SOLine.orderNbr>,
And<SOOrder.orderType, Equal<SOLine.orderType>>>,
InnerJoin<SOLineSplit, On<SOLineSplit.orderType, Equal<SOLine.orderType>,
And<SOLineSplit.orderNbr, Equal<SOLine.orderNbr>,
And<SOLineSplit.lineNbr, Equal<SOLine.lineNbr>>>>,
InnerJoin<INItemPlan, On<INItemPlan.planID, Equal<SOLineSplit.planID>>
>>>,
Where<SOLine.orderType, Equal<Required<SOLine.orderType>>,
And<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>,
And<SOLine.lineNbr, Equal<Required<SOLine.lineNbr>>>>>>
.Select(graph, orderType, orderNbr, lineNbr);
foreach (PXResult<SOLine, SOOrder, SOLineSplit, INItemPlan> result in Results)
{
INItemPlan plan = result;
INItemPlanExt planExt = PXCache<INItemPlan>.GetExtension<INItemPlanExt>(plan);
PXTrace.WriteInformation("Poll DB: {0} {1}", plan.PlanID, planExt.UsrTagID);
}
}
虽然过去我在制作DAC定义PXString而不是PXDBString时遇到问题,但我确实验证了DAC以确保这次不重复该错误。
答案 0 :(得分:0)
解决方案在注释中,因此可以将HB_ACUMATICA中的注释提取为其他人可以轻松找到的解决方案...
graph.Caches[typeof(INItemPlan)].Update(plan);
graph.Caches[typeof(INItemPlan)].Persist(plan, PXDBOperation.Update);
使用缓存时,请勿引用Ext DAC。使用基本缓存。 Acumatica知道如何为您连接扩展缓存数据。在Persist中引用计划对象,再引用基本DAC而不是Ext DAC的组合,导致我的数据根据需要写入数据库表中。