【问题标题】:Show unbound field with PXFormula使用 PXFormula 显示未绑定字段
【发布时间】:2020-03-11 17:31:03
【问题描述】:

我正在尝试显示使用 PXFormula 计算的值,但该字段未显示该值。 我的 CustomDAC 名为 EDITran

  public class EDITran : IBqlTable
  {

    #region Doctype
    [PXDBString(50, IsKey = true, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "Doctype")]

    [PXStringList
      (new string[]
      {"SO", "SHI", "INV" },
      new string[]
      {"Sales Order", "Shipment", "Invoice"}
      )]

    public virtual string Doctype { get; set; }
    public abstract class doctype : PX.Data.BQL.BqlString.Field<doctype> { }
    #endregion

    #region Erprefnbr
    [PXDBString(30, IsKey = true, IsUnicode = true, InputMask = "")]
    [PXUIField(DisplayName = "ERP RefNbr")]
    public virtual string Erprefnbr { get; set; }
    public abstract class erprefnbr : PX.Data.BQL.BqlString.Field<erprefnbr> { }
    #endregion

    #region Sync
    [PXDBBool()]
    [PXUIField(DisplayName = "Sync")]
    public virtual bool? Sync { get; set; }
    public abstract class sync : PX.Data.BQL.BqlBool.Field<sync> { }
    #endregion
  }
}

所以我要在销售订单屏幕上显示同步字段的值。关键是 ERP RefNbr(即 SOOrder.OrderNbr)

我已使用此属性在 SOOrderExt DAC 上添加了自定义非持久字段

using PX.Objects.SO;

[PXBool]
[PXUIField(DisplayName="EDI Sync" , Enabled = false)]
[PXFormula(typeof(Selector<SOOrder.orderNbr,
              Selector<EDITran.erprefnbr,
              EDITran.sync>>))]

但是当我在 EDITran 中添加一条记录并尝试在 SOOrder Form 中对其进行可视化并检查 EDITran.Sync = 1 时,它没有显示保存的值。

Sales Order Screen

我做错了什么?是否正确使用了 PXFormula?

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    PXFormula 使用不正确。 PXFormula 属性仅适用于当前 DAC(即 SOOrder)或外部 DAC,存在于 PXSelector join 条件(您可以使用 Selector 关键字获取)。 例如,这里是 SOOrder.OrderNbr 选择器声明

    [SO.RefNbr(typeof(Search2<SOOrder.orderNbr,
        LeftJoinSingleTable<Customer, On<SOOrder.customerID, Equal<Customer.bAccountID>,
            And<Where<Match<Customer, Current<AccessInfo.userName>>>>>>,
        Where<SOOrder.orderType, Equal<Optional<SOOrder.orderType>>,
            And<Where<Customer.bAccountID, IsNotNull,
                Or<Exists<Select<SOOrderType,
                    Where<SOOrderType.orderType, Equal<SOOrder.orderType>,
                        And<SOOrderType.aRDocType, Equal<ARDocType.noUpdate>,
                        And<SOOrderType.behavior, Equal<SOBehavior.sO>>>>>>>>>>,
            OrderBy<Desc<SOOrder.orderNbr>>>), Filterable = true)]
    public virtual String OrderNbr
    

    您可以使用Selector关键字从相关的Customer记录中获取一些字段

    [PXFormula(typeof(Selector<
        SOOrder.orderNbr,
        Customer.consolidateStatements>))]
    

    因此,有两种可能的解决方案:

    1) 用您的EDITran DAC 重写SOOrder.OrderNbr 选择器声明

    ...
    [SO.RefNbr(typeof(Search2<SOOrder.orderNbr,
        LeftJoinSingleTable<Customer, On<SOOrder.customerID, Equal<Customer.bAccountID>,
            And<Where<Match<Customer, Current<AccessInfo.userName>>>>>,
        LeftJoin<EDITran, On<EDITran.doctype, Equal<SOOrder.orderType>, 
            And<EDITran.erprefnbr, Equal<SOOrder.orderNbr>>>>>,
        Where<SOOrder.orderType, Equal<Optional<SOOrder.orderType>>,
            And<Where<Customer.bAccountID, IsNotNull,
                Or<Exists<Select<SOOrderType,
                    Where<SOOrderType.orderType, Equal<SOOrder.orderType>,
                        And<SOOrderType.aRDocType, Equal<ARDocType.noUpdate>,
                        And<SOOrderType.behavior, Equal<SOBehavior.sO>>>>>>>>>>,
            OrderBy<Desc<SOOrder.orderNbr>>>), Filterable = true)]
    public virtual String OrderNbr
    

    那么就可以从那里得到你的字段

    [PXFormula(typeof(Selector<
        SOOrder.orderNbr,
        EDITran.sync>))]
    

    2) 使用PXDBScalar 属性来获取您需要的内容。请注意,这将是对数据库的单独请求!!

    ...
    [PXBool]        
    [PXDBScalar(typeof(Search<EDITran.sync, 
        Where<EDITran.doctype, Equal<SOOrder.orderType>, 
            And<EDITran.erprefnbr, Equal<SOOrder.orderNbr>>>>))]
    public virtual bool? Sync
    

    【讨论】:

    • 我为 EDITran.erprefnbr 添加了 PXParent 属性,并使用了 PXDBScalar。非常感谢您的帮助!
    【解决方案2】:

    我不确定 PXFormula 的正确用法。这是我在需要使用 PXFormula 时通常使用的参考。看看它是否可以帮助您简化 PXFormula。您可能需要简化为单个 Selector 并定义一个外键才能完成查找。

    另外,您确定数据库包含您期望的值吗?我经常发现我的问题不在我想的地方,而你的问题可能在于设置值或将它们写入业务逻辑中的数据库。

    您似乎需要 PXFormula 来查看您的 EDITran 表以查找由键(在 Selector 中指定的第一个字段)标识的记录,然后返回指定的第二个字段的值,该字段将驻留在 EDITran 中。

    来自Acumatica Developers Blog (AsiaBlog)

    选择器

    选择器执行以下操作:

    获取在当前 DAC 的外键字段 (KeyField) 上定义的 PXSelectorAttribute。 获取选择器当前引用的外部数据记录。 Using 计算并返回由 ForeignOperand 定义的关于该数据记录的表达式。

    public class APVendorPrice : IBqlTable
    {
        // Inventory attribute is an aggregate containing a PXSelectorAttribute
        // inside, which is also valid for Selector<>.
        [Inventory(DisplayName = "Inventory ID")]
        public virtual int? InventoryID
        [PXFormula(typeof(Selector<
            APVendorPrice.inventoryID, 
            InventoryItem.purchaseUnit>))]
        public virtual string UOM { get; set; }
    }
    

    因此,我希望您的 PXFormula 看起来更像:

    [PXFormula(typeof(Selector<
        SOOrder.orderNbr,
        EDITran.sync>))]
    

    ...假设您有足够的定义来告诉 Acumatica 如何将 SOOrder.orderNbr 与 EDITran.erprefnbr 关联起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2017-03-30
      相关资源
      最近更新 更多