Whether its a complex or simple problem, the solving process is an art. You can solve any given problem in many ways, just like you can skin a cat in many ways.
We could solve a given problem by understanding the functionality of what a user is trying to achieve, solve it technically or simply training of how to use it.
Here is a sceanrio how we were posed with a problem and a simple change of user controls and presenting the same information helped us solve the ability to scan or key-in or look up a given serial number.
In the real world sceanrio, our customer wanted to scan a serial number or key-in the serial or simply look up for a specific serial number, they could use either one of the scenario depending on who is doing the activity.
We solved this through usability design, which is an art of simplicity.
Usability – An Art Of Solving Problems
An Acumatica user dealing with several products is nightmare, luckily they don’t have to remember all item codes/SKU’s since the Universal search and the search mechanism helps users to find the product they are looking for. However if these products are serialized it becomes a daunting task to look for specific serials.
The following user scenarios are what must be solved:
- User would like to enter a serial number manually
- User would scan a barcoded serial number
- User would look up existing serial numbers and select
Use Case Scenarios
- Warehouse manager – For fast adding of serial numbers to document details grid, interface to key-in was required, the same interface would also enable scanning the product with barcode would facilitate.
- Sales or Inventory Manager – For the reason of looking up a specific serial number by availability across warehouse or looking up by attributes of an item then look up screen would help.
We made changes to our user interface with following code to facilitate multi-users use case scenarios.
Acumatica Custom Code
1.Selector DAC field for Selector control to allow Lotserial number selection from available lotserial number.
2.Text field to accept lotserial number
3.Check box to toggle between selector and text box to accept lotserial number
Toggling the fields based on checkbox is done in Rowselected event
protected void InfoLotSerialFilter_RowSelected(PXCache cache, PXRowSelectedEventArgs e, PXRowSelected InvokeBaseHandler)
{
if (InvokeBaseHandler != null)
InvokeBaseHandler(cache, e);
var row = (InfoLotSerialFilter)e.Row;
if (row == null) return;
if (row.EnableSelector == true)
{
PXUIFieldAttribute.SetVisible<InfoLotSerialFilter.lotSerialNbr>(cache, row, true);
PXUIFieldAttribute.SetVisible<InfoLotSerialFilter.serialNbr>(cache, row, false);
}
else
{
PXUIFieldAttribute.SetVisible<InfoLotSerialFilter.lotSerialNbr>(cache, row, false);
PXUIFieldAttribute.SetVisible<InfoLotSerialFilter.serialNbr>(cache, row, true);
}
}
On Field Updated Check the serial number exists and add allocation detail in the sales order.
protected void InfoLotSerialFilter_LotSerialNbr_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
{
if (InvokeBaseHandler != null)
InvokeBaseHandler(cache, e);
var row = (InfoLotSerialFilter)e.Row;
// Get the Current Row Selected in Selector / Text file
INLotSerialStatus serial = (INLotSerialStatus)PXSelectorAttribute.Select<INLotSerialStatus.lotSerialNbr>(lotserialfilter.Cache, lotserialfilter.Current);
if(serial == null)
{
if (row.EnableSelector != true)
{
cache.RaiseExceptionHandling<InfoLotSerialFilter.serialNbr>(row, string.Empty,
new PXSetPropertyException(mess, PXErrorLevel.Warning));
}
else
{
cache.RaiseExceptionHandling<InfoLotSerialFilter.lotSerialNbr>(row, string.Empty,
new PXSetPropertyException(mess, PXErrorLevel.Warning));
}
return;
}
// Insert Row int to Sales Order
SOLine newline = PXCache<SOLine>.CreateCopy(Base.Transactions.Insert(new SOLine()));
// Assign all the required fields and update.
newline.SiteID = serial.SiteID;
newline.InventoryID = serial.InventoryID;
newline.SubItemID = serial.SubItemID;
newline.UOM = itm.SalesUnit;
newline.LotSerialNbr = row.LotSerialNbr;
newline.OrderQty = 1;
//Allocate the serial number to sales order line
SOLineSplit splitrow = Base.splits.Cache.CreateCopy(Base.splits.Insert(new SOLineSplit())) as SOLineSplit;
splitrow.LotSerialNbr = row.LotSerialNbr;
splitrow.Qty = newline.OrderQty;
splitrow = Base.splits.Update(splitrow);
Base.Transactions.View.RequestRefresh();
}
Add Serial – Button interface to allow quick add of an stock item to document details from serial perspective instead of conventional way of adding an item and then allocating
LotSerial Look Dialog window – Allows user to either key-in the serial number or scan the serial number
Enable Look up – Allows user to select available serial numbers in stock and keep adding to sales document details
Summary:
The art of solving problems could be achieved with simplicity in mind, and having the right tools and experience in development and understanding of your customer needs.
Usability should be the key focus for any software development, understand your users behavior, create use case scenarios, map them to technical know-how’s and start coding to solve.