Skip to main content

MobileRPCState220FDW

State management for mobile RPC requests and responses. This is the primary codeunit you interact with inside an IBCRPC220FDW handler. It parses the incoming request, provides typed accessors for all standard fields, and builds the JSON-RPC response.

Overview

  • Object type: Codeunit
  • Object ID: 73167882
  • Access: Public
  • Namespace: Aptean.Mesh.SDUI

The state object supports fluent chaining on setter methods, so you can write concise pipelines:

State
.SetDocumentNo('WH-001')
.SetLineNo(10000)
.SetItemNo('ITEM-A', true)
.SetBinCode('BIN-01', true);

Request / Response Lifecycle

1. Registry calls State.Hydrate(RequestJson)
|
2. Your RPC handler reads from State:
|- State.Method() -- which method to execute
|- State.GetDocumentNo() -- typed workflow getters
|- State.GetInput(...) -- raw input values
|- State.GetScannedValue() -- barcode + input combined
|
3. Your handler writes to State:
|- State.SetDocumentNo() -- update workflow
|- State.SetResult(...) -- add result data
|- State.Command() -- add navigation/alert commands
|- State.UI() -- build info pane
|
4. Return State.Serialize() as the response

Hydration

Hydrate

procedure Hydrate(Request: JsonObject)

Parses the incoming JSON-RPC request and populates all internal state. The MobileRPCRegistry220FDW calls this automatically before invoking your RPC() method, so you typically do not need to call it yourself.

Extracts from the request:

  • Root fields: method, id
  • Params: bundle, service, clientVersion, workflow, input, barcode, locationFilter
  • Nested: input.workflow (workflow state), input.view (view state), barcode fields

Parameters:

NameTypeDescription
RequestJsonObjectThe raw JSON-RPC request object

Request Accessors

Methods for reading top-level request metadata.

Bundle

procedure Bundle(): Guid

Returns the app bundle GUID. Throws an error if the bundle is missing from the request.

Returns: Guid -- the app bundle identifier.


BundleOrEmpty

procedure BundleOrEmpty(): Guid

Returns the app bundle GUID without validation. Returns an empty GUID if not present. Useful for logging scenarios.

Returns: Guid


Service

procedure Service(): Code[50]

Returns the mobile service code (e.g., 'PUTAWAY'). Throws an error if the service is missing.

Returns: Code[50]


ServiceOrEmpty

procedure ServiceOrEmpty(): Code[50]

Returns the service code without validation. Returns empty if not present.

Returns: Code[50]


Method

procedure Method(): Text[50]

Returns the RPC method name from the request (e.g., 'Initialize', 'ScanItem'). This corresponds to the endpoint configured in the page JSON action.

Returns: Text[50]


RequestId

procedure RequestId(): Integer

Returns the JSON-RPC request ID. Used for correlating responses with requests.

Returns: Integer


ClientVersion

procedure ClientVersion(): Integer

Returns the mobile client VERSION_CODE (integer). Use this for feature gating based on the app version.

Returns: Integer


GetCurrentLocation

procedure GetCurrentLocation(): Code[10]

Returns the location filter sent by the mobile client. If the client sent 'ALL', this resolves to an empty string.

Returns: Code[10]


GetDefaultLocation

procedure GetDefaultLocation(): Code[10]

Returns the default warehouse location for the current user, read from the Warehouse Employee table during hydration.

Returns: Code[10]


Document Context -- Typed Getters

These methods read standard warehouse fields from the workflow state with type-safe return values. Each accepts a ShowError parameter -- when true, an error is raised if the field is missing.

GetDocumentNo

procedure GetDocumentNo(ShowError: Boolean): Code[20]

Returns the document number from workflow state.

Parameters:

NameTypeDescription
ShowErrorBooleanIf true, throws an error when the value is missing

Returns: Code[20]


GetLineNo

procedure GetLineNo(ShowError: Boolean): Integer

Returns the line number from workflow state.

Returns: Integer


