I’m trying to make MultiSelectLookup Dialog to chose products/variants and insert the values from dialog in InventJournUpdateLines table. But after selection and pressing OK button I get the error
Field ‘Reference’ must be filled in.
The code of the dialog class:
class DialogAddNewLine extends RunBase
{
DialogRunbase dialog;
DialogGroup dialogGrp;
FormBuildStringControl fbsCtrlMultiSelect;
FormStringControl fsCtrlMultiSelect;
container returnIds;
InventJournNameId journNum;
ProductTypes productTypes;
SysLookupMultiSelectCtrl msCtrl;
/// <summary>
/// Returns the description from the current class by calling the static description method on the
/// class if there is one.
/// </summary>
/// <returns>
/// The description from the current class.
/// </returns>
/// <remarks>
/// This method can be overridden to give a more precise description, for example, when you need some
/// internal variables to build the description text.The static <c>RunBase::description </c> method is
/// generally used to obtain the description of a class because you do not have to instantiate the
/// class to call it. The method speeds up displaying the description in a grid, for example.
/// </remarks>
public ClassDescription caption()
{
return 'Select product';
}
/// <summary>
/// Returns a class that contains the methods that are described by the <c>RunBaseDialogable</c>
/// interface.
/// </summary>
/// <returns>
/// A class that contains the methods that are described by the <c>RunBaseDialogable</c> interface.
/// </returns>
/// <remarks>
/// A dialog can be either built by using the <c>Dialog</c> class or by using a class that is created
/// in the Application Object Tree (AOT).
/// </remarks>
// Generate dialog
public Object dialog()
{
FormBuildControl setupGroupControl;
dialog = super();
dialog.alwaysOnTop(true);
dialog.windowType(FormWindowType::Standard);
dialogGrp = dialog.addGroup('Chose Product');
setupGroupControl = dialog.formBuildDesign().control(dialogGrp.formBuildGroup().id());
// Control with the MULTI-SELECT
fbsCtrlMultiSelect = setupGroupControl.addControl(FormControlType::String, identifierstr(FormStringControl1));
fbsCtrlMultiSelect.label('Select Item');
dialog.allowUpdateOnSelectCtrl(true);
this.dialogSelectCtrl();
return dialog;
}
public void dialogPostRun(DialogRunbase _dialog)
{
FormRun formRun;
super(dialog);
formRun = _dialog.dialogForm().formRun();
if (formRun)
{
fsCtrlMultiSelect = formRun.design().control(fbsCtrlMultiSelect.id());
Query query = new Query();
if (productTypes==ProductTypes::Product)
{
QueryBuildDataSource qbds = query.addDataSource(tableNum(EcoResProductMaster));
qbds.addSelectionField(fieldNum(EcoResProductMaster, DisplayProductNumber));
qbds.addSelectionField(fieldNum(EcoResProductMaster, SearchName));
}
else
{
QueryBuildDataSource qbds = query.addDataSource(tableNum(EcoResDistinctProductVariant));
qbds.addSelectionField(fieldNum(EcoResDistinctProductVariant, DisplayProductNumber));
qbds.addSelectionField(fieldNum(EcoResDistinctProductVariant, SearchName));
}
msCtrl = SysLookupMultiSelectCtrl::constructWithQuery(formRun, fsCtrlMultiSelect, query);
}
}
// Get input values
public boolean getFromDialog()
{
#Characters
// Return Ids from the mutli-select control
if (msCtrl)
returnIds = msCtrl.get();
// info('Control 1 - ' + con2StrUnlimited(returnIds,#SEMICOLON));
return true;
}
public void run()
{
int i;
RefRecId ecoResRecId;
InventJournUpdateLines lines;
for (i=1; i<=conLen(returnIds); i++)
{
ecoResRecId = conPeek(returnIds, i);
lines.clear();
lines.initValue();
lines.ProductLink = ecoResRecId;
lines.JournNum = journNum;
lines.insert();
}
}
public void parmInventJournNum(InventJournNum _inventJournNum)
{
journNum = _inventJournNum;
}
static void main(Args _args)
{
FormDataSource fds;
Common record;
DialogAddNewLine d = new DialogAddNewLine();
if(!_args || !_args.record() || _args.dataset()!=tableNum(InventJournUpdateHeader))
{
throw error("Incorect parameter");
}
d.parmInventJournNum(_args.record().(fieldNum(InventJournUpdateHeader, JournNum)));
if (d.prompt())
{
d.runOperation();
record = _args.record();
fds = record.DataSource();
fds.executeQuery();
}
}
protected boolean canRunInNewSession()
{
return false;
}
}