Как подписаться на пользовательские поля в Acumatica - PullRequest
2 голосов
/ 26 мая 2020

Я добавил в поле, определяемое пользователем Acumatica:

enter image description here Как добавить в эти поля CommitChanges = "true" и как можно добавить функциональность RowUpdated, FieldUpdated для этих полей?

1 Ответ

1 голос
/ 02 июня 2020

Поля UDF отображаются как обычные поля, поэтому фиксацию изменений можно включить с JavaScript, установив для onValueChange значение 1.

Сложная часть - захват события. К сожалению, событие не запускается в самом поле UDF. Но, судя по тому, как это поле отображается, оно привязано к основной форме страницы. Например, в SO301000 - Заказы на продажу он привязан к форме Заголовок - первичный вид. Это означает, что он будет запускать события уровня строки SO Order.

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, и для доступа к ним нам нужно создать дополнительный DA C.

[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.
            }
        }
    }
}

Итак таким же образом вы можете работать с другими событиями уровня строки. К сожалению, я не вижу возможности работать с полем напрямую, как это делали все мы.

...