Brad
Brad

Reputation: 1369

Create a Non-Database-Driven Lookup

Lots of references for creating lookups out there, but all seem to draw their values from a query.

I want to add a lookup to a field that will add items from a list of values that do not come from a table, query, or any other data source.

Such as from a string: "Bananas, Apples, Oranges" ..or a container ["Bananas", "Apples", "Oranges"]

Assume the string/container is a dynamic object. Drawing from an static enum is not a choice.

Is there a way to create lookups on the fly from something other than a data source?

Example code would be a great help, but I'll take hints as well.

Upvotes: 3

Views: 4021

Answers (5)

Brad
Brad

Reputation: 1369

It isn't the most graceful solution, but this does work, and it doesn't override or modify any native AX 2012 objects:

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.

Create this class method:

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

In the lookup method for your string control, use:

public void lookup()
{
List    valueList = new List(Types::String);
;

...build your valueList here...

MyClass::lookupList(this, valueList, "List Title");

super();
}

Upvotes: 0

vukis
vukis

Reputation: 381

Example from 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;
}

Upvotes: 0

user3226663
user3226663

Reputation: 137

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

The above code helps in displaying strings as lookup.

Upvotes: 1

Jan B. Kjeldsen
Jan B. Kjeldsen

Reputation: 18051

There is the color picker.

Also in the Global you will find pickXxxx such as pickList. There are others, pickUser, pickUserGroup etc.

Take a look on the implementation. I guess they build a temporary table then displays that. Tables are great!

Update:

To go on you own follow the rules.

For the advanced user, see also: Lookup form returning more than one value.

Upvotes: 2

Smur
Smur

Reputation: 3113

I'm also guessing there's no way to perform a lookup without a table. I say that because a lookup is simply a form with one or more datasources that is displayed in a different way.

I've also blogged about this, so you can get some info on how to perform a lookup, even with a temporary table, here:

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

Upvotes: 0

Related Questions