Hi All,
Acumatica platform continuously evolving and includes more and more new cool features to optimize your code and save time on development and testing.
Today i want to share with you some really cool features of PXFormula attribute and how to use it to significantly simplify your cod
Here I want to cover following parameters:
- Validate – Validate<field>
- Current – Current<TRecord.field>
- Parent – Parent<TParent.field>
- IsTableEmpty – IsTableEmpty<TRecord>
- Selector – Selector<KeyField, ForeignOperand>
Welcome in details if you need examples.
Validate
The Validate<field> formula will raise dependentField’s FieldVerifying event each time the RelatedField is updated.
Example:
public class DacClass: PX.Data.IBqlTable
{
public abstract class field : IBqlField { }
public virtual int? Field { get; set; }
public abstract class dependentField : IBqlField { }
[PXFormula(typeof(Validate<field>))]
public virtual int? DependentField { get; set; }
}
Of course there you can do the same with graph/attribute events, but with formula it is much more stable and easier.
Current
Current<TRecord.field> and Current2<TRecord.field> fetches the field value from the record stored in the Current property of the TRecord cache.
If the cache’s Current property or the field itself contains null:
- Current<> forces field defaulting and returns the default field value.
- Current2<> returns null
Example:
[PXFormula(typeof(Switch< Case<Where< ARAdjust.adjgDocType, Equal<Current<ARPayment.docType>>, And<ARAdjust.adjgRefNbr, Equal<Current<ARPayment.refNbr>>>>, ARAdjust.classIcon.outgoing>, ARAdjust.classIcon.incoming>))] protected virtual void ARAdjust_ClassIcon_CacheAttached(PXCache sender)
Parent
Parent<TParent.field> fetches the field value from the parent data record as defined by PXParentAttribute residing on the current DAC.
Example:
public class INTran : IBqlTable
{
[PXParent(typeof(Select<
INRegister,
Where<
INRegister.docType, Equal<Current<INTran.docType>>,
And<INRegister.refNbr,Equal<Current<INTran.refNbr>>>>>))]
public virtual String RefNbr { ... }
[PXFormula(typeof(Parent<INRegister.origModule>))]
public virtual String OrigModule { ... }
}
IsTableEmpty
IsTableEmpty<TRecord> returns true if the DB table corresponding to the specified DAC contains no records.
Example:
public class APRegister : IBqlTable
{
[PXFormula(typeof(Switch<
Case<Where<
IsTableEmpty<APSetupApproval>, Equal<True>>,
True,
Case<Where<
APRegister.requestApproval, Equal<True>>,
False>>,
True>))]
public virtual bool? DontApprove { get; set; }
}
Selector
Selector<KeyField, ForeignOperand> does following:
- Fetches a PXSelectorAttribute defined on the foreign key field (KeyField) of the current DAC.
- Fetches the foreign data record currently referenced by the selector.
- Using calculates and returns an expression on that data record as defined by ForeignOperand.
Example:
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; }
}
Big thanks to Acumatica Development team for this example.
Have a nice development!
