MobileItemMgt220FDW
Utility codeunit for resolving items from scanned barcodes, managing item metadata, and performing unit-of-measure conversions. This is a stateful codeunit -- once an item is resolved, its properties (tracking settings, UOM, variant) are cached for subsequent calls.
Overview
- Object type: Codeunit
- Object ID: 73167890
- Access: Public
- Namespace:
Aptean.Mesh.SDUI
Resolution Strategy
When Resolve is called with a scanned value, the codeunit attempts to identify the item using three strategies in order:
- Item Reference -- looks up the scanned value in the
Item Referencetable, prioritizing barcode-type references - Item No. -- attempts a direct lookup on the
Itemtable by item number - Lot No. Information -- looks up the scanned value in
Lot No. Informationto reverse-resolve the item (only if exactly one match exists)
Once resolved, the item's tracking settings (lot tracking, expiration date requirements) are loaded from the Item Tracking Code.
Item Resolution Methods
Get
procedure Get(NewItemNo: Code[20]): Boolean
Loads an item by its exact item number. If the same item is already resolved, returns immediately without re-querying.
Parameters:
| Name | Type | Description |
|---|---|---|
NewItemNo | Code[20] | The item number to load |
Returns: Boolean -- true if the item was found.
Resolve
procedure Resolve(ScannedValue: Code[100]): Boolean
Attempts to resolve an item from a scanned barcode or entered value using the resolution strategy described above. Clears any previously resolved item state before attempting resolution.
Parameters:
| Name | Type | Description |
|---|---|---|
ScannedValue | Code[100] | The scanned barcode or manually entered value |
Returns: Boolean -- true if the item was successfully resolved.
Example:
var
ItemMgt: Codeunit MobileItemMgt220FDW;
begin
if not ItemMgt.Resolve('5901234123457') then
Error('Could not identify item from scan');
Message('Resolved item: %1 - %2', ItemMgt.GetItemNo(), ItemMgt.GetDescription());
if ItemMgt.IsLotTracked() then
Message('This item requires lot tracking');
end;
Getter Methods
All getters return cached values from the last successful Get or Resolve call.
IsItemResolved
procedure IsItemResolved(): Boolean
Returns true if an item is currently resolved.
GetItemNo
procedure GetItemNo(): Code[20]
Returns the resolved item number.
GetVariantCode
procedure GetVariantCode(): Code[10]
Returns the variant code. This is populated when the item was resolved via an Item Reference or Lot No. Information that specifies a variant.
GetUnitOfMeasureCode
procedure GetUnitOfMeasureCode(): Code[10]
Returns the unit of measure code from the item reference used during resolution. Falls back to the base unit of measure if no reference UOM was found.
GetBaseUnitOfMeasure
procedure GetBaseUnitOfMeasure(): Code[10]
Returns the item's base unit of measure code.
IsVariantCodeExplicit
procedure IsVariantCodeExplicit(): Boolean
Returns true if the variant code was explicitly set during resolution (from an Item Reference or Lot No. Information), as opposed to being blank by default.
GetDescription
procedure GetDescription(): Text[100]
Returns the item's Description field. Returns blank if no item is resolved.
GetFullDescription
procedure GetFullDescription(): Text[150]
Returns the item's Description and Description 2 concatenated with a space, truncated to 150 characters. Returns blank if no item is resolved.
IsLotTracked
procedure IsLotTracked(): Boolean
Returns true if the item has lot-specific tracking enabled in its Item Tracking Code.
IsExpirationDateUsed
procedure IsExpirationDateUsed(): Boolean
Returns true if the item's tracking code has Use Expiration Dates enabled. This controls whether expiration dates are tracked at all — use this to decide whether to show or hide expiration date fields in the workflow.
IsExpirationDateRequired
procedure IsExpirationDateRequired(): Boolean
Returns true if the item's tracking code requires mandatory expiration date entry (Man. Expir. Date Entry Reqd.). A subset of IsExpirationDateUsed() — an item can use expiration dates without making entry mandatory.
IsStrictExpirationEnabled
procedure IsStrictExpirationEnabled(): Boolean
Returns true if the item's tracking code enforces strict expiration posting (items cannot be posted after expiration).
GetNextLotNo
procedure GetNextLotNo(): Code[50]
Generates and returns the next lot number from the item's lot number series. Raises an error if no lot number series is configured for the item.
Returns: Code[50] -- the next available lot number.
HasLotNoSeries
procedure HasLotNoSeries(): Boolean
Returns true if the item has a lot number series configured. Use this to check before calling GetNextLotNo.
GetSelectedUOM
procedure GetSelectedUOM(): Code[10]
Returns the currently selected unit of measure. Priority: explicitly selected UOM > reference UOM > base UOM.
GetQtyPerSelectedUOM
procedure GetQtyPerSelectedUOM(): Decimal
Returns the quantity per unit of measure for the currently selected UOM. Returns 1 if no explicit selection has been made.
IsUOMSet
procedure IsUOMSet(): Boolean
Returns true if a unit of measure has been explicitly set via SetSelectedUOM.
Setter Methods
SetVariantCode
procedure SetVariantCode(NewVariantCode: Code[10])
Overrides the variant code. Use this when the user manually selects a variant that differs from what was resolved.
Parameters:
| Name | Type | Description |
|---|---|---|
NewVariantCode | Code[10] | The variant code to set |
SetSelectedUOM
procedure SetSelectedUOM(UOMCode: Code[10])
Sets the selected unit of measure and loads its conversion factor from the Item Unit of Measure table. Pass blank to clear.
Parameters:
| Name | Type | Description |
|---|---|---|
UOMCode | Code[10] | The UOM code to select (blank to clear) |
ClearSelectedUOM
procedure ClearSelectedUOM()
Clears the explicitly selected UOM and resets the conversion factor.
UOM Operations
GetDisplayQuantity
procedure GetDisplayQuantity(
LineQty: Decimal;
LineQtyPerUOM: Decimal;
DisplayUOM: Code[10]
): Decimal
Converts a line quantity to a display quantity in a different UOM. Returns the original quantity if DisplayUOM is blank.
Parameters:
| Name | Type | Description |
|---|---|---|
LineQty | Decimal | The quantity in the line's UOM |
LineQtyPerUOM | Decimal | The line's qty-per-UOM conversion factor |
DisplayUOM | Code[10] | The target UOM for display (blank = no conversion) |
Returns: Decimal -- the converted quantity.
FormatQuantityWithUOM
procedure FormatQuantityWithUOM(Qty: Decimal; UOMCode: Code[10]): Text
Formats a quantity and UOM code as a display string (e.g., "10 PCS"). Trailing zeros are trimmed from decimal values.
Parameters:
| Name | Type | Description |
|---|---|---|
Qty | Decimal | The quantity to format |
UOMCode | Code[10] | The UOM code to append |
Returns: Text -- formatted string like "10 PCS" or "2.5 KG".
FormatQuantityForDisplay
procedure FormatQuantityForDisplay(Qty: Decimal): Text
Formats a quantity for display, trimming unnecessary trailing zeros. Whole numbers are displayed without decimals.
Parameters:
| Name | Type | Description |
|---|---|---|
Qty | Decimal | The quantity to format |
Returns: Text -- formatted quantity string.
Examples: 10 becomes "10", 2.50000 becomes "2.5", 3.14159 becomes "3.14159".
GetQtyPerUOM
procedure GetQtyPerUOM(UOMCode: Code[10]): Decimal
Returns the quantity per unit of measure for the specified UOM code. Returns 1 if the UOM is blank or not found.
Parameters:
| Name | Type | Description |
|---|---|---|
UOMCode | Code[10] | The UOM code to look up |
Returns: Decimal -- the conversion factor.
GetQtyRoundingPrecision
procedure GetQtyRoundingPrecision(UOMCode: Code[10]): Decimal
Returns the quantity rounding precision for the specified UOM code. Returns 0.00001 as the default if not configured.
Parameters:
| Name | Type | Description |
|---|---|---|
UOMCode | Code[10] | The UOM code to look up |
Returns: Decimal -- the rounding precision.
CalcBaseQty
procedure CalcBaseQty(
Qty: Decimal;
UOMCode: Code[10];
QtyPerUOM: Decimal;
QtyRoundingPrecision: Decimal
): Decimal
Calculates the base quantity from a quantity in a specific UOM. Delegates to the standard BC Unit of Measure Management codeunit.
Parameters:
| Name | Type | Description |
|---|---|---|
Qty | Decimal | The quantity to convert |
UOMCode | Code[10] | The source UOM code |
QtyPerUOM | Decimal | The conversion factor |
QtyRoundingPrecision | Decimal | The rounding precision |
Returns: Decimal -- the quantity in base UOM.
CalcQtyFromBase
procedure CalcQtyFromBase(QtyBase: Decimal; QtyPerUOM: Decimal): Decimal
Converts a base quantity to a quantity in a specific UOM.
Parameters:
| Name | Type | Description |
|---|---|---|
QtyBase | Decimal | The base quantity to convert |
QtyPerUOM | Decimal | The target UOM's conversion factor |
Returns: Decimal -- the converted quantity.
GetAvailableUOMs
procedure GetAvailableUOMs(): List of [Text]
Returns a list of all UOM codes configured for the resolved item. Returns an empty list if no item is resolved.
Returns: List of [Text] -- available UOM codes.
ConvertQtyToLineUOM
procedure ConvertQtyToLineUOM(
ScannedQty: Decimal;
ScannedUOMCode: Code[10];
LineUOMCode: Code[10];
LineQtyPerUOM: Decimal
): Decimal
Converts a scanned quantity from one UOM to the line's UOM. If the scanned UOM matches the line UOM (or is blank), returns the quantity unchanged.
Parameters:
| Name | Type | Description |
|---|---|---|
ScannedQty | Decimal | The quantity scanned by the user |
ScannedUOMCode | Code[10] | The UOM the quantity was entered in |
LineUOMCode | Code[10] | The warehouse activity line's UOM |
LineQtyPerUOM | Decimal | The line's qty-per-UOM conversion factor |
Returns: Decimal -- the quantity expressed in the line's UOM.
ConvertQtyFromLineUOM
procedure ConvertQtyFromLineUOM(
LineQty: Decimal;
LineQtyPerUOM: Decimal;
TargetUOMCode: Code[10]
): Decimal
Converts a line quantity to a target UOM. Returns the original quantity if the target UOM is blank or has a zero conversion factor.
Parameters:
| Name | Type | Description |
|---|---|---|
LineQty | Decimal | The quantity in the line's UOM |
LineQtyPerUOM | Decimal | The line's qty-per-UOM conversion factor |
TargetUOMCode | Code[10] | The target UOM to convert to |
Returns: Decimal -- the converted quantity.
TrySelectUOM
procedure TrySelectUOM(
SelectedValue: Text;
CurrentUOM: Code[10];
var NewUOM: Code[10]
): Boolean
Attempts to select a new UOM from a user's choice. Validates the UOM exists for the item and differs from the current UOM. If valid, updates the internal selected UOM state.
Parameters:
| Name | Type | Description |
|---|---|---|
SelectedValue | Text | The UOM code selected by the user |
CurrentUOM | Code[10] | The currently active UOM |
NewUOM | Code[10] (var) | Output -- the validated new UOM code |
Returns: Boolean -- true if a new UOM was selected, false if the value was invalid, not found, or same as current.
Example:
var
ItemMgt: Codeunit MobileItemMgt220FDW;
NewUOM: Code[10];
begin
if ItemMgt.TrySelectUOM('KG', 'PCS', NewUOM) then
Message('UOM changed to %1', NewUOM);
end;
Typical Usage
The following illustrates how MobileItemMgt220FDW is used in a workflow step handler:
var
ItemMgt: Codeunit MobileItemMgt220FDW;
ScanEntryMgt: Codeunit ScanEntryMgt220FDW;
begin
// 1. Resolve item from barcode scan
if not ItemMgt.Resolve(ScannedBarcode) then
Error('Unknown item');
// 2. Check tracking requirements
if ItemMgt.IsLotTracked() then
// Prompt for lot number in next step
if ItemMgt.IsExpirationDateRequired() then
// Prompt for expiration date
// 3. Get UOM info for scan entry
UOMCode := ItemMgt.GetSelectedUOM();
QtyPerUOM := ItemMgt.GetQtyPerSelectedUOM();
// 4. Create scan entry with resolved data
ScanEntryMgt.InsertScanEntry(
ItemMgt.GetItemNo(),
LocationCode,
ItemMgt.GetVariantCode(),
SourceType, SourceSubtype, SourceID,
'', 0, SourceRefNo,
LotNo, SerialNo,
Quantity, UOMCode, QtyPerUOM,
ExpirationDate, BinCode
);
end;