Passing parameters to another form and open it in Edit mode
Below code can be used to pass one parameter from one form to another and open that form in Edit mode. FormRun formRun; Args args; str defaultFormOnTable; MenuFunction menuFunction; args = new Args(); args.record(CustTable::find(‘test account’)); menuFunction = new MenuFunction(menuitemDisplayStr(CustTable), MenuItemType::Display); if(menuFunction) { menuFunction.openMode(OpenMode::Edit); formRun = menuFunction.create(args); if(formRun) formRun.run(); } In this example I opened customers form in Edit mode by passing customer account ‘test account’as a parameter.
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.
Random number generation through X++
AX has buit-in functionality to generate random numbers. You can use Random class (a kernel class, not visible in AOT) for this purpose. There are two more ways to generate random number in X++ One is using RandomGenerate Class which extends Random class and generates values within specified range; Second is using xGlobal::randomPositiveInt32() method. Example using Random class to generate random numbers (All in CAPITAL letters) public str generateRandomCode() { str pass=”; int length, counter, randInt,randAscii; ; length = 4; for(counter = 1; counter <= length; counter++) { randInt = Random.nextInt(); randAscii = randInt mod 91; if((randAscii >= 48 && randAscii <= 57) || (randAscii >= 65 && randAscii <= 90)) { pass += num2char(randAscii); continue; } else { randAscii = randAscii mod 26 ; randAscii += 65 ; pass += num2char(randAscii); continue; } } return pass; }