AXForum  
Вернуться   AXForum > Блоги > Заметки по Dynamics Ax от Poleax
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Оценить эту запись

Lookup пользовательских полей таблицы

Запись от Poleax размещена 17.09.2010 в 17:48

По аналогии с выше приведенным постом tricky, я сделал для себя выпадающий список (Lookup) для всех полей таблицы не являющимися системными:
Результат:
  1. В \Data Dictionary\Base Enums\SysPickListType добавить элемент, назовем его к примеру FieldsUsersLabels (Пользовательские поля с названием)
  2. В классе создадим метод \Classes\Global\pickFieldUserLabel
    X++:
    static int pickFieldUserLabel(tableId tableId)
    {
        Object  formRun;
        Args    args;
        ;
        args = new Args(formstr(SysPick));
        args.parm(strRFix(int2str(SysPickListType::FieldsUsersLabels),2)+int2str(tableId));
        formRun = classfactory.formRunClass(args);
        formRun.init();
        formRun.run();
        formRun.wait();
        if (formRun.selection())
            return formRun.selection();
        return 0;
    }
  3. В класс создадим метод \Classes\sysPickList\fillFieldsUserLabesMap:
    X++:
    public static client container fillFieldsUserLabesMap(str _argsParm)
    {
        TmpSysTableField    tmpSysTableField;
        DictTable           dictTable       = new DictTable(str2int(_argsParm));
        Map                 map             = new Map(Types::Integer, Types::String);
        
        //Variables
        DictField               dictField;
        SysDimension            dim;
        str                     num = '';
        
        ;
        if (dictTable &&
            dictTable.rights() > AccessType::NoAccess)
        {
            tmpSysTableField = TmpSysTableField::findTableFields(tmpSysTableField, dictTable.id());
    
            while select tmpSysTableField
            {
                dictField  = new dictField(dictTable.id(), tmpSysTableField.ExtendedFieldId);
                
                if(!dictField.isSystem())
                {
                    if(tmpSysTableField.FieldName LIKE "*Dimension*")
                        num = "[" + int2str(enum2int(str2Enum(dim, tmpSysTableField.FieldLabel)) + 1) + "]";
                    else
                        num = "";
                        
                    map.insert(tmpSysTableField.ExtendedFieldId, tmpSysTableField.FieldName + num + " (" + tmpSysTableField.FieldLabel + ")" );
                }
            }
        }
        return map.pack();
    }
  4. В методе init этого же класса добавить примерно такие строки (в блоке switch(sysPickListType)):
    X++:
            case SysPickListType::FieldsUsersLabels :
                imageRes    = #imageField;
                caption     = "Пользовательские поля с названием";
                designWidth = #designLargeWidth;
                if (!map)
                {
                    map = Map::create(sysPickList::fillFieldsUserLabesMap(parmTxt));
                }
                break;
  5. Вызываем метод:
    X++:
    Global::pickFieldUserLabel(tableNum(CustTable));

Для примера можно выбрать форму для изучения \Forms\PBATreeTable.

Пример Lookup метода:
X++:
void lookup()
{
    fieldId id;
//AnyUserTable  - таблица куда сохраняем поле (формат поля EDT = FieldName )
    ;

    id = pickFieldUserLabel(tableNum(CustTable));

    if (! id)
        return;

    AnyUserTable.FieldName = fieldid2name(tableNum(CustTable),id);

    AnyUserTable_ds.refresh();
}
P.S. Спасибо tricky , за хороший пост.
P.S.S. Этот пост на форуме Лукап, отображающий список полей определённой таблицы
Размещено в Без категории
Просмотров 12763 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:54.