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.
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));
}
}