The picture style of the drop-down box loaded using the SysMultiTableLookup class is different from the picture style of the drop-down box loaded using the system standard SysTableLookup. How can I set it to be consistent with the picture style loaded by SysTableLookup
SysMultiTableLookup isn’t a standard class. Can you show us your code, please?
the following code?
public void lookup()
{
Query query = new Query();
QueryBuildDataSource qbds_Cust,qbds_Name;
Test1 sysTableLookup;
;
qbds_Cust = query.addDataSource(tableNum(CustTable));
qbds_Name = qbds_Cust.addDataSource(tableNum(DirPartyTable));
qbds_Name.joinMode(JoinMode::OuterJoin);
qbds_Name.relations(true);
sysTableLookup = Test1::newParameters(this, query);
sysTableLookup.addLookupField(fieldNum(CustTable, AccountNum));
sysTableLookup.addLookupField(fieldNum(DirPartyTable, Name), 2);
sysTableLookup.performFormLookup();
}
No, that’s a lookup method, not your SysMultiTableLookup class. You don’t even use SysMultiTableLookup in this code, but maybe Test1 class is the same thing that you called SysMultiTableLookup in your question.
Below is my code,I used the name Test1 instead of SysMultiTableLookup
class Test1
{
container lookupItems;
Query query;
int controlIdx;
Common tmpBuffer;
str labels[];
FormControl callingControl;
fieldId lookupField;
boolean useLookupValue;
protected void addFilter(FormRun formRun)
{
FormDataSource formDataSource = formRun.dataSource();
QueryBuildRange queryBuildRange;
FormStringControl callingStringControl;
FormStringControl selectControl;
fieldId selectFieldId;
str callingValue;
;
if (!callingControl || !callingControl.hasChanged())
return;
switch (callingControl.handle())
{
case classnum(FormStringControl):
callingStringControl = callingControl;
if (controlIdx && callingStringControl.text())
{
selectControl = formRun.control(controlIdx);
selectFieldId = selectControl.dataField();
if (selectFieldId)
{
callingValue = callingStringControl.text();
if (strfind(callingValue, '*', 1, 999))
{
queryBuildRange = formDataSource.query().dataSourceNo(1).addRange(selectFieldId);
queryBuildRange.value(callingValue);
}
}
}
break;
}
}
void addLookupControl(int _dataSourceNo, fieldId _fieldId, boolean _returnItem, str _methodName, str _label)
{
lookupItems += [[_dataSourceNo, _fieldId, _returnItem, _methodName]];
if (_label)
this.setLabel(_label);
}
void addLookupField(fieldId _fieldId, int _dataSourceNo = 1, boolean _returnItem = false, str _label = '')
{
;
if (_dataSourceNo > query.dataSourceCount())
throw error(Error::wrongUseOfFunction(funcName()));
this.addLookupControl(_dataSourceNo, _fieldId, _returnItem, '', _label);
}
// this method should not be called before the actually lookup column has been added
void addLookupMethod(str _method, int _dataSourceNo = 1, str _label = '')
{
;
this.addLookupControl(_dataSourceNo, 0, false, _method, _label);
}
protected FormBuildControl addMethodControl(FormBuildGridControl _formBuildGridControl, FormBuildDataSource _formBuildDataSource, str _method, int _labelIdx)
{
DictMethod dictMethod = new DictMethod(UtilElementType::TableInstanceMethod, _formBuildDataSource.table(), _method);
int extendedTypeId;
int returnId;
Types returnType;
SysDictType sysDictType;
FormBuildControl addStandardControl(FormControlType _formControlType)
{
Object obj;
FormBuildControl ret;
;
obj = _formBuildGridControl.addControl(_formControlType, _method);
obj.dataSource(_formBuildDataSource.id());
obj.dataMethod(_method);
if (labels[_labelIdx])
{
obj.label(labels[_labelIdx]);
}
ret = obj;
return ret;
}
;
if (!dictMethod)
return null;
returnType = dictMethod.returnType();
returnId = dictMethod.returnId();
if (returnType == Types::UserType) // EDT - find base type of EDT
{
extendedTypeId = returnId;
if (!extendedTypeId)
return null;
sysDictType = new SysDictType(extendedTypeId);
returnType = sysDictType.baseType();
}
if (returnType == Types::Enum)
{
if (returnId == enumnum(NoYes) ||
(sysDictType && sysDictType.enumId() == enumnum(NoYes)) ||
(returnId == enumNum(Boolean))) //Boolean should also be displayed as a checkbox
{
extendedTypeId = extendedTypeNum(NoYesId); // Simulate NoYesId to have it shown as checkbox
}
}
else if (returnType == Types::Integer)
{
if (sysDictType && Test1::isEqualOrExtending(sysDictType.id(), extendedTypeNum(timeOfDay)))
{
extendedTypeId = extendedTypeNum(timeOfDay);
}
}
return addStandardControl(this.types2ControlType(returnType, extendedTypeId));
}
protected FormBuildGridControl buildGrid(FormBuildGridControl _formBuildGridControl, Form _form)
{
FormBuildDataSource formBuildDataSource;
FormBuildControl formBuildControl;
Object obj;
boolean returnItem;
str method;
int fieldId;
int i;
boolean lookupFieldSet = false;
int dataSourceNo;
;
for (i = 1; i <= conlen(lookupItems); i++)
{
[dataSourceNo, fieldId, returnItem, method] = conpeek(lookupItems, i);
if (!method)
{
formBuildControl = _formBuildGridControl.addDataField(_form.dataSource(dataSourceNo).id(), fieldId);
if (labels[i])
{
obj = formBuildControl;
obj.label(labels[i]);
}
}
else
{
formBuildControl = this.addMethodControl(_formBuildGridControl, _form.dataSource(dataSourceNo), method, i);
}
if(!formBuildControl)
throw error("@SYS72176");
if (!lookupFieldSet || returnItem)
{
controlIdx = formBuildControl.id();
lookupField = fieldId;
lookupFieldSet = true;
}
}
return _formBuildGridControl;
}
protected void buildSelectionList(Query _query)
{
boolean returnItem;
str method;
int fieldId;
int i;
int dataSourceNo;
SelectionField fieldKind()
{
int j;
QueryBuildFieldList qbfl;
;
qbfl = _query.dataSourceNo(dataSourceNo).fields();
for (j = 1; j <= qbfl.fieldCount(); j++)
{
if (qbfl.field(j) == fieldId)
{
return qbfl.fieldKind(j);
}
}
return SelectionField::Database;
}
;
// Test that all are fields (no methods)
// If at least 1 method is present, it is too risky to build a selection field list
for (i = 1; i <= conlen(lookupItems); i++)
{
[dataSourceNo, fieldId, returnItem, method] = conpeek(lookupItems, i);
if (method)
{
return;
}
}
for (i = 1; i <= conlen(lookupItems); i++)
{
[dataSourceNo, fieldId, returnItem, method] = conpeek(lookupItems, i);
_query.dataSourceNo(dataSourceNo).addSelectionField(fieldId, fieldKind());
}
}
// This is a framework class.
//class Test1
//{
//}
protected FormRun formRun()
{
Form form = new Form();
FormRun formRun;
FormBuildDesign formBuildDesign;
FormBuildDataSource formBuildDataSource;
FormDataSource formDataSource;
FormBuildGridControl formBuildGridControl;
FormGridControl formGridControl;
FormStringControl callingStringControl;
QueryBuildDataSource queryBuildDataSource;
Args args;
int idx;
int i;
;
form.name(identifierstr(TemporaryFormName));
for (i = 1; i <= query.dataSourceCount(); i++)
{
queryBuildDataSource = query.dataSourceNo(i);
formBuildDataSource = form.addDataSource(queryBuildDataSource.name());
formBuildDataSource.table(queryBuildDataSource.table());
formBuildDataSource.autoQuery(true);
if (queryBuildDataSource.embedded()) //joined() or level() > 1
{
formBuildDataSource.linkType(this.joinMode2LinkType(queryBuildDataSource.joinMode()));
formBuildDataSource.joinSource(queryBuildDataSource.parentDataSource().name());
}
formBuildDataSource.allowCreate(false);
formBuildDataSource.allowDelete(false);
formBuildDataSource.allowEdit(false);
formBuildDataSource.allowCheck(false);
}
formBuildDesign = form.addDesign('Design');
formBuildDesign.mode(FormMode::Watch);
formBuildDesign.frame(FormFrame::Border);
formBuildDesign.hideIfEmpty(false);
formBuildDesign.hideToolbar(false);
formBuildDesign.top(15);
formBuildDesign.topMargin(2);
formBuildDesign.left(15);
formBuildDesign.leftMargin(0);
formBuildDesign.rightMargin(0);
formBuildDesign.bottomMargin(0);
//DZJ
formBuildDesign.showDeleteButton(NoYes::No);
formBuildDesign.showNewButton(NoYes::No);
formBuildDesign.viewEditMode(viewEditMode::View);
formBuildGridControl = formBuildDesign.addControl(FormControlType::Grid,'Grid');
formBuildGridControl.dataSource(query.dataSourceNo(1).name());
formBuildGridControl.allowEdit(true);
formBuildGridControl.showRowLabels(false);
idx = formBuildGridControl.id();
this.buildGrid(formBuildGridControl, form);
args = new Args();
args.object(form);
if(useLookupValue && !tmpBuffer) //highlighting existing value doesn't work with temp tables
{
args.lookupField(lookupField);
switch (callingControl.handle())
{
case classnum(FormStringControl):
callingStringControl = callingControl;
args.lookupValue(callingStringControl.text());
break;
}
}
formRun = classfactory.formRunClass(args);
form = formRun.form();
formRun.init();
formDataSource = formRun.dataSource(1);
formGridControl = formRun.control(idx);
formGridControl.setFocus();
formRun.selectMode(formRun.control(controlIdx));
if (query)
{
formDataSource.query(query);
}
if (tmpBuffer)
{
if (query.dataSourceCount() > 1)
throw error("Multiple temporary datasource lookups are not supported");
formDataSource.init();
//BP deviation documented
formDataSource.cursor().setTmp(); // if using non-temp table in tmp mode
formDataSource.cursor().setTmpData(tmpBuffer);
}
this.buildSelectionList(formDataSource.query());
formRun.selectMode(formRun.control(controlIdx));
this.addFilter(formRun);
return formRun;
}
FormLinkType joinMode2LinkType(JoinMode _joinMode)
{
switch (_joinMode)
{
case JoinMode::InnerJoin:
return FormLinkType::InnerJoin;
case JoinMode::OuterJoin:
return FormLinkType::OuterJoin;
case JoinMode::ExistsJoin:
return FormLinkType::ExistJoin;
case JoinMode::NoExistsJoin:
return FormLinkType::NotExistJoin;
}
throw error(Error::wrongUseOfFunction(funcName()));
}
FormControl parmCallingControl(FormControl _callingControl = callingControl)
{
;
callingControl = _callingControl;
return callingControl;
}
Query parmQuery(Query _query = query)
{
;
query = _query;
return query;
}
Common parmTmpBuffer(Common _buffer = tmpBuffer)
{
;
tmpBuffer = _buffer;
return tmpBuffer;
}
boolean parmUseLookupValue(boolean _useLookupValue = useLookupValue)
{
;
useLookupValue = _useLookupValue;
return useLookupValue;
}
void performFormLookup()
{
#AOT
FormStringControl callingStringControl;
FormIntControl callingIntControl;
#if.ReferencesPath
FormInt64Control callingInt64Control;
#endif
FormDateControl callingDateControl;
;
if (!callingControl)
throw(error(Error::wrongUseOfFunction(funcname())));
switch (callingControl.handle())
{
case classnum(FormStringControl):
callingStringControl = callingControl;
callingStringControl.performFormLookup(this.formRun());
break;
case classnum(FormIntControl):
callingIntControl = callingControl;
callingIntControl.performFormLookup(this.formRun());
break;
#if.ReferencesPath
case classnum(FormInt64Control):
callingInt64Control = callingControl;
callingInt64Control.performFormLookup(this.formRun());
break;
#endif
case classnum(FormDateControl):
callingDateControl = callingControl;
callingDateControl.performFormLookup(this.formRun());
break;
}
}
void setLabel(str label)
{
labels[conlen(lookupItems)] = label;
}
FormControlType types2ControlType(Types _returnType, UtilElementId _Id)
{
#AOT
switch(_returnType)
{
case Types::String:
return FormControlType::String;
case Types::Real:
return FormControlType::Real;
case Types::Date:
return FormControlType::Date;
#if.ServicesPath
case Types::UtcDateTime:
return FormControlType::DateTime;
#endif
case Types::Integer:
if (_id && Global::isType(_id, extendedTypeNum(timeOfDay)))
return FormControlType::Time;
return FormControlType::Integer;
#if.ReferencesPath
case Types::Int64:
return FormControlType::Int64;
case Types::Guid:
return FormControlType::Guid;
#endif
case Types::Enum:
if (_id && Global::isType(_id, extendedTypeNum(NoYesId)))
return FormControlType::CheckBox;
return FormControlType::ComboBox;
}
throw error(strfmt("@SYS110310", _returnType));
}
static Test1 construct()
{
return new Test1();
}
/// <summary>
/// Simulates the code that is performed in the kernel to allow
/// filtering to work properly in custom lookup forms.
/// </summary>
/// <param name="_isFiltered">
/// The result value from the FilterLookupPreRun method.
/// </param>
/// <param name="_filterString">
/// The filter string contained within the lookup control.
/// </param>
/// <param name="_controlToFilter">
/// The control on the lookup form that is bound to the field to filter the value on.
/// </param>
/// <param name="_formDataSource">
/// The FormDataSource value on the lookup form.
/// </param>
/// <remarks>
/// This method should be called after the super call in the custom lookup
/// form's run method.
/// </remarks>
public static void filterLookupPostRun(boolean _isFiltered,
str _filterString,
FormStringControl _controlToFilter,
FormDataSource _formDataSource)
{
;
if (_isFiltered)
{
//The FormDataSource doesn't have a QueryRun since AutoSearch is false
//Therefore we need to create one so that the filter call below will succeed.
_formDataSource.queryRun(new SysQueryRun(_formDataSource.query()));
_controlToFilter.filter(_filterString);
}
}
/// <summary>
/// This method simulates the code that is performed in the kernel to allow
/// filtering to work properly in custom lookup Forms.
/// </summary>
/// <param name="_lookupControl">
/// The control that contains the field value being looked up.
/// </param>
/// <param name="_controlToFilter">
/// The control on the Lookup Form that is bound to the field to filter the value on.
/// </param>
/// <param name="_formDataSource">
/// The FormDataSource on the Lookup Form.
/// </param>
/// <param name="_listExtraFormDataSources">
/// The list of additional FormDataSource objects on the Lookup Form
/// where the autoSearch parameter should be set to false in case of filtering.
/// </param>
/// <returns>
/// Whether the value in the control contains a value that should be filtered on.
/// </returns>
/// <remarks>
/// This method should be called before the Super method call in the custom Lookup
/// form's run method.
/// </remarks>
public static boolean filterLookupPreRun(FormStringControl _lookupControl,
FormStringControl _controlToFilter,
FormDataSource _formDataSource,
List _listExtraFormDataSources = null)
{
boolean isFiltered = false;
str controlText = _lookupControl.text();
str filterValue = strkeep(controlText, '*');
ListEnumerator listEnumerator;
FormDataSource extraFormDataSource;
;
if (strlen(filterValue) != 0 && _lookupControl.hasChanged())
{
_formDataSource.autoSearch(false);
if(_listExtraFormDataSources)
{
listEnumerator = _listExtraFormDataSources.getEnumerator();
while(listEnumerator && listEnumerator.moveNext())
{
extraFormDataSource = listEnumerator.current();
if(extraFormDataSource)
{
extraFormDataSource.autoSearch(false);
}
}
}
isFiltered = true;
}
else
{
if(_controlToFilter)
{
_formDataSource.formRun().args().lookupField(_controlToFilter.dataField());
_formDataSource.formRun().args().lookupValue(controlText);
}
}
return isFiltered;
}
/// <summary>
/// This method simulates the code that is performed in the kernel to allow
/// filtering to work properly in custom lookup forms with two data sources.
/// </summary>
/// <param name="_lookupControl">
/// The control that contains the field value being looked up.
/// </param>
/// <param name="_controlToFilter">
/// The control on the lookup form that is bound to the field to filter the value on.
/// </param>
/// <param name="_formDataSource">
/// The first FormDataSource value on the lookup form.
/// </param>
/// <param name="_formDataSource2">
/// The second FormDataSource value on the lookup form
/// where the autoSearch parameter should be set to false in case of filtering.
/// </param>
/// <returns>
/// Whether the value in the control contains a value that should be filtered on.
/// </returns>
/// <remarks>
/// This method should be called before the Super method call in the custom lookup
/// form's run method.
/// </remarks>
public static boolean filterLookupPreRun_2DS(FormStringControl _lookupControl,
FormStringControl _controlToFilter,
FormDataSource _formDataSource,
FormDataSource _formDataSource2)
{
List listExtraFormDataSources = new List(Types::Class);
;
listExtraFormDataSources.addEnd(_formDataSource2);
return Test1::filterLookupPreRun(_lookupControl, _controlToFilter, _formDataSource, listExtraFormDataSources);
}
/// <summary>
/// This method simulates the code that is performed in the kernel to allow
/// filtering to work properly in custom lookup forms with three data sources.
/// </summary>
/// <param name="_lookupControl">
/// The control that contains the field value being looked up.
/// </param>
/// <param name="_controlToFilter">
/// The control on the lookup form that is bound to the field to filter the value on.
/// </param>
/// <param name="_formDataSource">
/// The first FormDataSource value on the lookup form.
/// </param>
/// <param name="_formDataSource2">
/// The second FormDataSource value on the lookup form.
/// </param>
/// <param name="_formDataSource3">
/// The third FormDataSource value on the lookup form
/// where the autoSearch parameter should be set to false in case of filtering.
/// </param>
/// <returns>
/// Whether the value in the control contains a value that should be filtered on.
/// </returns>
/// <remarks>
/// This method should be called before the Super method call in the custom lookup
/// form's run method.
/// </remarks>
public static boolean filterLookupPreRun_3DS(FormStringControl _lookupControl,
FormStringControl _controlToFilter,
FormDataSource _formDataSource,
FormDataSource _formDataSource2,
FormDataSource _formDataSource3)
{
List listExtraFormDataSources = new List(Types::Class);
;
listExtraFormDataSources.addEnd(_formDataSource2);
listExtraFormDataSources.addEnd(_formDataSource3);
return Test1::filterLookupPreRun(_lookupControl, _controlToFilter,
_formDataSource, listExtraFormDataSources);
}
client static FormStringControl getCallerStringControl(Args args, boolean throwOnError = true)
{
FormStringControl callerControl;
FormRun caller;
;
if (args && args.caller())
{
if(args.caller().handle() == classnum(FormStringControl))
{
// When constructed from code the control must be inserted in the args.caller()
callerControl = args.caller();
}
else if (Test1::is(args.caller(),classnum(FormRun)))
{
// When the form is assigned on the extended data type the calling formRun is the caller.
caller = args.caller();
if (caller.selectedControl().handle() == classnum(FormStringControl))
callerControl = caller.selectedControl();
}
if (!callerControl)
{
// Test if it has been put in the parmObject object.
if (args.parmObject() && args.parmObject().handle() == classnum(FormStringControl))
callerControl = args.parmObject();
}
}
if (throwOnError && !callerControl)
throw(error(Error::wrongUseOfFunction(funcname())));
return callerControl;
}
public static boolean is(Object _class, classId _classId)
{
boolean ret = new SysDictClass(classidget(_class)).isImplementing(_classId);
if (!ret)
{
ret = SysDictClass::isEqualOrSuperclass(classidget(_class), _classId);
}
return ret;
}
//Method copied over from AX 2009 installation
static boolean isEqualOrExtending(extendedTypeId _id, extendedTypeId _potentialParentId)
{
SysDictType sysDictType;
;
if(_id == _potentialParentId)
{
return true;
}
sysDictType = new SysDictType(_id);
if (sysDictType)
{
return sysDictType.isExtending(_potentialParentId);
}
else
{
return false;
}
}
/// <summary>
/// This method is used in the custom lookup forms
/// to apply a filter on the new tab page when it is activated.
/// </summary>
/// <param name="_lookupControl">
/// The control that contains the field value being looked up.
/// </param>
/// <param name="_controlToFilter">
/// The control on the lookup form that is bound to the field to filter the value on.
/// </param>
/// <param name="_formDataSource">
/// The FormDataSource value on the lookup form.
/// </param>
/// <remarks>
/// Usually this method should be called from the tabChanged method of the tab control
/// on the form.
/// </remarks>
public static void lookupTabChanged(FormStringControl _lookupControl,
FormStringControl _controlToFilter,
FormDataSource _formDataSource)
{
boolean filterLookup;
;
filterLookup = Test1::filterLookupPreRun(_lookupControl, _controlToFilter, _formDataSource);
if(filterLookup)
{
Test1::filterLookupPostRun(filterLookup, _lookupControl.text(), _controlToFilter, _formDataSource);
}
else
{
_formDataSource.executeQuery();
}
}
static Test1 newParameters(FormControl callingControl, Query _query, boolean useLookupValue = true)
{
Test1 sysTableLookup = Test1::construct();
;
if (_query.dataSourceCount() < 1)
throw error(@"Query needs to be defined before building the lookup");
sysTableLookup.parmQuery(_query);
sysTableLookup.parmCallingControl(callingControl);
sysTableLookup.parmUseLookupValue(useLookupValue);
return sysTableLookup;
}
}
Focus on how you create the form, i.e. the formRun() method. Try formBuildDesign.windowType(FormWindowType::PopUp)
.
Thank you,It worked, solved my problem