Monday, February 16, 2015

How to validate Email and URL through X++

With default functionality in AX, Email address and URL can be of any format and these do not get validated as per their respective correct formats.

Existing functionality

Accounts receivable | Common/Customers | All customers | Customer form | Under Contact information fast tab



Someone can put Email address in any format as I did "faisal" which is not a correct format of email address. Same applies for URL under contact information for customers.

Customized functionality

I created a new class with two static methods to validate these attributes as follows by taking concept from this blog post

/// <summary>
///    Class to validate Logistics Electronic Address using Regex
/// </summary>
class LogiscticsElectronicAddressValidator
{
} 
/// <summary>
///    This method accepts a EMail and validates this using REGEX
/// </summary>
/// <returns>
///    true or false based on Regex match
/// </returns>
Static Server boolean validateEMail(EMail    _eMail)
{
    Boolean   xppBool;
    System.Boolean netBool;
    Str MatchEmailPattern =
       @"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@"
     + @"((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?
       [0-9]{1,2}|25[0-5]|2[0-4][0-9])\."
     + @"([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?
       [0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|"     
     + @"([\w-]+\.)+[a-zA-Z]{2,4})$";
    System.Text.RegularExpressions.Match myMatch;
    ;

    new InteropPermission(InteropKind::ClrInterop).assert();
    myMatch = System.Text.RegularExpressions.Regex::Match(_eMail,MatchEmailPattern);
    netBool = myMatch.get_Success();
    xppBool = netBool;
    CodeAccessPermission::revertAssert();
    Return xppBool;
} 
/// <summary>
///    This method accepts a URL and validates this using REGEX
/// </summary>
/// <returns>
///    true or false based on Regex match
/// </returns>
Static Server boolean validateURL(URL    _url)
{
    Boolean   xppBool;
    System.Boolean netBool;
    Str matchURLPattern = "^(https?://)"
        + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //user@
        + @"(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP- 199.194.52.184
        + "|" // allows either IP or domain
        + @"([0-9a-z_!~*'()-]+\.)*" // tertiary domain(s)- www.
        + @"([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // second level domain
        + "[a-z]{2,6})" // first level domain- .com or .museum
        + "(:[0-9]{1,4})?" // port number- :80
        + "((/?)|" // a slash isn't required if there is no file name
        + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
    System.Text.RegularExpressions.Match myMatch;
    new InteropPermission(InteropKind::ClrInterop).assert();
    myMatch = System.Text.RegularExpressions.Regex::Match(_url,matchURLPattern);
    netBool = myMatch.get_Success();
    xppBool = netBool;
    CodeAccessPermission::revertAssert();
    Return xppBool;

}

To call these methods you need to override two methods (ModifiedField and ValidateField) in LogisticsElectronicAddress table.





After implementing this solution you will get error on entering invalid email and URL addresses.