Find the custom fields in Acumatica using ScreenUtils class

We'll guide you on how to show all custom fields on a screen, even if they are not associated with your package. You can use the PX.Api.ScreenUtils class to locate any field. This class contains a method called GetScreenInfo() that returns a Content. Inside the Content object, there's a field named Containers, which you can use to find the required fields.

When creating custom fields, it is necessary to add the prefix 'usr'. So, we can use it to find them.

Let’s imagine we need to show all custom fields in the SOShipments screen and show their DisplayName and FieldName using the action called FieldSeeker.

As an example, we have added a field with “NextSODetails” DisplayName and “UsrSODetails” FieldName. So, by clicking on the FieldSeeker button, we should see those details about the custom field.

 

Here is how you can get the Container field:

    // Acuminator disable once PX1016 ExtensionDoesNotDeclareIsActiveMethod extension should be constantly active
    public class SOShipmentEntryExt : PXGraphExtension<SOShipmentEntry>
    {
        #region Actions
        public PXAction<SOShipment> FieldSeeker;
        [PXUIField(Visible = true, DisplayName = "Field Seeker")]
        [PXButton(CommitChanges = true)]
        public virtual IEnumerable fieldSeeker(PXAdapter adapter)
        {
            string customFields = string.Empty;
            foreach (Container container in ScreenUtils.GetScreenInfo(Base.Accessinfo.ScreenID, truetrue)?.Containers?
                         .Where(x => x.Fields?.Any(f => f.FieldName.StartsWith("Usr")) == true))
            {
                foreach (Field customField in container.Fields.Where(f => f.FieldName.StartsWith("Usr")))
                {
                    customFields += "<b>DisplayName:</b> " + customField.Name +
                                    "<br><b>FieldName:</b> " + customField.FieldName + "<br><br>";
                }
            }
            Base.Document.Ask(customFields, MessageButtons.OK);
‚Äč
            return adapter.Get();
        }
        #endregion
    }

 

In this code, we are using the foreach loop to locate all the Containers in the Containers array and check if there is any Container including any field with the ‘Usr’ prefix. Since the Containers field is an array, it can have multiple containers, so we need to use another loop to retrieve all the records in each container. Therefore, we have a nested loop within the main loop to achieve this.

In the nested foreach loop, we look for every field that starts with 'Usr' within the Container. Once we find them, we assign their Name and FieldName values to an empty string variable that was created earlier.

As we want to show them on the pop-up, we call the Ask method from the graph view and give the customFields variable to that method as a message parameter.

Here is the result:

Summary

ScreenUtils class may be used for findinging customly added fields in Acumatica, and allows you to build flexible applications, which will interop with other customizations.

 

 

How can we add a custom field with barcode scanning for acumatica mobile application?

Firstly we need to add our custom field to the screen, for example we will use the Sales Orders screen and add Custom Barcode field to the Details tab.

For adding this field to mobile application with Barcode scanning functionality we should just update Details container on

the SO301000 screen and define the special attribute with value “BarCodeScan”.

Or in the form of text:

update screen SO301000 {
update container "Details" {
   add field "CustomBarcode"{
       formPriority = 1
       special = BarCodeScan
      }
    }
  }
After publishing the package we should be able to see our field with scanning functionality on the Sales Orders screen as shown below.