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