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. Этот пост на форуме Лукап, отображающий список полей определённой таблицы
Размещено в Без категории
Просмотров 13884 Комментарии 0
Всего комментариев 0

Комментарии

 


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