Acumatica developers conference 2018 part 1

Hello everybody,

I want to summarize what I've seen and heard at latest Acumatica Developers conference.

First of all, I'd like to say that idea from Gabriel Michaud about using of attributes that can save plenty of time during development.

Part 1

Everyday trips and tricks (Magic attributes and BQL operands)

Lets start. For examle how to make a field required (or visible, or enabled) dynamically:

Traditional way (old version):

protected virtual void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    SOOrder doc = e.Row as SOOrder;
    if (doc == null)

    if (doc.OrderType == "SO")
          PXDefaultAttribute.SetPersistingCheck<SOOrder.customerOrderNbr>(cache, doc, PXPersistingCheck.NullOrBlank);
        PXDefaultAttribute.SetPersistingCheck<SOOrder.customerOrderNbr>(cache, doc, PXPersistingCheck.Nothing);

New way, using PXUIRequired attribute:

[PXMergeAttributes(Method = MergeMethod.Append)]
public string CustomerOrderNbr { getset; }

So now if you try to create Sales Order with Order Type "SO" and no enter Customer Order Acumatica show "Erorr, Customer Order Cannot be Empty"


Another attribute it is PXUIVisible:

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXUIVisible(typeof(Where<Selector<SOOrder.customerIDCustomer.customerClassID>, Equal<keyCustomersClass>>))]
public string ProjectID { getset; }

So using this PXUIVisible we can make field visible or no; Also pat attention that Selector<> is powerfull and fast operand, becouse it get data from memory (cache);


Another attribute it is PXUIVerify:

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXUIVerify(typeof(Where<SOOrder.requestDateGreater<SOOrder.orderDate>>), PXErrorLevel.Warning, "Request date should be greater than order date")]
public DateTime? RequestDate { getset; }

Use this way we can verify field. If we set PXErrorLevel.Erorr we can`t save data (if it is need);


Another attribute it is PXUIEnabled + PXDefault + PXFormula trigger:

[PXMergeAttributes(Method = MergeMethod.Append)]
[PXUIEnabled(typeof(Where<Selector<SOOrder.projectIDPMProject.nonProject>, Equal<True>>))]
[PXDefault(typeof(Search<PMTask.descriptionWhere<PMTask.projectIDEqual<Current<SOOrder.projectID>>>>),PersistingCheck = PXPersistingCheck.Nothing)]
public  string OrderDesc { getset; }

Here Order description defaulted from Project and only editable for "X" (non-project);

PXFormula for force update of default value when ProjectID changes - replaces SetDefault;


Another attribute it is PXFormula + Selector:

[PXUIField(DisplayName = "MSRP", Enabled = false)]
public decimal? UsrRecPrice { getset; }

Here I add new UsrRecPrice, and use Selector, this field will be refresh price when I will change inventoryId;


So use this attributes in yours projects;

Add comment