Как сохранить значение в пользовательском поле, добавленном в INItemPlan? - PullRequest
0 голосов
/ 03 января 2019

После использования пользовательской таблицы «Tag» для создания Заказа на продажу, предназначенного для выполнения через PO, мне нужно прикрепить свой собственный «Tag ID» к записи INItemPlan для будущего использования в процессе покупки. Несмотря на то, что я смог сделать это успешно в других местах, повторение той же методологии сейчас не работает.

В коде объект INItemPlanExt извлекается для объекта INItemPlan. Значение присваивается полю UsrTagID, и данные могут быть получены из кэша после Persist.

Приведенный ниже код показывает поиск из SOLine в SOLineSplit (s) в запись INItemPlan, которая предназначена для обработки покупки через график PO Create позже. В целях тестирования он устанавливает значение, сохраняет данные и затем извлекает их снова. Трассировка показывает, что значение представляется записанным и извлекаемым, но в базе данных не отображается значение в поле UsrTagID при просмотре непосредственно в SQL после факта. Я не вижу, где код может сбросить запись в базе данных, поскольку этот код выполняется как последний вызов в действии «Создать SO», которое было добавлено в меню.

(A) Есть ли ошибка в первом разделе, показанная при получении и установке / сохранении поля UsrTagID?

(B) Есть ли лучший способ сохранить идентификатор тега в записи 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 голосов
/ 04 января 2019

Решение находится в комментариях, поэтому вытащить комментарии из HB_ACUMATICA в решение, чтобы другие могли легко найти ...

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

При работе с кешем не ссылаться на Ext DAC. Работа с базовым кешем. Acumatica знает, как подключить данные расширенного кэша для вас. Комбинация ссылки на объект плана в Persist, а также ссылки на базовый DAC вместо Ext DAC привела к тому, что мои данные были записаны в таблицу базы данных по желанию.

...