How-toAcumatica Cloud ERPCustomization / DAC Extensions (Sales Orders SO301000)

How to Add a Custom Field to the Sales Order Screen in Acumatica

Question
how to add a custom field to sales order screen in Acumatica

Also searched as

  • Acumatica add user defined field to screen
  • Acumatica DAC extension custom field
  • Acumatica customization editor add field to grid
  • Acumatica attribute vs user defined field

Short answer

There are two routes. For simple data capture use Attributes (Configuration > Common Settings > Attributes), assigned to a class, which show up without code. For a real database column with logic, create a DAC extension (PXCacheExtension on SOOrder) in a Customization Project, add the field to the screen layout in the Screen Editor, and publish.

Applies to: Acumatica Cloud ERP 2021 R2 and later, Sales Orders (SO301000), same pattern for other screens

How to add the field with a DAC extension

  1. 1Open Customization > Customization Projects (SM204505), create a new project, and open it in the Customization Project Editor.
  2. 2Go to Screens > Sales Orders (SO301000) > Layout Editor, or use Inspect Element (Ctrl+Alt+Click on the field area) to jump into the screen from the page.
  3. 3In the Data Access (DAC) area, add a new DAC extension for SOOrder and add a field such as UsrCustomerPONote with the right type (string, length) and a display name.
  4. 4Choose to add the field to the database so Acumatica creates the column on the SOOrder table and extension table during publish.
  5. 5In the Layout Editor, drag the new field into the Order Summary section, set the label, and save the layout.
  6. 6Publish the project, hard refresh the browser, and test with a new sales order to confirm the value saves and reloads.
  7. 7If the field must flow to another document, such as a shipment or invoice, add a matching extension and handler (FieldDefaulting or RowPersisting) in a graph extension.
  8. 8Export the project zip and commit it to source control so it can be promoted to test and production.

Attributes versus DAC extension

Attributes are the fastest route. Create the attribute in Attributes (CS205000), assign it to an Item Class or Customer Class, and the value appears in a tab on the document. There is no code, no publish, and the data is stored in the attribute tables, so it is awkward in reports and Generic Inquiries compared with a real column.

A DAC extension gives a proper column that can be used in Generic Inquiry, reports, imports and business events. Use it when the field drives logic, needs validation, or must be reported on at volume.

What the code looks like

The Customization Project Editor generates the extension class for you. A DAC extension inherits PXCacheExtension of the base DAC and declares the field with its attributes, such as PXDBString for a database backed string and PXUIField for the label.

Keep the Usr prefix on custom fields. It avoids collisions with fields added by later Acumatica builds and is the convention the platform and partners follow.

public sealed class SOOrderExt : PXCacheExtension<SOOrder>
{
  public abstract class usrCustomerPONote : PX.Data.BQL.BqlString.Field<usrCustomerPONote> { }
  [PXDBString(100)]
  [PXUIField(DisplayName = "Customer PO Note")]
  public virtual string UsrCustomerPONote { get; set; }
}

Making it usable everywhere

A field on the screen is only the start. To use it in imports, expose it through the Import Scenario or in the REST endpoint by extending the endpoint in Web Service Endpoints (SM207060). To use it in reporting, add it to a Generic Inquiry or to the Report Designer.

Plan for upgrades. Extensions survive upgrades in most cases, but always compile and test the project on the new build in a test tenant before publishing to production.

Common pitfalls

  • !Using Attributes for data that needs heavy reporting, then discovering Generic Inquiry joins are slow and awkward.
  • !Forgetting the Usr prefix and clashing with a future platform field.
  • !Adding the field to the layout but not to the database, which causes a runtime error on save.
  • !Not exposing the field in the web service endpoint, so integrations cannot see it.
  • !Skipping a test tenant publish before production.

How an ERP-grounded AI assistant handles this

An AI assistant grounded in your Acumatica build can read the existing SOOrder DAC and extensions to suggest a field type and name that does not collide with what you already have, then draft the extension class. A developer still reviews and compiles it in the Customization Project Editor. ERPray helps afterwards by answering questions over the new column in plain language.

Frequently asked questions

Do I need a developer to add a field in Acumatica?

Not always. Attributes give you extra data fields through configuration only. A real database field with logic requires a Customization Project and usually someone comfortable with C#, though simple fields can be added entirely through the editor UI.

Where do I see the field in Generic Inquiry?

After publishing, open Generic Inquiry (SM208000), add the SOOrder table, and the new column appears as a selectable field in the result grid, prefixed with the Usr name.

Will the field survive an Acumatica upgrade?

Usually yes, since the extension sits outside the base code. Always test by compiling the project on the new build in a test tenant first, because changes to base classes can still break dependent logic.

Can I add the field to the Sales Order grid lines?

Yes. Extend SOLine instead of SOOrder, add the field, and place it in the Details grid via the Layout Editor. The same publish and refresh steps apply.

Related

Error fix

Acumatica Customization Project Publish Failed: How to Fix It

A failed publish in Acumatica means the platform could not validate, compile or apply the customization package to the website and database. Open the Publish Customization Project dialog, read the Compilation log and the Validation log, fix the first error (usually a C# compile error, a missing DAC field or a conflicting project), and publish again, ideally on a test tenant first.

How-to

How to Create a Generic Inquiry in Acumatica

Generic Inquiries (GI) are Acumatica's no-code query builder for joining tables, adding filters, and exposing the result as an inquiry screen, dashboard data source, or API endpoint. Open System > Customization > Generic Inquiry, add your base table, define joins and conditions, then run and save. No SQL or customization project is required.

How-to

How to Create an Import Scenario in Acumatica

Import scenarios in Acumatica live under System Integration > Import Scenarios: you pick a source (a file or a Generic Inquiry), map each source field to a target DAC field on the destination screen, then run or schedule the scenario. A small sample file run through the wizard first makes the field mapping step far faster than mapping blind.

Error fix

Acumatica REST API 401 Unauthorized and API Login Limit: How to Fix

A 401 from the Acumatica contract-based REST API usually means the login call failed or the session cookie was not sent back, and an API login limit error means too many API sessions are open for your license. Post to /entity/auth/login with name, password and company, reuse the cookie, and always call /entity/auth/logout when done. For integrations, prefer OAuth 2.0 through a Connected Application.

Error fix

Fix Odoo AccessError: You Are Not Allowed to Access Records

Odoo raises AccessError when a user's security groups do not grant a CRUD right on a model through ir.model.access.csv, or when an ir.rule record rule filters the specific record out for that user or company. Fix it by adding the user to the group named in the error, editing the model's access rights, or reviewing the record rule's domain under Settings > Technical > Security.

How-to

How to Void a Check in Sage 100

Sage 100 voids checks through Accounts Payable > Main > Check and Payment Voiding. Select the bank code, choose the check number, and Sage reverses the Cash Disbursements Journal entry and reopens the invoice it paid. A check that already cleared in Bank Reconciliation or falls in a closed period needs an extra step before it can be voided cleanly.

AI for ERP

AI for Acumatica Manufacturing Edition, Built on Your Own Data

Add AI to Acumatica Manufacturing Edition without giving up control of your shop and cost data. Private LLMs and agents grounded in your Acumatica instance.

Stuck on Acumatica Cloud ERP?

Talk to engineers who work inside Acumatica Cloud ERP every week, and who build private AI that answers these questions from your own ERP data.