如何在添加到INItemPlan的用户字段中保存值?

时间:2019-01-03 20:32:35

标签: acumatica

在使用自定义“标签”表创建要通过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以确保这次不重复该错误。

1 个答案:

答案 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的组合,导致我的数据根据​​需要写入数据库表中。