The 365 business Address Validation app implements the 365 business API services Address Validation. The app is providing Address Validation and Address Completion capabilities. Address Validation is supporting the following entities:
Contact
Customer
Vendor
Alternative Address
Order Address
Ship-To Address
Sales Header
Purchase Header.
Address Prediction
Additionally the Address Prediction feature is supported by 365 business Address Validation app. Address Prediction is an auto-complete type-ahead feature.
Address Prediction is supporting the following entities:
Contact
Customer
Vendor
Alternative Address
Order Address
Ship-To Address
Sales Header
Purchase Header.
Interfaces
The 365 business Address Validation app is providing an internal API codeunit to allow integration into customer specific business processes. For example you can implement your own table into the address validation using the provided procedures inside the API codeunit.
Address Validation API (Codeunit 5523600 - bdev.Address Validation API)
The bdev.Address Validation API codeunit object is providing the Address Validation and Address Completion functionalities and allows other extensions to integrate.
The following example is showing how to implement Address Prediction into a custom entity:
Code
page 50000 "My Page"{ .. layout { area(Content) { group(General) { Caption = 'General'; field(Name; Rec.Name) { ApplicationArea = All; Importance = Promoted; ShowMandatory = true; ToolTip = 'Specifies the name. This name will appear on all documents.'; } field(Address; Address) { ApplicationArea = Basic, Suite; ToolTip = 'Specifies the address. This address will appear on all documents.'; } field("Address 2"; Rec."Address 2") { ApplicationArea = Basic, Suite; ToolTip = 'Specifies additional address information.'; } field("Country/Region Code"; Rec."Country/Region Code") { ApplicationArea = Basic, Suite; ToolTip = 'Specifies the country/region of the address.'; trigger OnValidate() begin IsCountyVisible := FormatAddress.UseCounty("Country/Region Code"); end; } field(City; City) { ApplicationArea = Basic, Suite; ToolTip = 'Specifies the customer''s city.'; } group(Control10) { ShowCaption = false; Visible = IsCountyVisible; field(County; County) { ApplicationArea = Basic, Suite; ToolTip = 'Specifies the state, province or county as a part of the address.'; } } field("Post Code"; Rec."Post Code") { ApplicationArea = Basic, Suite; Importance = Promoted; ToolTip = 'Specifies the postal code.'; } } .. usercontrol("bdev.Address Prediction Control"; "bdev.Address Autocomplete") { ApplicationArea = All; trigger OnControlReady() begin AddressPrediction.OnControlAddInReady(Rec.RecordId().TableNo(), CurrPage."bdev.Address Prediction Control"); end; trigger GetAddressPredictions(fieldName: Text; input: Text) begin AddressPrediction.GetAddressPredictions(fieldName, input, CurrPage."bdev.Address Prediction Control"); end; trigger OnPredictionSelected(fieldName: Text; id: Text) var address: Dictionary of [Text, Text]; begin if (not AddressPrediction.GetSelectedAddressPrediction(address, AddressPrediction.GetAddressType(fieldName), id)) then exit; ApplyAddress(address); end; } } } trigger OnOpenPage() begin AddressPrediction.InitializeAddressPrediction(); end; trigger OnNewRecord(BelowxRec: Boolean) begin BindAddressPreditionFields(); end; trigger OnAfterGetRecord() begin BindAddressPreditionFields(); end; local procedure BindAddressPreditionFields() var fieldNames: Dictionary of [Text, Enum "bdev.Address Prediction Type"]; begin // bind "Name" field and look up for establishments (companies) while typing. fieldNames.Add(Rec.FieldName(Name), Enum::"bdev.Address Prediction Type"::Establishment); // bind "Address" field and look up for address while typing. fieldNames.Add(Rec.FieldName(Address), Enum::"bdev.Address Prediction Type"::Address); // perform binding in Control Add-In AddressPrediction.BindAddressPrediction(fieldNames, CurrPage."bdev.Address Prediction Control"); end; var AddressPrediction: Codeunit "bdev.Address Prediction API";}
Additionally, for custom entities only, you need to subscribe to the OnIsAddressPredictionEnabledForTableNo(Integer, Boolean) event, to enable execution for custom table nos.
Code
codeunit 50000 "My Event Subscriber" { .. [EventSubscriber(ObjectType::Codeunit, Codeunit::"bdev.Address Prediction API", 'OnIsAddressPredictionEnabledForTableNo', '', true, true)] local procedure EnableMyTableOnIsAddressPredictionEnabledForTableNo(tableNo: Integer; var enabled: Boolean) begin enabled := (tableNo = Database::"My Table"); end; ..}