Acumatica 有没有办法让用户定义的字段进入选择器?

Acumatica 有没有办法让用户定义的字段进入选择器?,acumatica,Acumatica,我有一个客户正在使用用户定义的字段。我发现这些值位于数据库中的KvExt表中,但我没有找到通过DAC或DAC扩展直接访问这些值的方法。有没有办法访问该字段并将其添加到Acumatica的基本页面 在我的例子中,特定的目标是ARPayments页面中的ARTran.RefNbr选择器。您可能知道,用户定义的字段实际上使用的是系统中定义的属性。用户定义字段和实际记录(例如,ARInvoice)由记录的NoteID(ARInvoice)和用户定义字段的RecordID绑定。用户定义字段的FieldNa

我有一个客户正在使用用户定义的字段。我发现这些值位于数据库中的KvExt表中,但我没有找到通过DAC或DAC扩展直接访问这些值的方法。有没有办法访问该字段并将其添加到Acumatica的基本页面


在我的例子中,特定的目标是ARPayments页面中的ARTran.RefNbr选择器。

您可能知道,用户定义的字段实际上使用的是系统中定义的属性。用户定义字段和实际记录(例如,
ARInvoice
)由记录的
NoteID
ARInvoice
)和用户定义字段的
RecordID
绑定。用户定义字段的
FieldName
存储单词“Attribute”+
AttributeID

下面的SQL查询显示引用:

SELECT CompanyID, RefNbr, DocType, DocDesc FROM ARRegister WHERE RefNbr='AR007092';

SELECT CompanyID, RecordID, FieldName, ValueNumeric, ValueDate, ValueString, ValueText FROM ARRegisterKvExt where RecordID='78A9D6DE-52C4-E911-B2FD-FC017C8C8936';

SELECT CompanyID, AttributeID, Description, ControlType, EntryMask, RegExp, List, IsInternal, ContainsPersonalData FROM CSAttribute WHERE'AttributeBURDEN' LIKE  '%'+AttributeID;
结果集为:

在了解了上面显示的参考之后,我们可以创建一个DAC到
ArregisterkText
表,如下所示:

[PXCacheName("AR Register Attributes")]
[Serializable]
public class ARRegisterKvExt : 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; }
}
[PXSelector(typeof(Search2<ARInvoice.refNbr, LeftJoin<ARRegisterKvExt, On<ARInvoice.noteID,Equal<ARRegisterKvExt.recordID>>, LeftJoin<CSAttribute, On<ARRegisterKvExt.fieldName,Contains<CSAttribute.attributeID>>>>>), new[] { typeof(ARInvoice.refNbr), typeof(ARInvoice.docType), typeof(CSAttribute.description), typeof(ARRegisterKvExt.valueString)}, DescriptionField = typeof(ARInvoice.docDesc))]
因此,您将看到如下查找:

[PXCacheName("AR Register Attributes")]
[Serializable]
public class ARRegisterKvExt : 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; }
}
[PXSelector(typeof(Search2<ARInvoice.refNbr, LeftJoin<ARRegisterKvExt, On<ARInvoice.noteID,Equal<ARRegisterKvExt.recordID>>, LeftJoin<CSAttribute, On<ARRegisterKvExt.fieldName,Contains<CSAttribute.attributeID>>>>>), new[] { typeof(ARInvoice.refNbr), typeof(ARInvoice.docType), typeof(CSAttribute.description), typeof(ARRegisterKvExt.valueString)}, DescriptionField = typeof(ARInvoice.docDesc))]

正如您所看到的,对于用户定义的字段没有值的应收发票也没有字段名称。这是由Acumatica处理用户定义字段的方式造成的。只有在设置值时,才会将用户定义字段的记录写入数据库。如果清除该值,则删除该记录

在查找中使用用户定义字段的缺点是,如果有两个用户定义的AR发票字段,则同一发票将显示两次,但仅当两个用户定义字段的值都已设置时。

所以基本上我们需要自己为这些表制作KvExt DAC?@EricP。是的,Acumatica正在直接使用SimpleTable类进行工作,似乎他们还没有为开发框架扩展用户定义的字段。