【问题标题】:How do I save value in user field added to INItemPlan?如何在添加到 INItemPlan 的用户字段中保存值?
【发布时间】: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


【解决方案1】:

解决方案在 cmets 中,因此将 HB_ACUMATICA 中的 cmets 拉出到解决方案中,以便其他人轻松找到...

graph.Caches[typeof(INItemPlan)].Update(plan);
graph.Caches[typeof(INItemPlan)].Persist(plan, PXDBOperation.Update);

使用缓存时,不要引用 Ext DAC。使用基本缓存。 Acumatica 知道如何为您连接扩展缓存数据。在 Persist 中引用计划对象和引用基本 DAC 而不是 Ext DAC 的组合导致我的数据根据​​需要写入数据库表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 2021-10-28
    • 2019-02-15
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多