First of all, let me refactor your code a bit, to make it easier to understand.
public void schemeLookup(FormStringControl _ctrl)
{
Query query = this.buildQuery(prmCustomerSchemeEntry.Scheme_Category, this.getUserRegionCode());
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(PRMSchemeTable), _ctrl);
sysTableLookup.addLookupField(fieldNum(PRMSchemeTable, SchemeCode));
sysTableLookup.addLookupField(fieldNum(PRMSchemeTable, Scheme_Category));
sysTableLookup.addLookupField(fieldNum(PrmRegionScheme, RegionCode));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
private str getUserRegionCode()
{
PRmRegion prmRegion;
PRMRegion_Branch prmRegionBranch;
PRMUserSetup prmUserSetup;
select firstonly RegionCode from prmRegion
exists join prmRegionBranch
where prmRegionBranch.Name == prmRegion.RegionName
exists join prmUserSetup
where prmUserSetup.InventSiteId == prmRegionBranch.Code
&& prmUserSetup.UserId == curUserId();
return prmRegion.RegionCode;
}
private Query buildQuery(str _schemeCategory, str _userRegionCode)
{
Query query = new Query();
QueryBuildDataSource qbdsScheme = query.addDataSource(tableNum(PRMSchemeTable));
QueryBuildDataSource qbdsRegion = qbdsScheme.addDataSource(tableNum(PrmRegionScheme));
qbdsRegion.joinMode(JoinMode::OuterJoin);
qbdsRegion.relations(false);
qbdsRegion.addLink(fieldNum(PrmRegionScheme, SchemeCode), fieldNum(PRMSchemeTable, SchemeCode));
qbdsScheme.addRange(fieldNum(PRMSchemeTable, Scheme_Category)).value(queryValue(_schemeCategory));
qbdsScheme.addRange(fieldNum(PRMSchemeTable, SchemeStatus)).value(queryValue(PrmSchemeStatus::Release));
qbdsRegion.addRange(fieldNum(PrmRegionScheme, RegionCode)).value(SysQuery::valueEmptyString());
if (_userRegionCode)
{
qbdsRegion.addRange(fieldNum(PrmRegionScheme, RegionCode)).value(queryValue(_userRegionCode));
}
QueryBuildDataSource qbdsExclude = qbdsScheme.addDataSource(tableNum(PrmRegionScheme));
qbdsExclude.joinMode(JoinMode::NoExistsJoin);
qbdsExclude.relations(false);
qbdsExclude.addLink(fieldNum(PrmRegionScheme, SchemeCode), fieldNum(PRMSchemeTable, SchemeCode));
qbdsExclude.addRange(fieldNum(PrmRegionScheme, RegionCode))
.value(SysQuery::valueNot(_userRegionCode) + " && " + SysQuery::valueNot(SysQuery::valueEmptyString()));
}
Do I understand correctly that you have a problem with the point "Multi-Region Schemes → If a scheme is assigned to multiple regions, it should be visible for its assigned regions only"?