Как правильно обновлять значения ЦАП, полученные через PXResultset? - PullRequest
0 голосов
/ 30 октября 2018

У нас есть бизнес-требование установить стоимость возврата SO на первоначальную стоимость, выданную без выставления счетов, если это возможно. Мы определили, что заказы на продажу необходимы для отслеживания выдачи материалов нашему клиенту, и мы руководствуемся затратами, а не ценой. Мы используем FIFO-калькуляцию, но SO-заказы на возврат, похоже, не возвращаются с первоначальной COST, если не выставлены счета (что мы также не делаем традиционным способом).

Я обнаружил, что установка удельной / дополнительной стоимости на линии отгрузки SO непосредственно в базе данных до появления сообщения Подтвердить отгрузку и Обновить IN для получения желаемых результатов. Применяя пользовательскую опцию меню для оптимизации и строгого контроля возврата, я клонировал соседний код в качестве основы. Раздел между === - это то место, где я устанавливаю цену за единицу продукции и дополнительные расходы. PXTrace показывает ожидаемое значение, но оно равно $ 0 в записи об отправке. Я подумал, что мне может понадобиться «docgraph.Update (sOShipmentLine)», чтобы сохранить его, но он недоступен в этой области.

using (var ts = new PXTransactionScope())
{
    PXTimeStampScope.SetRecordComesFirst(typeof(SOOrder), true);
    //Reminder - SOShipmentEntry docgraph = PXGraph.CreateInstance<SOShipmentEntry>();
    docgraph.CreateShipment(order, SiteID, filter.ShipDate, adapter.MassProcess, SOOperation.Receipt, created, adapter.QuickProcessFlow);


    PXTrace.WriteError("Setting Cost");
    //Set Cost on Shipment to Cost On SO Line
    PXResultset<SOShipment> results =
                            PXSelectJoin<SOShipment,
                            InnerJoin <SOShipLine, On<SOShipLine.shipmentNbr, Equal<SOShipment.shipmentNbr>>,
                            InnerJoin <SOLine, On<SOLine.orderType, Equal<SOShipLine.origOrderType>,
                                            And<SOLine.orderNbr, Equal<SOShipLine.origOrderNbr>, And<SOLine.lineNbr, Equal<SOShipLine.origLineNbr>>>>
                            >>,
                                Where<SOShipment.shipmentNbr, Equal<Required<SOShipment.shipmentNbr>>>>
                            .Select(docgraph, docgraph.Document.Current.ShipmentNbr);

    PXTrace.WriteError("Shipment {0} - Records {1}", docgraph.Document.Current.ShipmentNbr, results.Count);

    foreach (PXResult<SOShipment, SOShipLine, SOLine> record in results)
    {
        SOShipment shipment = (SOShipment)record;
        SOShipLine shipmentLine = (SOShipLine)record;
        SOLine sOLine = (SOLine)record;
        ==============================================
        shipmentLine.UnitCost = GetReturnUnitCost(sOLine.OrigOrderType, sOLine.OrigOrderNbr, sOLine.OrigLineNbr, sOLine.CuryInfoID);
        shipmentLine.ExtCost = shipmentLine.Qty * shipmentLine.UnitCost;
        PXTrace.WriteError(string.Format("{0} {1}-{2} = {3} / {4}", shipmentLine.LineType, shipmentLine.ShipmentNbr, shipmentLine.LineNbr, shipmentLine.Qty, shipmentLine.UnitCost));
        ==============================================
    }

    PXAutomation.CompleteSimple(docgraph.Document.View);
    var items = new List<object> { order };
    PXAutomation.RemovePersisted(docgraph, typeof(SOOrder), items);
    PXAutomation.RemoveProcessing(docgraph, typeof(SOOrder), items);
    ts.Complete();
}

Все еще на кривой обучения, поэтому я ожидаю, что решение, вероятно, будет простым и очевидным для кого-то более опытного.

1 Ответ

0 голосов
/ 30 октября 2018

Есть три фазы:

  1. Изменение значения
  2. Обновление кеша
  3. Сохранение кеша

Я думаю, что вы меняете значение, но не сохраняете его. Причина, по которой он работает после вызова действия «Подтвердить отгрузку» или «Обновить В», заключается в том, что эти действия сохранят все изменения, вызвав действие Сохранить график.

Чтобы изменить значение поля в представлении данных, вы должны сделать:

DACRecord.Field = value;
DataView.Update(DACRecord);    

Особенностью вашего примера является то, что запрос не привязан к представлению данных. Если у вас свободный запрос BQL, вы можете выполнить ту же операцию с объектом кеша. В вашем примере контекст Caches доступен из docGraph:

DACRecord.Field = value;
graph.Caches[typeof(DACType)].Update(DACRecord);
graph.Caches[typeof(DACType)].Persist(DACRecord, PXDBOperation.Update);

Update и Persist часто опускаются, потому что во многих случаях они будут вызваны позже другим механизмом фреймворка. Например, если вам нужно было выполнить только обновление для поля пользовательского интерфейса, запись не будет сохранена до тех пор, пока пользователь не нажмет кнопку «Сохранить».

Значение обновления в пользовательском интерфейсе немного отличается от обновления в кэше.

Рекомендуемый подход для полей пользовательского интерфейса - использовать SetValue:

cache.SetValue<DAC.DacField>(DACRecord, fieldValue);

Или используйте SetValueExt, когда вы хотите инициировать каркасные события, такие как FieldUpdated, при изменении значения поля:

cache.SetValueExt<DAC.DacField>(DACRecord, fieldValue);

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

...