Acumatica - сделать поле обязательным на основе значения другого поля - PullRequest
0 голосов
/ 04 мая 2018

Для начала скажу, что я работаю с модулем управления сервисами в Acumatica в версии 6.1. Это означает, что Service Management является проектом и не является стандартным на данный момент. Я пытаюсь создать настраиваемое поле Usr, необходимое на вкладке на экране «Заказы на обслуживание», основываясь на значении другого настраиваемого поля Usr. Я пробовал как RowUpdated, так и FieldUpdated события. Я включил код для обоих ниже с соответствующими ошибками на обоих.

Поле обновлено:

protected void FSServiceOrder_Usrwarrstat_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {
      if(InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
      var row = (FSServiceOrder)e.Row;
      if(row == null) return;
      var WarrantyStatus = row.Usrwarrstat;
      if (WarrantyStatus == null) return;
      if (WarrantyStatus == "W" || WarrantyStatus == "P"){
        PXDefaultAttribute.SetPersistingCheck<FSServiceOrderExt.usrTransModelNbr>(cache, e, PXPersistingCheck.NullOrBlank);
      }

    }

Ошибка:

\App_RuntimeCode\ServiceOrderEntry.cs(484): error CS1061: 'FieldService.ServiceDispatch.FSServiceOrder' does not contain a definition for 'Usrwarrstat' and no extension method 'Usrwarrstat' accepting a first argument of type 'FieldService.ServiceDispatch.FSServiceOrder' could be found (are you missing a using directive or an assembly reference?)

Ряд обновлен:

protected void FSServiceOrder_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e)
                {

                    var row = (FSServiceOrder)e.Row;
                    var WarrantyStatus = Base.Caches[typeof(FSServiceOrder)].Current.Usrwarrstat;
                    if(row == null) return;
                    if (WarrantyStatus == null) return;
                    if (WarrantyStatus == "W" || WarrantyStatus == "P"){
                    PXDefaultAttribute.SetPersistingCheck<FSServiceOrderExt.usrTransModelNbr>(cache, e, PXPersistingCheck.NullOrBlank);
                    }

                }

Ошибка:

\App_RuntimeCode\ServiceOrderEntry.cs(377): error CS1061: 'object' does not contain a definition for 'Usrwarrstat' and no extension method 'Usrwarrstat' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

Мне кажется, что это как-то связано с управлением службами. В настоящее время Acumatica не является стандартом для этой версии, поэтому создание полей cusotm не будет привязывать его к правильному представлению, но я могу ошибаться.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете создать обязательное поле на основе условия, не записывая обработчики событий, используя атрибут PXUIRequired. Вам придется применить этот атрибут к полю usrTransModelNbr (на уровне ЦАП):

[PXUIRequired(typeof(Where<usrwarrstat, Equal<warrantyW>, Or<usrwarrstat, Equal<warrantyP>>>))]

Обратите внимание, что вам нужны фактические константы BQL, определенные для значений "W" и "P"; Я не знаю их значения и просто дал им дурацкое имя. Константы BQL должны быть определены так:

    public class warrantyW : Constant<string>
    {
        public warrantyW()
            : base("W")
        {
        }
    }

Константы BQL могут быть определены где угодно, но я бы рекомендовал размещать их с пользовательской версией PXStringListAttribute для usrwarrstat (которая определяет, какие значения доступны для выбора в этом раскрывающемся списке). Вот пример из PX.Objects; вы бы украсили свое поле с [TaxAdjustmentType.List] в этом примере вместо [PXStringList(...)]

public class TaxAdjustmentType
{
    public class ListAttribute : PXStringListAttribute
    {
        public ListAttribute()
            : base(
            new string[] { AdjustOutput, AdjustInput },
            new string[] { Messages.AdjustOutput, Messages.AdjustInput }) { }
    }

    public const string AdjustOutput = "INT";
    public const string AdjustInput = "RET";
    public const string InputVAT = "VTI";
    public const string OutputVAT = "VTO";
    public const string ReverseInputVAT = "REI";
    public const string ReverseOutputVAT = "REO";

    public class adjustOutput : Constant<string>
    {
        public adjustOutput() : base(AdjustOutput) { ;}
    }

    public class adjustInput : Constant<string>
    {
        public adjustInput() : base(AdjustInput) { ;}
    }

    public class inputVAT : Constant<string>
    {
        public inputVAT() : base(InputVAT) { ;}
    }

    public class outputVAT : Constant<string>
    {
        public outputVAT() : base(OutputVAT) { ;}
    }

    public class reverseInputVAT : Constant<string>
    {
        public reverseInputVAT() : base(ReverseInputVAT) { ;}
    }

    public class reverseOutputVAT : Constant<string>
    {
        public reverseOutputVAT() : base(ReverseOutputVAT) { ;}
    }
}

Вы можете прочитать больше об этом атрибуте и других связанных атрибутах, таких как PXUIEnabled, PXUIVerify в http://asiablog.acumatica.com/2016/11/pxuienabled-and-pxuirequired-attributes.html

0 голосов
/ 04 мая 2018

Вы получаете эту ошибку, потому что вы пытаетесь получить доступ к пользовательскому полю из DAC вместо доступа к нему из CacheExtension. Я предлагаю вам сделать это в обработчике событий RowSelected, как показано ниже:

protected void FSServiceOrder_RowSelected(PXCache sender, PXRowUpdatedEventArgs e,PXRowSelected baseMethod)
{
    if(baseMethod!=null)       //
        baseMethod(sender,e);  // this is equal to this line    baseMethod?.Invoke(sender,e);
    if(e.Row == null) return;
    FSServiceOrder row = (FSServiceOrder)e.Row;

    FSServiceOrderExt rowExt = PXCache<FSServiceOrder>.GetExtension<FSServiceOrderExt>(row);
    if(rowExt!=null)
    {
        if (rowExt.Usrwarrstat == null) 
            return;
        if (rowExt.Usrwarrstat == "W" || rowExt.Usrwarrstat == "P"){
            PXDefaultAttribute.SetPersistingCheck<FSServiceOrderExt.usrTransModelNbr>(cache, e, PXPersistingCheck.NullOrBlank);
        }
    }
}
...