【问题标题】:How do I auto-populate a field based on another field in Acumatica?如何根据 Acumatica 中的另一个字段自动填充字段?
【发布时间】:2019-11-01 04:14:17
【问题描述】:

我正在尝试根据另一个字段自动填充一个字段。我有一个合同选择器字段,我为主要经理创建了一个经理 1 字段,该字段被捕获在合同屏幕中。

打开经理 1 的选择器字段时,我能够得到正确的结果。它填充了合同代码和与之关联的经理;但是,我希望它在我选择合同后自动填写该字段。我试过使用 PXDefault,但没有任何运气。下面的代码是我到目前为止的工作:

[PXInt] 
[PXUIField(DisplayName="Manager 1")] 
[PXSelector(typeof(Search2<PX.Objects.CR.BAccount.bAccountID, 
  InnerJoin<JPMContract, 
  On<JPMContract.contractMgrBAccountID, 
  Equal<PX.Objects.CR.BAccount.bAccountID>>>>), 
  typeof(JPMContract.contractCode), 
  typeof(PX.Objects.CR.BAccount.acctCD), 
  typeof(PX.Objects.CR.BAccount.acctName), 
  SubstituteKey = typeof(PX.Objects.CR.BAccount.acctCD), 
  DescriptionField = typeof(PX.Objects.CR.BAccount.acctName))]

再次,当我打开选择器字段并选择相应的结果时,我得到了我想要的结果,但我希望它在选择合同后为我执行此操作。有什么建议吗?

更新: 我让它只在选择器中返回我需要的一个结果,但它仍然没有在字段中填充那个结果。

[PXInt]
[PXSelector(typeof(Search2<PX.Objects.CR.BAccount.bAccountID,
   InnerJoin<JPMContract,
   On<JPMContract.contractMgrBAccountID,
   Equal<PX.Objects.CR.BAccount.bAccountID>>>,
   Where<JPMContract.jPMContractID, Equal<Current<JPMSubContract.jPMContractID>>>>),
   typeof(JPMContract.contractCode),
   typeof(PX.Objects.CR.BAccount.acctCD),
   typeof(PX.Objects.CR.BAccount.acctName),
   SubstituteKey = typeof(PX.Objects.CR.BAccount.acctCD),
   DescriptionField = typeof(PX.Objects.CR.BAccount.acctName))]
[PXDefault(typeof(Search2<PX.Objects.CR.BAccount.bAccountID,
   InnerJoin<JPMContract,
   On<JPMContract.contractMgrBAccountID,
   Equal<PX.Objects.CR.BAccount.bAccountID>>>,
   Where<JPMContract.jPMContractID, Equal<Current<JPMSubContract.jPMContractID>>>>))]
[PXUIField(DisplayName="Manager 1")]

【问题讨论】:

  • 您应该使用PXFormulaAttribute 或为此字段编写FieldSelecting 事件,该事件将获得相应的值并设置为e.NewValue

标签: field default acumatica populate


【解决方案1】:
public sealed class DACExt : PXCacheExtension<PrimaryDAC>
{
    // For this field in aspx file set CommitChanges=true
    [PXDBInt]
    [PXSelector(typeof(Search<Table.field0>))]
    [PXUIField(DisplayName = "Field 1")]
    public int? Field1 { get; set; }
    public abstract class field1 : IBqlField { }

    [PXInt]
    //This line auto-populate a field based on Field1 field
    [PXDefault(typeof(Search<Table1.field2, Where<Table1.field0, Equal<Current<Table.field0>>>>), PersistingCheck = PXPersistingCheck.Nothing)]
    [PXUIField(DisplayName = "Field 2", Enabled = false)]
    public int? Field2 { get; set; }
    public abstract class field2 : IBqlField { }
}


public virtual void PrimaryDAC_Field1_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
    if (e.Row is PrimaryDAC row)
    {
        sender.SetDefaultExt<DACExt.field2>(e.Row);
    }
}  

【讨论】:

  • 这段代码对他不起作用,他有未绑定的字段并且已经创建了记录。 PXDefault 仅在插入记录期间起作用。此外,问题中提到 PXDefault 不适用于这种情况。
  • 是的,这对我不起作用。我理解这个概念,但它也不适用于插入记录。什么都没有填充。
  • @meaginmarie 你想将该值存储在数据库中还是仅仅显示它?
  • 如果这是唯一可行的方法,我不一定需要保存它,因为它已经存储在其他地方。但老实说,在这一点上我会采取任何一种方式。
  • 所以我得到了它,它只会返回我在选择器中寻找的一个结果,但它不会填充它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多