【发布时间】:2019-01-04 06:40:50
【问题描述】:
在使用自定义“标签”表创建要通过 PO 履行的销售订单后,我需要将自定义“标签 ID”附加到 INItemPlan 记录以供将来在采购流程中使用。虽然我能够在其他地方成功地做到这一点,但现在重复相同的方法是行不通的。
在代码中,为 INItemPlan 对象检索 INItemPlanExt 对象。 UsrTagID 字段被赋值,数据可以从 Persist 之后的缓存中取回。
下面的代码显示了从 SOLine 到 SOLineSplit(s) 到 INItemPlan 记录的查找,该记录旨在稍后通过 PO 创建图处理购买。出于测试目的,它设置值,保存数据,然后再次检索它。跟踪显示该值似乎已写入并可检索,但在事后直接查看 SQL 时,数据库并未在 UsrTagID 字段中显示该值。我看不到代码可能会在哪里重置数据库中的记录,因为此代码是作为添加到菜单的“创建 SO”操作中的最后一次调用执行的。
(A) 在如何检索和设置/保存 UsrTagID 字段的第一部分中是否有错误?
(B) 有没有更好的方法将 Tag 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 以确保我这次没有重复错误。
【问题讨论】:
-
也许不是你的错误,但我认为你永远不应该使用扩展缓存,所以将 graph.Caches[typeof(INItemPlanExt)] 替换为 graph.Caches[typeof(INItemPlan)]
-
谢谢!虽然这并没有解决问题,但该更改仍会返回相同的结果,而无需使用扩展缓存。我想我必须引用定义该字段的 DAC。 “缓存”是否直接与数据库表交互,从而消除了 DAC 作为中间人?
-
除了 GetExtension 和 BQL 之外,您通常希望避免引用扩展 DAC,尤其是对于事件。
-
Caches 是内存中的记录,包含Updated/Inserted...等集合。
-
如果是这种情况,您可能也想为更新做同样的事情:.Update(plan)。很确定这也应该有效。
标签: acumatica