有很多用于创建查找的参考资料,但似乎都是从查询中提取它们的值。
我想向一个字段添加一个查找,该字段将从不来自表、查询或任何其他数据源的值列表中添加项目。
例如来自字符串:“Bananas, Apples, Oranges” ..或容器 ["Bananas", "Apples", "Oranges"]
假设字符串/容器是一个动态对象。从静态枚举中提取不是一种选择。
有没有办法从数据源以外的东西动态创建查找?
示例代码会很有帮助,但我也会提供一些提示。
有很多用于创建查找的参考资料,但似乎都是从查询中提取它们的值。
我想向一个字段添加一个查找,该字段将从不来自表、查询或任何其他数据源的值列表中添加项目。
例如来自字符串:“Bananas, Apples, Oranges” ..或容器 ["Bananas", "Apples", "Oranges"]
假设字符串/容器是一个动态对象。从静态枚举中提取不是一种选择。
有没有办法从数据源以外的东西动态创建查找?
示例代码会很有帮助,但我也会提供一些提示。
public void lookup()
{
SysTableLookup sysTableLookup;
TmpTableFieldLookup tmpTableFieldLookup;
Enumerator en;
List entitylist = new list(types::String);
entitylist.addend("Banana");
entitylist.addend("Apple");
en = entityList.getEnumerator();
while (en.moveNext())
{
tmpTableFieldLookup.TableName = en.current();
tmpTableFieldLookup.insert();
}
sysTableLookup = SysTableLookup::newParameters(tableNum(tmpTableFieldLookup), this);
sysTableLookup.addLookupfield(fieldNum(TmpTableFieldLookup, TableName));
//BP Deviation documented
sysTableLookup.parmTmpBuffer(tmpTableFieldLookup);
sysTableLookup.performFormLookup();
}
上面的代码有助于将字符串显示为查找。
我也猜想没有表格就无法执行查找。我这么说是因为查找只是一种具有一个或多个以不同方式显示的数据源的表单。
我也写过关于这个的博客,所以你可以在这里获得一些关于如何执行查找的信息,即使是一个临时表:
http://devexpp.blogspot.com.br/2012/02/dynamics-ax-custom-lookup.html
这不是最优雅的解决方案,但这确实有效,并且不会覆盖或修改任何本机 AX 2012 对象:
Copy the sysLookup form from AX2009 (rename it) and import it into AX 2012.
We'll call mine myLookupFormCopy.
I did a find/replace of "sysLookup" in the XPO file to rename it.
创建此类方法:
public static client void lookupList(FormStringControl _formStringControl, List _valueList, str _columnLabel = '')
{
Args args;
FormRun formRun;
;
if (_formStringControl && _valueList && _valueList.typeId() == Types::String)
{
args = new Args(formstr(myLookupFormCopy));
args.parmObject(_valueList);
args.parm(_columnLabel);
formRun = classFactory.formRunClass(args);
_formStringControl.performFormLookup(formRun);
}
}
在字符串控件的查找方法中,使用:
public void lookup()
{
List valueList = new List(Types::String);
;
...build your valueList here...
MyClass::lookupList(this, valueList, "List Title");
super();
}
来自 global::PickEnumValue 的示例:
static int pickEnumValue(EnumId _enumId, boolean _omitZero = false)
{
Object formRun;
container names;
container values;
int i,value = -1,valueIndex;
str name;
#ResAppl
DictEnum dictEnum = new DictEnum(_enumId);
;
if (!dictEnum)
return -1;
for (i=1;i<=dictEnum.values();i++)
{
value = dictEnum.index2Value(i);
if (!(_omitZero && (value == 0)))
{
names += dictEnum.index2Label(i);
values += value;
}
}
formRun = classfactory.createPicklist();
formRun.init();
formRun.choices(names, #ImageClass);
formRun.caption(dictEnum.label());
formRun.run();
formRun.wait();
name = formRun.choice();
value = formRun.choiceInt();
if (value>=0) // the picklist form returns -1 if a choice has not been made
{
valueIndex = -1;
for (i=1;i<=conLen(names);i++)
{
if (name == conPeek(names,i))
{
valueIndex = i;
break;
}
}
if (valueIndex>=0)
return conPeek(values,valueIndex);
}
return value;
}