【问题标题】:Acumatica : Switching Selector Attribute on the same DAC FieldAcumatica:在同一 DAC 字段上切换选择器属性
【发布时间】:2020-01-23 01:38:41
【问题描述】:

美好的一天!

我的 DAC 中有一个字段,我需要根据自己的偏好设置更改 Selector 属性。您可能知道,acumatica 上有一个现有的 LeadSelector 属性和 CustomerSelector 属性。如果我在我的首选项上设置了客户,我希望更改该给定字段的选择器属性,反之亦然。

这里有可用的资源吗?

我一直在考虑创建一个扩展选择器属性,我将在该属性上检查什么是首选项设置,然后继承扩展选择器上的 LeadSelector 或 CustomerSelector。但我认为这可能是不可能的。

我一直在考虑的另一件事是在属性上添加两个选择器,并在设置了首选项时将它们从图形级别中删除。

我也在考虑创建 2 个选择器,我将根据偏好设置隐藏另一个。但问题是,选择器不仅在一个页面上使用,如果我创建 2 个选择器只是为了解决这个问题,这很麻烦。而且在未来,它可能不仅仅是领导和客户选择者。

我希望你能帮助我,我没有想法。非常感谢。

2019 年 9 月 24 日更新

我为潜在客户和客户选择器属性创建了一个自定义选择器属性。它的工作正是我想要的,但现在我的问题是,描述字段不会显示在文本框或该字段上,还有诸如“系统中找不到投资者名称”之类的错误。

投资者选择属性

public class InvestorSelectorAttribute : PXCustomSelectorAttribute
{

    public InvestorSelectorAttribute() : base(typeof(REInvestor.accountID))
    {
        DescriptionField = typeof(REInvestor.acctName);
        SubstituteKey = typeof(REInvestor.acctName);
    }

    protected IEnumerable GetRecords()
    {
        var leads = new PXSelect<Contact,
                        Where<Contact.contactType, Equal<ContactTypesAttribute.lead>,
                        Or<Where<Contact.contactType, Equal<ContactTypesAttribute.person>,
                            And<Contact.status, Equal<LeadStatusesAttribute.converted>>>>>>(this._Graph);

        var contacts = new PXSelect<BAccountR>(this._Graph);

        REFeature setup = PXSelect<REFeature>.Select(this._Graph);

        if (setup.InvestorType == InvestorTypesAttribute.LeadVal)
        {
            foreach (Contact lead in leads.Select())
            {
                yield return new REInvestor { AccountID = lead.ContactID, AcctName = lead.DisplayName };
            }
        }
        else
        {
            foreach (BAccountR contact in contacts.Select())
            {
                yield return new REInvestor { AccountID = contact.BAccountID, AcctName = contact.AcctName, AcctCD = contact.AcctCD };
            }
        }
    }
}

未绑定的 REInvestor DAC

[Serializable]
[PXCacheName("Investor")]
public class REInvestor : IBqlTable
{
    public abstract class accountID : BqlInt.Field<accountID> { }
    [PXDBInt(IsKey = true)]
    [PXUIField(DisplayName = REMessages.DisplayNames.AccountID, Visibility = PXUIVisibility.SelectorVisible)]
    public virtual int? AccountID { get; set; }

    public abstract class acctName : BqlString.Field<acctName> { }
    [PXDBString(128, InputMask = "", IsUnicode = true)]
    [PXUIField(DisplayName = REMessages.DisplayNames.AccountName, Visibility = PXUIVisibility.SelectorVisible)]
    public virtual string AcctName { get; set; }

    public abstract class acctCD : BqlString.Field<acctCD> { }
    [PXDBString(128, InputMask = "", IsUnicode = true)]
    [PXUIField(DisplayName = REMessages.DisplayNames.AcctCD, Visibility = PXUIVisibility.SelectorVisible)]
    public virtual string AcctCD { get; set; }
}

** DAC 集成 **

[PXDBInt]
    [PXUIField(DisplayName = REMessages.DisplayNames.InvestorsName, Required = true)]
    [InvestorSelector()]
    [PXDefault(PersistingCheck = PXPersistingCheck.NullOrBlank)]
    public virtual int? ContactID { get; set; }

我真的需要你的帮助和建议。非常感谢。

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    可以定义 2 个字段并显示一个。 每个都有自己的选择器,以及 PXUIField 描述。 您可以根据图表级别的设置字段(RowSelected 事件)为其中一个设置可见性

    如果您需要在持久化上合并它们(将两个字段都保存在一个绑定字段中),您可以简单地使用 2 个未绑定字段来收集/显示数据。

    • 在更新/持久化事件时,您可以将未绑定字段的值更新为唯一的数据库字段

    • 在检索时,您可以创建一个数据视图 - 委托以根据配置填充未绑定的字段;

    当您计划在多个页面(图表)上移动时,您将代码从图表移动到 PXEventSubscriberAttribute 您在 DAC 级别添加新属性。 这样您就可以访问可能需要的所有 Graph 事件(持久化、选择、更新……)。所有代码都放在一个地方。

    对于多个 DAC,您仍然需要创建字段;为他们添加新属性。

    【讨论】:

    • 感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多