GetItemNo

procedure GetItemNo(ShowError: Boolean): Code[20]

Returns the item number from workflow state.

Returns: Code[20]


GetVariantCode

procedure GetVariantCode(ShowError: Boolean): Code[10]

Returns the variant code from workflow state.

Returns: Code[10]


GetLotNo

procedure GetLotNo(ShowError: Boolean): Code[50]

Returns the lot number from workflow state.

Returns: Code[50]


GetBinCode

procedure GetBinCode(ShowError: Boolean): Code[20]

Returns the bin code from workflow state.

Returns: Code[20]


GetLocationCode

procedure GetLocationCode(ShowError: Boolean): Code[10]

Returns the location code from workflow state.

Returns: Code[10]


GetHasTracking

procedure GetHasTracking(): Boolean

Returns whether item tracking is active for the current line. Does not throw on missing values -- returns false by default.

Returns: Boolean


GetSelectedUOM

procedure GetSelectedUOM(ShowError: Boolean): Code[10]

Returns the selected unit of measure from workflow state.

Returns: Code[10]


GetLastEnteredQty

procedure GetLastEnteredQty(): Decimal

Returns the last entered quantity from workflow state. Returns 0 if not set.

Returns: Decimal


Document Context -- Typed Setters

Setter methods update workflow state and return this for fluent chaining. Methods with an UpdateInfoPane parameter will also update the corresponding field in the view's info pane display when set to true.

SetDocumentNo

procedure SetDocumentNo(DocumentNo: Code[20]): Codeunit MobileRPCState220FDW

Sets the document number in workflow state.

Returns: Codeunit MobileRPCState220FDW -- self, for chaining.


SetLineNo

procedure SetLineNo(LineNo: Integer): Codeunit MobileRPCState220FDW

Sets the line number in workflow state.


SetItemNo

