Here is my complete code.
internal final class xxx_milkconsumptionreportuibuilder extends srsreportdatacontractuibuilder
{
xxx_milkconsumptionreportcontract contract;
dialogfield dialogmainitemid;
dialogfield dialogbomitemid;
systablelookup sys;
container mainidselectedfields;
list mainidlist = new list(types::string);
public void build()
{
contract = this.datacontractobject();
dialogmainitemid = this.adddialogfield(methodstr(xxx_milkconsumptionreportcontract, parmmainitemid), contract);
dialogbomitemid = this.adddialogfield(methodstr(xxx_milkconsumptionreportcontract, parmbomitemid), contract);
}
public void postbuild()
{
super();
contract = this.datacontractobject();
dialogmainitemid = this.bindinfo().getdialogfield(contract, methodstr(xxx_milkconsumptionreportcontract, parmmainitemid));
dialogbomitemid = this.bindinfo().getdialogfield(contract, methodstr(xxx_milkconsumptionreportcontract, parmbomitemid));
dialogmainitemid.lookupbutton(formlookupbutton::always);
dialogbomitemid.lookupbutton(formlookupbutton::always);
}
public void mainitemidlookup()
{
query query = new query();
querybuilddatasource qbdsinventtable = query.adddatasource(tablenum(inventtable));
querybuilddatasource qbdsecoresproducttranslation = qbdsinventtable.adddatasource(tablenum(ecoresproducttranslation));
qbdsecoresproducttranslation.addlink(fieldnum(inventtable, product), fieldnum(ecoresproducttranslation, product));
qbdsinventtable.fields().addfield(fieldnum(inventtable, itemid));
qbdsecoresproducttranslation.fields().addfield(fieldnum(ecoresproducttranslation, name));
container selectedfields = [tablenum(inventtable), fieldnum(inventtable, itemid)];
syslookupmultiselectctrl multiselectctrl = syslookupmultiselectctrl::constructwithquery(this.dialog().dialogform().formrun(), dialogmainitemid.control(), query, false, selectedfields);
container selectedvalues = multiselectctrl.get();
for (int i = 1; i <= conlen(selectedvalues); i++)
{
mainidlist.addend(conpeek(selectedvalues, i));
}
info(strfmt("%1,%2", con2str(selectedvalues), mainidlist.getenumerator()));
}
private void bomitemidlookup()
{
xxx_cuonsumptionreportloweritemlookup lowerlookuptemp;
delete_from lowerlookuptemp;
listenumerator le = mainidlist.getenumerator();
while (le.movenext())
{
this.itemexplode(le.current());
}
query query = new query();
querybuilddatasource qbds = query.adddatasource(tablenum(xxx_cuonsumptionreportloweritemlookup));
qbds.fields().addfield(fieldnum(xxx_cuonsumptionreportloweritemlookup, combinationfield));
qbds.fields().addfield(fieldnum(xxx_cuonsumptionreportloweritemlookup, itemname));
container selectedfields = [tablenum(xxx_milkconsumptionreporttemp), fieldnum(xxx_cuonsumptionreportloweritemlookup, combinationfield)];
syslookupmultiselectctrl::constructwithquery(this.dialog().dialogform().formrun(), dialogbomitemid.control(), query, false, selectedfields);
}
private boolean haschild(itemid _itemid)
{
bomversion bomversion;
select firstonly * from bomversion
where bomversion.itemid == _itemid
&& bomversion.active
&& bomversion.fromdate <= systemdateget()
&& (!bomversion.todate || bomversion.todate >= systemdateget());
return (bomversion.recid != 0);
}
public void itemexplode(itemid _itemid)
{
bomversion bomversion;
bom bom;
inventtable inventtable;
select firstonly * from bomversion
where bomversion.itemid == _itemid
&& bomversion.active
&& bomversion.fromdate <= systemdateget()
&& (!bomversion.todate || bomversion.todate >= systemdateget());
if (!bomversion)
return;
while select * from bom
where bom.bomid == bomversion.bomid
join inventtable
where inventtable.itemid == bom.itemid
{
xxx_cuonsumptionreportloweritemlookup lowerlookuptemp;
lowerlookuptemp.clear();
lowerlookuptemp.combinationfield = strfmt("%1 - %2", bom.itemid, _itemid);
lowerlookuptemp.itemid = bom.itemid;
lowerlookuptemp.itemname = inventtable.itemname();
lowerlookuptemp.mainitemid = _itemid;
lowerlookuptemp.insert();
if (this.haschild(bom.itemid))
{
this.itemexplode(bom.itemid);
}
}
}
public void postrun()
{
this.mainitemidlookup();
this.bomitemidlookup();
contract = this.datacontractobject();
}
}