2012-04-17 2 views
3

Множество ссылок для создания поисковых запросов там, но все, кажется, рисуют свои значения из запроса.Создайте поиск без базы данных

Я хочу добавить поиск в поле, которое будет добавлять элементы из списка значений, которые не поступают из таблицы, запроса или любого другого источника данных.

Такие, как из строки: «бананы, яблоки, апельсины» ..or контейнере [ «Бананы», «Яблоки», «Апельсины»]

Предположим, строка/контейнер представляет собой динамический объект. Рисование из статического перечисления не является выбором.

Есть ли способ создать поиск на лету от чего-то другого, кроме источника данных?

Пример кода был бы большой помощью, но я также возьму подсказки.

+2

Иногда вы должны сделать анализ затрат и выгод, чтобы определить, является ли это стоит. Я действительно верю, что есть способ сделать это - старый метод sysLookup от AX2009 поддерживал создание списков «на лету».Я подозреваю, что можно было просто импортировать старый метод, если они были так склонны. Я, однако, просто поместил свои данные в таблицу. У меня нет времени больше бороться с этим. – Brad

+0

К счастью, таблицы легко создавать в AX. Вероятно, поэтому больше 4000. Никакой код не нужен! –

+0

Однако, в интересах сообщества, я думаю, что мы должны продолжить продолжение этого обсуждения либо в результате либо «это невозможно», либо образец рабочего кода. – Brad

ответ

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

Вместо этого вы могли бы использовать 'global :: pickList', если бы согласились, что он сортирует ключ. Это действительно плохое имя! 'picMap' будет намного лучше! –

+0

@Brad где получить «ScanWorkX_Lookup @ from ??? –

+0

Изменено сообщение, чтобы объяснить, что лучше. Это относится к имени копии формы sysLookup, созданной на первом шаге. – Brad

2

Существует color picker.

Также в Global вы найдете pickXxxx, например pickList. Есть и другие, pickUser, pickUserGroup и т.д.

Посмотрите на реализацию. Я предполагаю, что они создают временную таблицу, а затем отображает это. Столы большие!

Update:

Пойти на вас есть follow the rules.

Для опытного пользователя см. Также: Lookup form returning more than one value.

0

Я также предполагаю, что нет способа выполнить поиск без таблицы. Я говорю это потому, что поиск - это просто форма с одним или несколькими источниками данных, которые отображаются по-другому.

Я также писал о этом, так что вы можете получить некоторую информацию о том, как выполнить поиск, даже с временным столом, здесь:

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

+0

Вы ошибаетесь, вам нужно только указать возвращаемое управление в методе 'selectMode'. Этот элемент управления может быть невидимым. –

+0

@ JanB.Kjeldsen Итак, вы говорите, что мы можем выполнить поиск без таблицы или даже временной таблицы? – Smur

+0

Да, вы также можете называть 'closeSelect' всем, что хотите вернуть. Вызов метода 'selectMode' из' init' является обычным тином, поскольку большинство возвращаемых значений поступает из элемента управления в форме поиска. –

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

Приведенный выше код помогает при отображении строк в качестве поиска.

0

Пример из глобального :: 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; 
} 
Смежные вопросы