Acumatica :在同一DAC字段上切换选择器属性



美好的一天!

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

现在这里有可用的资源吗?

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

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

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

我希望你能帮助我,我没有主意。非常感谢。

更新 09-24-2019

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

投资者选择器属性

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

未绑定的重新投资 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; }

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

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

如果您需要在持久化时合并它们(将两个字段保留在一个绑定字段中(,您只需使用 2 个未绑定字段来收集/显示数据。

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

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

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

对于多个 DAC,您仍然需要创建字段;将它们添加到新属性中。