如何订阅Acumatica中的用户自定义字段

3

我已经添加了Acumatica用户定义字段:

enter image description here 如何为这些字段添加CommitChanges="true",以及如何为这些字段添加RowUpdated和FieldUpdated功能?


我认为,如果你想通过代码来处理这些领域,最好定义它们为通常的自定义字段,而不是使用用户定义的字段。 - Dmitrii Naumov
更简单当然好!但那不是我要找的答案。 - Yuriy Zaletskyy
2个回答

4

这些UDF字段是在运行时作为FieldSelecting事件的一部分创建的属性字段,因此可以使用PXCache.GetValueExt / SetValueExt访问它们,如下面的示例所示。请注意,字段名称以单词“Attribute”开头,后跟属性代码。

        var row = Base.Opportunity.Current;
        var cache = Base.Opportunity.Cache;
        var udfREFOPP = (PXStringState)cache.GetValueExt(row, "AttributeREFOPP");
        var udfREFAPPT = (PXStringState)cache.GetValueExt(row, "AttributeREFAPPT");

        cache.SetValueExt(row, "AttributeREFOPP", udfREFAPPT.Value);
        cache.SetValueExt(row, "AttributeREFAPPT", udfREFOPP.Value);

1
UDF字段被呈现为常规字段,因此可以通过将onValueChange设置为1来从JavaScript打开提交更改。
棘手的部分是捕获事件。不幸的是,事件不会在UDF字段本身上触发。但是从字段呈现的方式来看,它绑定到页面的主表单。例如,在SO301000-销售订单上,它绑定到标题表单-主视图。这意味着它将触发SO订单行级事件。

enter image description here

从 JavaScript 方面,您可以通过以下方式访问这些字段:

px_all.ctl00_phF_form_t1_AttributeBURDEN

您只需要将onValueChange设置为1,即可使“提交更改”正常工作。

px_all.ctl00_phF_form_t1_AttributeBURDEN.onValueChange=1;

如我在这篇回答中已经解释过的那样,UDF是通过KvExt表来处理的,而要访问它们,我们需要创建额外的DAC。

[PXCacheName("SO Order Attributes")]
[Serializable]
public class SOOrderKvExt : IBqlTable
{
    public abstract class recordID : BqlGuid.Field<recordID> { }
    [PXDBGuid(IsKey = true)]
    public Guid? RecordID { get; set; }

    public abstract class fieldName : BqlString.Field<fieldName> { }
    [PXDBString(50, IsKey = true)]
    [PXUIField(DisplayName = "Name")]
    public string FieldName { get; set; }

    public abstract class valueNumeric : BqlDecimal.Field<valueNumeric> { }
    [PXDBDecimal(8)]
    [PXUIField(DisplayName = "Value Numeric")]
    public decimal? ValueNumeric { get; set; }

    public abstract class valueDate : BqlDateTime.Field<valueDate> { }
    [PXDBDate]
    [PXUIField(DisplayName = "Value Date")]
    public DateTime? ValueDate { get; set; }

    public abstract class valueString : BqlString.Field<valueString> { }
    [PXDBString(256)]
    [PXUIField(DisplayName = "Value String")]
    public string ValueString { get; set; }

    public abstract class valueText : BqlString.Field<valueText> { }
    [PXDBString]
    [PXUIField(DisplayName = "Value Text")]
    public string ValueText { get; set; }
}

在此之后,我们可以像下面这样在SOOrder_RowUpdated处理程序中捕获事件:
protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
    if(e.Row is SOOrder row)
    {
        PXResultset<SOOrder> orderWithUDFs = PXSelectJoin<SOOrder, 
            LeftJoin<SOOrderKvExt, On<SOOrder.noteID, Equal<SOOrderKvExt.recordID>>,
            LeftJoin<PX.CS.CSAttribute, On<SOOrderKvExt.fieldName, Contains<PX.CS.CSAttribute.attributeID>>>>, 
            Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>,
            And<SOOrder.orderType,Equal<Required<SOOrder.orderType>>>>>.Select(this.Base, row.OrderNbr,row.OrderType);
        foreach (PXResult<SOOrder,SOOrderKvExt,PX.CS.CSAttribute> orderWithUDF in orderWithUDFs)
        {
            var udfValue = (SOOrderKvExt)orderWithUDF;
            var attributeDef = (PX.CS.CSAttribute)orderWithUDF;
            if(attributeDef.FieldName=="BURDEN")
            {
                //do something
                var value = udfValue.ValueText;//depending on the Attribute.
            }
        }
    }
}

因此,您可以像处理其他行级事件一样处理它。不幸的是,我没有看到任何以我们过去所使用的方式直接处理字段的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接