创建非数据库驱动的查找

时间:2012-04-17 20:13:05

标签: containers lookup axapta x++ dynamics-ax-2012

很多用于创建查找的引用,但似乎都是从查询中提取它们的值。

我想在一个字段中添加一个查找,该字段将添加来自不是来自表,查询或任何其他数据源的值列表中的项目。

例如从一个字符串:“香蕉,苹果,橘子” ..或容器[“香蕉”,“苹果”,“橘子”]

假设字符串/容器是动态对象。从静态枚举中抽取不是一种选择。

有没有办法从数据源以外的地方动态创建查找?

示例代码将是一个很大的帮助,但我也会提示。

5 个答案:

答案 0 :(得分:2)

color picker

同样在Global中,您会找到pickXxxx,例如pickList。 还有其他人,pickUserpickUserGroup等。

看看实施情况。我猜他们会构建一个临时表然后显示它。桌很棒!

更新

继续拥有follow the rules

对于高级用户,另请参阅:Lookup form returning more than one value

答案 1 :(得分:1)

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();
}

上面的代码有助于将字符串显示为查找。

答案 2 :(得分:0)

我也猜测没有桌子就无法进行查找。我这样说是因为查找只是一个包含一个或多个数据源的表单,以不同的方式显示。

我也在博客上写过这篇文章,所以你可以获得一些关于如何执行查找的信息,即使是使用临时表,这里:

http://devexpp.blogspot.com.br/2012/02/dynamics-ax-custom-lookup.html

答案 3 :(得分:0)

这不是最优雅的解决方案,但这确实有效,并且它不会覆盖或修改任何本机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();
}

答案 4 :(得分:0)

来自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;
}