This is a small tutorial class on how to work with the new AX 2012 SysLookupMultiSelectCtrl class.
There are good examples on the internet as well as a tutorial class in AX 2012 itself but I want to explain how to pack/unpack values for this field and make it mandatory.
Let's say we need to select multiple sites in the dialog.
I hope my comments inline will be enough. If not let me know, please.
There are good examples on the internet as well as a tutorial class in AX 2012 itself but I want to explain how to pack/unpack values for this field and make it mandatory.
Let's say we need to select multiple sites in the dialog.
class tmxMultiSelectSiteTutorial extends RunBase
{
FormBuildStringControl fbscMultiSite;
FormStringControl fscMultiSite;
container siteIds;
str siteIdsStr;
SysLookupMultiSelectCtrl multiSiteCtrl;
DialogRunbase dialog;
#define.CurrentVersion(1)
#define.Version1(1)
#localmacro.CurrentList
siteIdsStr
#endmacro
}
protected Object dialog() { dialog = super(); // add a new form build control for multiple choice; string type fbscMultiSite = dialog.curFormGroup().addControl(FormControlType::String, identifierstr(AnyFormControlNameYouLike)); fbscMultiSite.label('Site'); return dialog; }
public void dialogPostRun(DialogRunbase _dialog) { FormRun formRun; super(dialog); formRun = _dialog.dialogForm().formRun(); if (formRun) { // to get the access to the form control we created on the dialog fscMultiSite = formRun.design().control(fbscMultiSite.id()); // create multiple loookup of SysLookupMultiSelectCtrl type // cgiInventSite query must exist in AOT; simply SiteId and Name from InventSite table multiSiteCtrl = SysLookupMultiSelectCtrl::construct(formRun, fscMultiSite, querystr(cgiInventSite)); // to underline it red; actually it does not validate; so check the Validate method multiSiteCtrl.setMandatory(true); // if we restored from last values if(siteIdsStr) { //then we convert the string to container siteIds = str2con(siteIdsStr); // after create the special container of SiteIds and Names multiSiteCtrl.set(this.siteIds2Names(siteIds)); } } }
public boolean getFromDialog() { if (multiSiteCtrl) { // selected sites convert to container of RecIds siteIds = multiSiteCtrl.get(); // convert it to string for pack/unpack siteIdsStr = con2Str(siteIds); } return super(); }
private container siteIds2Names(container _c) { InventSite inventSite; container contSiteId, contRecId; int i, cLen = conLen(_c); for (i = 1 ; i <= cLen ; i++) { inventSite = inventSite::findRecId(conPeek(_c, i)); // this part will be visible contSiteId += [inventSite.SiteId]; // this part will be used by SysLookupMultiSelectCtrl as invisible contRecId += [inventSite.RecId]; } return [contRecId, contSiteId]; }
public boolean validate(Object _calledFrom = null) { boolean ret; ret = super(_calledFrom); if(!conPeek(siteIds, 1)) { ret = checkFailed('Site must be selected!'); } return ret; }
public void run() { InventSite inventSite; int i; int conNum = conLen(siteIds); // any business logic for the selected sites for( i = 1; i<=conNum; i++) { inventSite = inventSite::findRecId(conPeek(siteIds, i)); info(strFmt("Site: %1 - %2", inventSite.SiteId, inventSite.Name)); } }
1 comment:
thanks. its really helpfull.
Post a Comment