Acumatica-根据另一个字段的值生成所需字段

Acumatica-根据另一个字段的值生成所需字段,acumatica,Acumatica,首先,我会说我正在使用Acumatica 6.1版的服务管理模块。这意味着服务管理是一个项目,而不是目前的标准。我试图根据另一个自定义Usr字段的值,在“服务订单”屏幕的选项卡中创建一个必需的自定义Usr字段。我尝试了RowUpdate和FieldUpdate事件。我已经在下面列出了这两个版本的代码,并且在这两个版本上都有相应的错误 现场更新: protected void FSServiceOrder_Usrwarrstat_FieldUpdated(PXCache cache, PXFiel

首先,我会说我正在使用Acumatica 6.1版的服务管理模块。这意味着服务管理是一个项目,而不是目前的标准。我试图根据另一个自定义Usr字段的值,在“服务订单”屏幕的选项卡中创建一个必需的自定义Usr字段。我尝试了RowUpdate和FieldUpdate事件。我已经在下面列出了这两个版本的代码,并且在这两个版本上都有相应的错误

现场更新:

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);
      }

    }
行更新:

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);
                    }

                }

我觉得这与服务管理有关,目前Acumatica在这个版本中不是一个标准,因此创建cusotm字段不会将其绑定到正确的视图,但是我可能错了。

您遇到此错误是因为您试图从DAC访问自定义字段,而不是从CacheExtension访问它。我建议您在选定的事件处理程序行中执行此操作,如下所示:

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);
        }
    }
}

出现此错误是因为您试图从DAC而不是从CacheExtension访问自定义字段。我建议您在选定的事件处理程序行中执行此操作,如下所示:

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);
        }
    }
}

通过使用PXUIRequired属性,可以根据条件设置字段为required,而无需编写任何事件处理程序。您必须在DAC级别将此属性应用于usrTransModelNbr字段:

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

您可以阅读有关此属性和其他相关属性(如PXUIEnabled、PXUIVerify at

的更多信息。您可以使用PXUIRequired属性根据条件创建字段required,而无需编写任何事件处理程序。您必须在DAC级别将此属性应用于usrTransModelNbr字段:

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

您可以阅读有关此属性和其他相关属性的详细信息,例如PXUIEnabled、PXUIVerify at

我收到以下错误:\App\u RuntimeCode\ServiceOrderEntry.cs375:错误CS1525:无效的表达式项“”。\App\u RuntimeCode\ServiceOrderEntry.cs375:错误CS1003:语法错误,“:”应为\App\u RuntimeCode\ServiceOrderEntry.cs375:错误CS1525:无效的表达式项“”。”这与baseMethod?相对应。Invokesender,e;Line使用此方法,我收到以下错误:“PX.Data.PXRowSelectedEventArgs”以键入“FieldService.ServiceDispatch.FSServiceOrder”。当我更改Usrwarrstat字段时,屏幕上会显示该字段。@Dane检查您的代码,似乎不是FSServiceOrder行=FSServiceOrder.row;您已经编写了FSServiceOrder行=FSServiceOrder;我收到了以下错误:\App\u RuntimeCode\ServiceOrderEntry.cs375:错误CS1525:无效的表达式项“”。\App\u RuntimeCode\ServiceOrderEntry.cs375:错误CS1003:语法错误“”:“预期的\App\u RuntimeCode\ServiceOrderEntry.cs375:错误CS1525:无效的表达式项“”,这与baseMethod相对应。Invokesender,e;Line使用此方法,我收到以下错误:“PX.Data.PXRowSelectedEventArgs”以键入“FieldService.ServiceDispatch.FSServiceOrder”。当我更改Usrwarrstat字段时,屏幕上会显示该字段。@Dane检查您的代码,似乎不是FSServiceOrder行=FSServiceOrder.row;您已经编写了FSServiceOrder行=FSServiceOrder;这是一个很好的注释,公共类是在DAC中定义还是在图形中定义?@Dane它可以放在DAC类中,但我认为正确的方法是在自定义版本的PXStringListAttribute中,该版本也会包含不同的值。我已经用示例PXStringListAttribute类更新了我的答案这是一个很好的注释,公共类是在DAC还是在图形中定义的?@Dane它可以放在DAC类中,但我认为正确的方法是在PXStringListAttribute的自定义版本中,该版本也会包含不同的值。我已使用示例PXStringListAttribute类更新了我的答案
    public class warrantyW : Constant<string>
    {
        public warrantyW()
            : base("W")
        {
        }
    }
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) { ;}
    }
}