AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.09.2010, 17:46   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Post
По аналогии с выше приведенным постом tricky, я сделал для себя выпадающий список (Lookup) для всех полей таблицы не являющимися системными:
Результат:
Название: fieldsUser.png
Просмотров: 3055

Размер: 40.5 Кб
  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  - таблица куда сохраняем поле
    ;

    id = pickFieldUserLabel(tableNum(CustTable));

    if (! id)
        return;

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

    AnyUserTable_ds.refresh();
}
P.S. Спасибо tricky , за хороший пост.
__________________

This posting is provided "AS IS" with no warranties, and confers no rights.
За это сообщение автора поблагодарили: mazzy (2), Lemming (5), lev (2), mallard (2), Proba (1).
Старый 17.09.2010, 18:00   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
ну и в дагонку методам pick (может кому пригодится )..
в своё время нужны были методы, которые вываливают список EDT, Forms и MainMenu.
т.к. в стандарте таковых не нашел добавил следующие методы в класс Global:

Ax3.0 sp3

1. список EDT:
X++:
static int pickExtDataTypes()
{
    Object      formRun;
    container   names;
    int         i;
    Dictionary  dict = new Dictionary();
    DictType    dictType;
    #ResAppl
    ;

    formRun = classFactory.createPicklist();
    formRun.init();

    for (i=1; i <= dict.typeCnt(); i++)
    {
        dictType = new DictType(dict.typeCnt2Id(i));

        names   += dictType.name();
    }

    formRun.choices(names, #ImageEDT);
    formRun.caption("EDT");
    formRun.run();
    formRun.wait();

    if (formRun.choice())
    {
        return dict.typeName2Id(formRun.choice());
    }

    return 0;
}
2. Список форм.
X++:
static FormName pickForms()
{
    Object      formRun;
    container   names;
    TreeNode    treeNode;
    TreeNode    treeNodeChild;
    #ResAppl
    #AOT
    ;

    treeNode        = TreeNode::findNode(#FormsPath);
    treeNodeChild   = treeNode.AOTfirstChild();

    formRun = classFactory.createPicklist();
    formRun.init();

    while (treeNodeChild)
    {
        names   += treeNodeChild.treeNodeName();

        treeNodeChild = treeNodeChild.AOTnextSibling();
    }

    formRun.choices(names, #ImageForm);
    formRun.caption("Forms");
    formRun.run();
    formRun.wait();

    if (formRun.choice())
    {
        return formRun.choice();
    }

    return '';
}
3. Список пунктов главного меню
X++:
static MenuName pickMenusMain()
{
    Object      formRun;
    container   names;
    TreeNode    treeNode;
    TreeNode    treeNodeChild;
    SysDictMenu dictMenu;
    #ResAppl
    #AOT
    #Admin
    ;

    treeNode        = TreeNode::findNode(#MenusPath + '\\' + #MainMenu);
    treeNodeChild   = treeNode.AOTfirstChild();

    formRun = classFactory.createPicklist();
    formRun.init();

    while (treeNodeChild)
    {
        dictMenu    = SysDictMenu::newMenuName(#MainMenu + '\\' + treeNodeChild.treeNodeName());
        names      += dictMenu.label();

        treeNodeChild = treeNodeChild.AOTnextSibling();
    }

    formRun.choices(names, #ImageMenuMain);
    formRun.caption("MainMenu");
    formRun.run();
    formRun.wait();

    if (formRun.choice())
    {
        return formRun.choice();
    }

    return '';
}
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: TasmanianDevil (4).
Теги
ax3.0, ax4.0, lookup, lookupfield, полезное, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить имена полей, которые есть у таблицы? 3oppo DAX: Программирование 2 22.12.2006 14:30
Свойство AllowEdit полей таблицы Lucky13 DAX: Программирование 4 29.07.2005 14:14
Список полей таблиц на базе конкретного EDT Владимир Максимов DAX: Программирование 10 06.10.2004 14:45
Изменение ID-ов полей таблицы somebody DAX: Программирование 5 02.02.2004 19:57
Объединить несколько полей таблицы в одном поле Grid-а на форме? storer DAX: Программирование 2 12.11.2003 14:08

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

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