procedure SetItemNo(ItemNo: Code[20]; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Sets the item number. When UpdateInfoPane is true, also updates the "Item" field in the info pane.


SetVariantCode

procedure SetVariantCode(NewVariantCode: Code[10]): Codeunit MobileRPCState220FDW

Sets the variant code in workflow state.


SetLotNo

procedure SetLotNo(LotNo: Code[50]; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Sets the lot number. When UpdateInfoPane is true, also updates the "Lot No." field in the info pane.


SetBinCode

procedure SetBinCode(BinCode: Code[20]; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Sets the bin code. When UpdateInfoPane is true, also updates the "Bin" field in the info pane.


SetLocationCode

procedure SetLocationCode(LocationCode: Code[10]): Codeunit MobileRPCState220FDW

Sets the location code in workflow state.


SetHasTracking

procedure SetHasTracking(HasTracking: Boolean): Codeunit MobileRPCState220FDW

Sets the item tracking flag in workflow state.


SetSelectedUOM

procedure SetSelectedUOM(UOM: Code[10]; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Sets the selected unit of measure. When UpdateInfoPane is true, also updates the "Unit of Measure" field in the info pane.


SetScannedQty

procedure SetScannedQty(Qty: Decimal; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Updates the scanned quantity display. When UpdateInfoPane is true, updates the "Scanned Qty" field in the info pane. Note: this method only updates the info pane -- it does not store the quantity in workflow state.


SetExpDate

procedure SetExpDate(ExpDate: Date; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Sets the expiration date in workflow state (stored as ISO date string). When UpdateInfoPane is true, also updates the "Expiration Date" field.


SetQuantity

procedure SetQuantity(Qty: Decimal; UpdateInfoPane: Boolean): Codeunit MobileRPCState220FDW

Sets the quantity in workflow state. When UpdateInfoPane is true, also updates the "Quantity" field in the info pane.


JSON Key Accessors

These methods return the standard JSON key names used in the workflow state object. Use them when you need to perform custom JSON operations with JsonHelper220FDW instead of using the typed getters/setters.

MethodReturnsJSON Key
DocumentNoKey()Text[30]documentNo
LineNoKey()Text[30]lineNo
ItemKey()Text[30]item
VariantKey()Text[30]variant
LotKey()Text[30]lot
BinKey()Text[30]bin
LocationCodeKey()Text[30]locationCode
QuantityKey()Text[30]quantity
SourceTypeKey()Text[30]sourceType
SourceNoKey()Text[30]sourceNo
SourceDocKey()Text[30]sourceDocument
SelectedUOMKey()Text[30]selectedUOM
TrackingQtyKey()Text[30]trackingQty
ValueKey()Text[30]value
LastEnteredQtyKey()Text[30]lastEnteredQty
HasTrackingKey()Text[30]hasTracking
ExpDateKey()Text[30]expDate
FromBinKey()Text[30]fromBin
ToBinKey()Text[30]toBin

Display Label Accessors

These methods return the human-readable labels used for info pane fields. Use them with UpdateViewField() or when building custom info pane entries.

MethodReturnsLabel
ItemLabel()Text[30]Item
LotLabel()Text[30]Lot No.
BinLabel()Text[30]Bin
QuantityLabel()Text[30]Quantity
LineNoLabel()Text[30]Line No.
LocationLabel()Text[30]Location
UOMLabel()Text[30]Unit of Measure
VariantLabel()Text[30]Variant Code
SourceNoLabel()Text[30]Source No.
SourceDocLabel()Text[30]Source Document
DocumentNoLabel()Text[30]Document No.
ScannedQtyLabel()Text[30]Scanned Qty
QtyOutstandingLabel()Text[30]Qty Outstanding
SuggestedBinLabel()Text[30]Suggested Bin
VendorLabel()Text[30]Vendor
DueDateLabel()Text[30]Due Date
DocumentStatusLabel()Text[30]Document Status
ExpDateLabel()Text[30]Expiration Date
PickNoLabel()Text[30]Pick No.
PlaceBinLabel()Text[30]Place Bin
FromBinLabel()Text[30]From Bin
ToBinLabel()Text[30]To Bin
FromLocationLabel()Text[30]From Location
ToLocationLabel()Text[30]To Location

Barcode Accessors

Methods for working with barcode scan data sent by the mobile client.

RawBarcode

procedure RawBarcode(): Text

Returns the raw barcode string exactly as scanned by the device.

Returns: Text


Symbology

procedure Symbology(): Code[20]

Returns the scanner symbology (e.g., 'CODE128', 'QR', 'EAN13').

Returns: Code[20]


BarcodeDataType

procedure BarcodeDataType(): Code[20]

Returns the parsed barcode data type (e.g., 'GS1', 'EAN128', 'SSCC').

Returns: Code[20]


HasBarcodeError

procedure HasBarcodeError(): Boolean

Returns true if barcode parsing failed on the client side.

Returns: Boolean


GetDataFromAICode

procedure GetDataFromAICode(AICode: Code[30]): Text[100]

Returns the value for a specific GS1 Application Identifier from the parsed barcode data.

Parameters:

NameTypeDescription
AICodeCode[30]The GS1 Application Identifier code

Returns: Text[100] -- the parsed value, or empty if not found.

Common AI codes:

AI CodeDescription
'01'GTIN
'10'Lot/Batch Number
'17'Expiration Date (YYMMDD)
'21'Serial Number
'37'Quantity

GetScannedValue (simple)

procedure GetScannedValue(AICode: Code[30]): Text[100]

Gets the scanned value by checking the value input field first, then falling back to barcode AI data, then to the raw barcode for non-GS1 barcodes. This is the recommended method for reading scanned input in most scenarios.

Parameters:

NameTypeDescription
AICodeCode[30]GS1 AI code(s) to look up. Supports multiple codes separated by ; (e.g., '01;02')

Returns: Text[100]


GetScannedValue (with custom input key)

procedure GetScannedValue(InputKey: Text; AICode: Code[30]): Text[100]

Same as above but reads from a custom input key instead of the default value key.

Parameters:

NameTypeDescription
InputKeyTextThe input key to check first
AICodeCode[30]GS1 AI code(s) to fall back to. Supports ;-separated list.

Returns: Text[100]

Resolution order:

  1. Input field (InputKey)
  2. Barcode AI data (tries each code in the ;-separated list)
  3. Raw barcode string (only for non-GS1 barcodes or failed GS1 parsing)

HasBarcodeAI

procedure HasBarcodeAI(AICode: Code[10]): Boolean

Returns true if the scanned barcode contains the specified GS1 Application Identifier.

Returns: Boolean


GetParsedBarcodeData

procedure GetParsedBarcodeData(var Data: Record ParsedBarcodeData220FDW)

Copies the full parsed barcode buffer for direct iteration over all AI code/value pairs.

Parameters:

NameTypeDescription
DataRecord ParsedBarcodeData220FDWReceives a copy of the parsed barcode data

ParseGS1Date

procedure ParseGS1Date(GS1DateText: Text): Date

Parses a GS1 expiration date string in YYMMDD format. If the day portion is 00, it returns the last day of the month.

Parameters:

NameTypeDescription
GS1DateTextTextThe 6-character date string (e.g., '261231' for Dec 31, 2026)

Returns: Date -- the parsed date, or 0D if the format is invalid.

Example:

var
ExpDate: Date;
begin
// Parse AI(17) expiration date from barcode
if State.HasBarcodeAI('17') then begin
ExpDate := State.ParseGS1Date(State.GetDataFromAICode('17'));
State.SetExpDate(ExpDate, true);
end;
end;

Input Accessors

Methods for reading values from the input object in the request. Input values come from navigation data parameters, form input components, and filter selections on the page.

GetInput

procedure GetInput(KeyName: Text; ShowError: Boolean): Text

Returns a text value from the input object.

Parameters:

NameTypeDescription
KeyNameTextThe input field key
ShowErrorBooleanIf true, throws an error when missing

Returns: Text


GetInputInt

procedure GetInputInt(KeyName: Text; ShowError: Boolean): Integer

Returns an integer value from the input object.


GetInputDecimal

procedure GetInputDecimal(KeyName: Text; ShowError: Boolean): Decimal

Returns a decimal value from the input object.


GetInputBool

procedure GetInputBool(KeyName: Text; ShowError: Boolean): Boolean

Returns a boolean value from the input object.


HasInput

procedure HasInput(KeyName: Text): Boolean

Returns true if the input object contains the specified key.

Returns: Boolean


ClearInput

procedure ClearInput(KeyName: Text)

Removes a key from the input object. Use this to prevent stale values from being reused on subsequent calls.


Workflow State Access

Generic read/write access to the workflow state object. These are the building blocks that the typed getters/setters use internally. Use them for custom fields that are not covered by the typed accessors.

All setter methods return Codeunit MobileRPCState220FDW for fluent chaining.

GetWorkflowText / SetWorkflow

procedure GetWorkflowText(KeyName: Text; ShowError: Boolean): Text
procedure SetWorkflow(KeyName: Text; Value: Text): Codeunit MobileRPCState220FDW

GetWorkflowInt / SetWorkflowInt

procedure GetWorkflowInt(KeyName: Text; ShowError: Boolean): Integer
procedure SetWorkflowInt(KeyName: Text; Value: Integer): Codeunit MobileRPCState220FDW

GetWorkflowBool / SetWorkflowBool

procedure GetWorkflowBool(KeyName: Text; ShowError: Boolean): Boolean
procedure SetWorkflowBool(KeyName: Text; Value: Boolean): Codeunit MobileRPCState220FDW

GetWorkflowDecimal / SetWorkflowDecimal

procedure GetWorkflowDecimal(KeyName: Text; ShowError: Boolean): Decimal
procedure SetWorkflowDecimal(KeyName: Text; Value: Decimal): Codeunit MobileRPCState220FDW

GetWorkflowDate / SetWorkflowDate

procedure GetWorkflowDate(KeyName: Text; ShowError: Boolean): Date
procedure SetWorkflowDate(KeyName: Text; Value: Date): Codeunit MobileRPCState220FDW

Dates are stored as ISO format strings (YYYY-MM-DD). 0D is stored as an empty string.


Workflow

procedure Workflow(): Code[20]

Returns the workflow code from the request params. Throws an error if empty.

Returns: Code[20]


GetCurrentStep / SetCurrentStep

procedure GetCurrentStep(): Enum StepType220FDW
procedure SetCurrentStep(Step: Enum StepType220FDW): Codeunit MobileRPCState220FDW

Gets or sets the current workflow step. The step type is an enum that represents the kind of input the mobile app should prompt for next.


GetCurrentSequence / SetCurrentSequence

procedure GetCurrentSequence(): Integer
procedure SetCurrentSequence(Sequence: Integer): Codeunit MobileRPCState220FDW

Gets or sets the current workflow sequence number. The sequence determines the order of steps within a workflow.


GetQuantityStepSequence

procedure GetQuantityStepSequence(): Integer

Returns the sequence number of the Quantity step in the current workflow, or 0 if not found. Reads from the Mobile Workflow Step table.

Returns: Integer


RemoveWorkflow

procedure RemoveWorkflow(KeyName: Text): Codeunit MobileRPCState220FDW

Removes a key from the workflow state. Returns self for chaining.


GetWorkflowObject

procedure GetWorkflowObject(): JsonObject

Returns the raw workflow JSON object for advanced scenarios where the typed accessors are not sufficient.

Returns: JsonObject


HasWorkflow

procedure HasWorkflow(KeyName: Text): Boolean

Returns true if the workflow state contains the specified key.


View State Access

The view state holds display-related data such as info pane fields and UI component values. It is separate from the workflow state.

GetView / SetView

procedure GetView(KeyName: Text; ShowError: Boolean): Text
procedure SetView(KeyName: Text; Value: Text): Codeunit MobileRPCState220FDW

GetViewInt / SetViewInt

procedure GetViewInt(KeyName: Text; ShowError: Boolean): Integer
procedure SetViewInt(KeyName: Text; Value: Integer): Codeunit MobileRPCState220FDW

GetViewBool / SetViewBool

procedure GetViewBool(KeyName: Text; ShowError: Boolean): Boolean
procedure SetViewBool(KeyName: Text; Value: Boolean): Codeunit MobileRPCState220FDW

GetViewDecimal / SetViewDecimal

procedure GetViewDecimal(KeyName: Text; ShowError: Boolean): Decimal
procedure SetViewDecimal(KeyName: Text; Value: Decimal): Codeunit MobileRPCState220FDW

RemoveView

procedure RemoveView(KeyName: Text)

Removes a key from the view state.


GetViewObject

procedure GetViewObject(): JsonObject

Returns the raw view JSON object.


HasView

procedure HasView(KeyName: Text): Boolean

Returns true if the view state contains the specified key.


HasViewField

procedure HasViewField(FieldLabel: Text): Boolean

Returns true if the view state contains a display field with the given label. Delegates to the UI builder internally.


Response Building

Methods for constructing the response payload that is returned to the mobile client.

SetResult

procedure SetResult(KeyName: Text; Value: Text)

Adds a text value to the result object.


SetResultInt

procedure SetResultInt(KeyName: Text; Value: Integer)

Adds an integer value to the result object.


SetResultBool

procedure SetResultBool(KeyName: Text; Value: Boolean)

Adds a boolean value to the result object.


SetResultDecimal

procedure SetResultDecimal(KeyName: Text; Value: Decimal)

Adds a decimal value to the result object.


SetResultObject

procedure SetResultObject(KeyName: Text; Value: JsonObject)

Adds a JSON object to the result object.


SetResultArray

procedure SetResultArray(KeyName: Text; Value: JsonArray)

Adds a JSON array to the result object.


GetResultObject

procedure GetResultObject(): JsonObject

Returns the raw result JSON object for advanced manipulation.


SetInfoPane

procedure SetInfoPane(InfoPaneJObj: JsonObject)

Merges the info pane JSON into the view state. Typically you use State.UI() to build the info pane instead of calling this directly.


UpdateViewField

procedure UpdateViewField(FieldLabel: Text; NewValue: Text): Codeunit MobileRPCState220FDW

Updates a single field in the view's info pane by its display label, without rebuilding the entire pane.

When to use UpdateViewField vs State.UI():

ScenarioUse
Page first loads — build the full pane with all fieldsState.UI().InfoPane(...).Field(...).Field(...)
A scan updates one field (e.g. Lot No.) but the rest stays the sameState.UpdateViewField(State.LotLabel(), LotNo)
Quantity changes and the gauge must updateState.UpdateViewQtyWithGauge(State.QuantityLabel(), Total, Scanned)

Rebuilding the full pane on every call is correct but slightly more expensive. For hot paths (scan processing), prefer UpdateViewField to avoid re-serialising unchanged fields.

// ✅ Incremental update — only the Bin field changes
State.UpdateViewField(State.BinLabel(), NewBinCode);

// ✅ Rebuild — used in Initialize when building the pane from scratch
State.UI()
.InfoPane(Item.Description, Item."No.")
.WithItemImage(Item."No.")
.Field(State.LotLabel(), LotNo)
.Field(State.BinLabel(), BinCode)
.FieldQtyWithGauge(State.QuantityLabel(), ScannedQty, OutstandingQty);

UpdateViewFieldWithGauge

procedure UpdateViewFieldWithGauge(FieldLabel: Text; NewValue: Text; GaugePercent: Integer): Codeunit MobileRPCState220FDW

Updates a field and its associated gauge (0--100 percent) in the view's info pane.


UpdateViewQtyWithGauge

procedure UpdateViewQtyWithGauge(FieldLabel: Text; TotalQty: Decimal; ScannedQty: Decimal): Codeunit MobileRPCState220FDW

Updates a quantity field with an auto-calculated gauge showing progress (scanned vs. total).


SetScanInput

procedure SetScanInput(ScanInputJObj: JsonObject)

Attaches a scan input configuration to the result. Typically built using State.StepInput() instead of calling this directly.


SetCommands

procedure SetCommands(CommandsArr: JsonArray)

Attaches a commands array to the result. Typically built using State.Command() instead of calling this directly.


Builders

Accessor methods that return embedded builder codeunits. These builders accumulate configuration and are automatically flushed into the response when Serialize() is called.

Command

procedure Command(): Codeunit MobileCommandBuilder220FDW

Returns the command builder for adding navigation, alerts, toasts, and other client-side commands to the response.


UI

procedure UI(): Codeunit MobileUIBuilder220FDW

Returns the UI builder for constructing info pane displays with labeled field rows.


StepInput

procedure StepInput(): Codeunit MobileWorkflowBuilder220FDW

Returns the workflow builder for configuring the next scan/input prompt shown to the user.


Serialization

Serialize

procedure Serialize(): JsonObject

Builds the final JSON-RPC response. This method:

  1. Flushes any pending builder content (commands, scan input, info pane)
  2. Assembles the workflow state, view state, and result data into the response
  3. Adds the request ID for correlation

Call this as the last line in your RPC handler.

Returns: JsonObject -- the complete response.

Example:

procedure RPC(var State: Codeunit MobileRPCState220FDW) ResponseJson: JsonObject
begin
case State.Method() of
'Initialize':
Initialize(State);
'ScanItem':
ScanItem(State);
end;

ResponseJson := State.Serialize();
end;

The response structure:

{
"workflow": { "documentNo": "WH-001", "currentStep": 2 },
"view": { "fields": [...] },
"scanInput": { ... },
"commands": [ ... ],
"customKey": "customValue",
"id": 1
}

See Also