根据自定义字段的值在po创建期间在POLine上创建新的注释

时间:2018-12-11 22:56:03

标签: acumatica

假设我有一个自定义字段SOLineExt.UsrCustomField,该字段允许通过 SO301000 访问的文本输入。如果要根据此SOLine从 PO505000 屏幕创建PO,我想在新POLine上自动创建注释,并将SOLineExt.UsrCustomField的值作为NoteText插入,但仅当SOLineExt.UsrCustomField != null

自定义字段也可以作为POFixedDemandExt.UsrCustomField访问(它在POCreate中填充了fixedDemand IEnumerable覆盖),因此我可以根据需要通过POOrderEntry中的FillPOLineFromDemand()覆盖来提供它。

1)我是否需要在FillPOLineFromDemand()POLine_RowInserted()或其他地方创建新的笔记?

2)什么代码将创建注释并将UsrCustomField的值插入NoteText?我需要创建并填充Note DAC吗?

1 个答案:

答案 0 :(得分:0)

您可以使用SetNote类的PXNoteAttribute静态方法来设置文本注释。

在FillPOLineFromDemand方法的上下文中的POLine对象上调用该方法时,存在一些意外的问题。大概是因为那时POLine对象没有在缓存中正确初始化。

您可以使用POLine_RowInserted,我测试了此解决方案:

public void POLine_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
{
    POLine row = e.Row as POLine;
    POLinkSO.DAC.POLineExt rowExt = row != null ? row.GetExtension<POLinkSO.DAC.POLineExt>() : null;

    if (rowExt != null)
    {
        SOLine line = PXSelectReadonly<SOLine,
                      Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>,
                      And<SOLine.orderType, Equal<Required<SOLine.orderType>>,
                      And<SOLine.lineNbr, Equal<Required<SOLine.lineNbr>>,
                      And<SOLineExt.usrCustomField, IsNotNull>>>>>.Select(Base,
                                                                          rowExt.UsrPOLinkSOOrderNbr,
                                                                          rowExt.UsrPOLinkSOOrderType,
                                                                          rowExt.UsrPOLinkSOLineNbr);

        SOLineExt lineExt = line != null ? line.GetExtension<SOLineExt>() : null;

        if (lineExt != null)
        {
            PXNoteAttribute.SetNote(sender, row, lineExt.UsrCustomField);
        }
    }
}