【问题标题】:Acumatica dynamic dropdown in custom field based on current record status field基于当前记录状态字段的自定义字段中的 Acumatica 动态下拉列表
【发布时间】:2020-07-24 14:52:31
【问题描述】:

我在 BAccount 表中添加了一个名为 UsrSubStatus 的自定义字段,其中包含六个值的 PXStringList。如果 BAccount 状态字段为“Inactive”(值为 I),则 UsrSubStatus 下拉列表应仅允许选择列表值中的 3 个。如果状态字段不是非活动的,那么下拉列表应该只允许选择其他 3 个列表值。

我发现了一篇文章:Acumtica dynamic dropdown,看起来与我想要完成的内容非常相似,但它基于用户登录的当前公司的动态变化。

 var company = PX.Data.Update.PXInstanceHelper.CurrentCompany;

我在以下代码中的问题是如何在我的 var 状态行中引用 BAccount 状态字段。

 public class DynamicDropdownAttribute : PXStringListAttribute
 {
   #region Event Handlers
   private string[] Values2 = { "A1", "A2", "A3" };
   private string[] Labels2 = { "On-Plan", "Off-Plan", "Services Only" };

   private string[] Values3 = { "I1", "I2", "I3" };
   private string[] Labels3 = { "ROR - Same Product", "ROR - New Product", "Out of Business" };

   public DynamicDropdownAttribute()
       : base()
   {
   }

   public override void CacheAttached(PXCache sender)
   {
       base.CacheAttached(sender);
       var status = sender.CR.Status;
       if (status != "I")
       {
           this._AllowedValues = Values2;
           this._AllowedLabels = Labels2;
       }
       else 
       {
           this._AllowedValues = Values3;
           this._AllowedLabels = Labels3;
       }
   }
}

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    在此之后修改源代码,其中statusField 是您的自定义字段。在Customization Project Editor屏幕上,您应该为自定义字段设置CommitChanges=true

     public class DynamicDropdown001Attribute : PXStringListAttribute
    {
        public const string A1 = "On-Plan";
        public const string A2 = "Off-Plan";
        public const string A3 = "Services Only";
    
        public DynamicDropdown001Attribute() : base(new string[] { A1,A2,A3 }, new string[] { "On-Plan", "Off-Plan", "Services Only" }) { }
    }
    public class DynamicDropdown002Attribute : DynamicDropdown001Attribute
    {
        public const string I1 = "ROR - Same Product";
        public const string I2 = "ROR - New Product";
        public const string I3 = "Out of Business";
        public DynamicDropdown002Attribute() 
        {
            Array.Resize(ref _AllowedValues, _AllowedValues.Length - 3);
            Array.Resize(ref _AllowedValues, _AllowedValues.Length + 3);
            _AllowedValues[_AllowedValues.Length - 3] = I1;
            _AllowedValues[_AllowedValues.Length - 2] = I2;
            _AllowedValues[_AllowedValues.Length - 1] = I3;
            Array.Resize(ref _AllowedLabels, _AllowedLabels.Length - 3);
            Array.Resize(ref _AllowedLabels, _AllowedLabels.Length + 3);
            _AllowedLabels[_AllowedLabels.Length - 3] = DynamicDropdown002Attribute.I1;
            _AllowedLabels[_AllowedLabels.Length - 2] = DynamicDropdown002Attribute.I2;
            _AllowedLabels[_AllowedLabels.Length - 1] = DynamicDropdown002Attribute.I3;
        }
    }
    public class DynamicDropdownAttribute : PXStringListAttribute, IPXRowSelectedSubscriber
    {
        public Type _StatusField;
        public DynamicDropdownAttribute(Type statusField)
        {
            _StatusField = statusField;
        }
        public void RowSelected(PXCache sender, PXRowSelectedEventArgs e)
        {
            object row = e.Row as object;
            if (row != null)
            {
                bool? filter = (bool?)((string)sender.GetValue(e.Row, _StatusField.Name) == "I");
                PXStringListAttribute.SetList(sender, row, _FieldName, (filter.HasValue && filter.Value ? new DynamicDropdown001Attribute() : new DynamicDropdown002Attribute()));
            }
        }
    }
    

    【讨论】:

    • Vardan,在原始文章中,为自定义字段指定了 [DynamicDropdownAttribute] 属性。我的 UsrSubStatus 字段在数据访问部分中定义为:
    • [PXDBString(25)] [PXUIField(DisplayName="Sub-Status")] [DynamicDropdownAttribute] 我收到一个验证错误,指出找不到类型或命名空间 DynamicDropdownAttributeAttribute。
    • @JohnWiles 哪个命名空间正在使用 DynamicDropdownAttribute 属性? [PXDBString(25,IsUnicode=true)] [PXUIField(DisplayName="Sub-Status")] [DynamicDropdownAttribute(typeof(DACExt.UsrSubStatus))]
    • 我将最后一行更改为 [DSDSupportEnhancements.DynamicDropdownAttribute(typeof(BAccountExt.usrSubStatus))] 并且我可以发布该项目。但现在下拉列表有 4 个选择值“计划中”和三个非活动选项。当您更改企业帐户的状态时,这些值不会改变。
    • 您是否将状态字段设置为 CommitChanges = true ?
    【解决方案2】:

    我真的很喜欢第一个解决方案,并且能够从 Acumatica 获得一些帮助。第一步是定义 DAC:

    [PXDBString(25, IsUnicode=true)]
    [PXUIField(DisplayName="Sub-Status", Required = true)]
    [PXDefault()]
    [PXDependsOnFields(typeof(BAccount.status))]
    [PXStringList(
    new string[]
    { "A1", "A2", "A3", "I1", "I2", "I3" },
    new string[]
    { "On-Plan", "Off-Plan", "Services Only", "ROR - Same Product", "ROR - New Product", "Out of Business" })]
    

    然后在 BusinessAccountMaint_Extension 图中执行以下操作:

    private string[] Values2 = { "A1", "A2", "A3" };
    private string[] Labels2 = { "On-Plan", "Off-Plan", "Services Only" };
    private string[] Values3 = { "I1", "I2", "I3" };
    private string[] Labels3 = { "ROR - Same Product", "ROR - New Product", "Out of Business" };
    
    protected void BAccount_Status_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated del)
    {
      if(del != null)
        del(cache, e);
    
      var row = (BAccount)e.Row;
      if(row == null) return;
    
      BAccountExt rowExt = PXCache<BAccount>.GetExtension<BAccountExt>(row);
      if (row.Status != "I")
          PXStringListAttribute.SetList<BAccountExt.usrSubStatus>(cache, row, Values2, Labels2);
      else
          PXStringListAttribute.SetList<BAccountExt.usrSubStatus>(cache, row, Values3, Labels3 );
    }
    
    protected void BAccount_RowSelected(PXCache cache, PXRowSelectedEventArgs e, PXRowSelected del)
    {
      if (del != null)
        del(cache, e);
    
      var row = (BAccount)e.Row;
      if (row == null) return;
    
      if (row.Status != "I")
        PXStringListAttribute.SetList<BAccountExt.usrSubStatus>(cache, row, Values2, Labels2);
      else
        PXStringListAttribute.SetList<BAccountExt.usrSubStatus>(cache, row, Values3, Labels3);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多