如何订阅 Acumatica 中的用户定义字段
How to subscribe to User Defined fields in Acumatica
我在 Acumatica 用户定义字段上添加了:
如何向这些字段添加 CommitChanges="true" 以及如何为这些字段添加 RowUpdated、FieldUpdated 功能?
UDF 字段呈现为常规字段,因此可以通过将 onValueChange
设置为 1 从 JavaScript 打开提交更改。
棘手的部分是捕获事件。不幸的是,该事件不会在 UDF 字段本身上触发。但是从字段呈现的方式来看,它绑定到页面的主窗体。例如,在 SO301000 - 销售订单上,它绑定到表头表单 - 主视图。这意味着它将触发 SO Order 行级事件。
从 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.
}
}
}
}
因此,您可以使用与其他行级事件相同的方式。
不幸的是,我看不出有任何方法可以像我们过去那样直接使用该字段。
这些 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);
我在 Acumatica 用户定义字段上添加了:
UDF 字段呈现为常规字段,因此可以通过将 onValueChange
设置为 1 从 JavaScript 打开提交更改。
棘手的部分是捕获事件。不幸的是,该事件不会在 UDF 字段本身上触发。但是从字段呈现的方式来看,它绑定到页面的主窗体。例如,在 SO301000 - 销售订单上,它绑定到表头表单 - 主视图。这意味着它将触发 SO Order 行级事件。
从 JavaScript 端,您可以通过以下方式访问此字段:
px_all.ctl00_phF_form_t1_AttributeBURDEN
您只需将 onValueChange 设置为 1 即可使提交更改生效
px_all.ctl00_phF_form_t1_AttributeBURDEN.onValueChange=1;
正如我在
[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.
}
}
}
}
因此,您可以使用与其他行级事件相同的方式。 不幸的是,我看不出有任何方法可以像我们过去那样直接使用该字段。
这些 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);