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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.10.2009, 16:36   #1  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
DialogField по неизвестному типу данных
Нужно иметь возможность на форме выбирать значение поля по умолчанию, причем поле выбирается из списка доступных полей и его тип заранее не известен, хранится по FieldId.

Почему-то расчитывал что это сработает, конечно ошибался .. :

PHP код:
public void lookup()
{
    
Dialog dialog = new Dialog();
    
DictField df;
    
DialogField dialogfield;
    ;

    
df = new DictField(MyTable.DataTableIdMyTable.DataFieldid);

    
dialogfield dialog.addField(df.baseType(), df.name(), df.help());

    if (
dialog.run())
    {
        
MyTable.ValueStr strfmt('%1'dialogfield.value());
    }


Если поле, к примеру, происходит от smmBusRelAccount то на диалоге появляется обычный стринг (должен быть контрол с выпадающим списком smmBusRelAccount )

Если от TransDate то StringEdit с пустым лукапом (должен быть контрол с календариком)

Если от NoYesId то опять StringEdit с пустым лукапом (должен быть checkbox)

В принципе логично, все таки basetype запрашивал, но не у всех полей заполнено свойство EDT/Enum, есть ли какое-нибудь стандартное красивое решение подобной задачи ?
__________________
_databaseTransDelete ... bl@$ !
Старый 13.10.2009, 16:48   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DTD Посмотреть сообщение
Если поле, к примеру, происходит от smmBusRelAccount то на диалоге появляется обычный стринг (должен быть контрол с выпадающим списком smmBusRelAccount )

Если от TransDate то StringEdit с пустым лукапом (должен быть контрол с календариком)

Если от NoYesId то опять StringEdit с пустым лукапом (должен быть checkbox)
Цитата:
Сообщение от DTD Посмотреть сообщение
но не у всех полей заполнено свойство EDT/Enum?
а какое поведение вы хотите наблюдать для полей, по которым не заполнено свойство EDT/Enum?

Как вариант сопоставить заранее созданные расширенные типы - "заглушки" с каждым базовым и использовать их в случае отсутствия конкретного типа на поле. Правда пока не знаю как при таком подходе обработать тип String, длинну которого можно указать непосредственно на поле.
Старый 13.10.2009, 16:51   #3  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
а какое поведение вы хотите наблюдать для полей, по которым не заполнено свойство EDT/Enum?
Тогда просто базовый RealEdit, DateEdit, StringEdit и т.д.
__________________
_databaseTransDelete ... bl@$ !
Старый 13.10.2009, 17:01   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
У DictField есть вроде как метод typeId(), который как раз возвращает код EDT...
__________________
Zhirenkov Vitaly
Старый 13.10.2009, 17:18   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от ZVV Посмотреть сообщение
У DictField есть вроде как метод typeId(), который как раз возвращает код EDT...
dialog.addField() его не воспринемает (ax 3.0)
Старый 13.10.2009, 17:22   #6  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Цитата:
Сообщение от ZVV Посмотреть сообщение
У DictField есть вроде как метод typeId(), который как раз возвращает код EDT...
Пробовал, вылетает с ошибкой "Текст Enum ... не существует". Смотрел в ините dialogfields, - не находит своего варианта в switch. (AX4 SP2)
__________________
_databaseTransDelete ... bl@$ !
Старый 13.10.2009, 17:37   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Да действительно, этот метод возвращает код EDT в АОТ (extendedTypeId), а не тот код, который возвращает стандартная функция typeId()...

Есть преобразование из второго варианта в первый: Global::typeId2ExtendedTypeId().
А вот в обратную сторону я что-то не нашёл... :-\

Ну можно самому обратную сторону провести вот это:
X++:
_extendedType >> 16 & 0xffff
по идее... ))
__________________
Zhirenkov Vitaly
Старый 13.10.2009, 17:54   #8  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Вот такой вариант у меня работает на 4.0 как положено:

X++:
    dialogFieldValue = dialog.addField(dictField.combinedTypeId(), 
                                                      dictField.label(), 
                                                      "Укажите в поле нужное значение");

Последний раз редактировалось AlGol; 13.10.2009 в 17:58.
За это сообщение автора поблагодарили: ZVV (2), DTD (1), Gustav (2).
Старый 13.10.2009, 18:07   #9  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от AlGol Посмотреть сообщение
Вот такой вариант у меня работает на 4.0 как положено:

X++:
    dialogFieldValue = dialog.addField(dictField.combinedTypeId(), 
                                                      dictField.label(), 
                                                      "Укажите в поле нужное значение");
О точно, есть такой метод (combinedTypeId), только он в SysDictField...
Заодно и нашлось как преобразовать в обратную сторону:
X++:
    type = df.typeId() << 16 | df.type();


Спасибо!
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: DTD (1), Gustav (2).
Старый 13.10.2009, 18:42   #10  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Цитата:
Сообщение от ZVV Посмотреть сообщение
О точно, есть такой метод (combinedTypeId), только он в SysDictField...
Точно, сразу и не заметил, что стоит DictField.
В книге Inside Dynamics была рекомендация типа - "пользуйтес классами Sys... там много что полезного есть".
Старый 13.10.2009, 18:53   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от ZVV Посмотреть сообщение
X++:
    type = df.typeId() << 16 | df.type();
Круто! Сами сотворили или видели где?

P.S. Однако торможу к вечеру. Всё! Допёр, где это - в \Classes\SysDictField\combinedTypeId

Последний раз редактировалось Gustav; 13.10.2009 в 18:58.
Старый 13.10.2009, 19:43   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Gustav Посмотреть сообщение
Круто! Сами сотворили или видели где?
Global::fieldExt2Id
Global::fieldExt2Idx
Global::fieldId2Ext
Global::extendedTypeId2Type
__________________
полезное на axForum, github, vk, coub.
Старый 13.10.2009, 18:11   #13  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Цитата:
Сообщение от AlGol Посмотреть сообщение
Вот такой вариант у меня работает на 4.0 как положено:

X++:
    dialogFieldValue = dialog.addField(dictField.combinedTypeId(), 
                                                      dictField.label(), 
                                                      "Укажите в поле нужное значение");
Отлично ! Все работает.

* только с dictField от SysDictField
__________________
_databaseTransDelete ... bl@$ !
За это сообщение автора поблагодарили: Gustav (2).
Старый 13.10.2009, 18:43   #14  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Мда, без бутылки с этими extendedTypeId и смещениями "туда-сюда" точно не разберешься... всегда с ними впадаю в ступор... Спасибо за новые знания!

Добавлю до кучи свой, даже не "пятачок", а свою "копеечку", выстраданную методом подбора. Я не очень понял, как оно получилось, но тоже работает
X++:
static void Job215(Args _args)
{
    Dialog dialog = new Dialog();
    DictField df;
    DialogField dialogfield;
    ;

    // расскоментируйте по очереди следующие строки
    df = new DictField(tableNum(RAssetTrans), fieldNum(RAssetTrans, TransDate ));
    //df = new DictField(tableNum(LedgerTrans), fieldNum(LedgerTrans, AccountNum));
    //df = new DictField(tableNum(RAssetTable), fieldNum(RAssetTable, AccountNum));
    //df = new DictField(tableNum(InventTable), fieldNum(InventTable, ItemId    ));
    //df = new DictField(tableNum(EmplTable  ), fieldNum(EmplTable  , EmplId    ));

    dialogfield = dialog.addField( df.typeId() << 16 + 11, df.name(), df.help());

    dialog.run();
}
Старый 13.10.2009, 22:04   #15  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Gustav Посмотреть сообщение
Добавлю до кучи свой, даже не "пятачок", а свою "копеечку", выстраданную методом подбора. Я не очень понял, как оно получилось, но тоже работает
X++:
    dialogfield = dialog.addField( df.typeId() << 16 + 11, df.name(), df.help());
Ну собственно Types::UserType - это и есть 11... Так оно и получилось.
__________________
Zhirenkov Vitaly
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Невозможно выполнить команду языка определения данных в () iHomer13 DAX: Программирование 8 18.07.2008 10:56
Стандартный импорт данных. Обновление sparur DAX: Функционал 0 24.03.2008 19:07
Распределенная база данных на основе View Владимир Максимов DAX: Программирование 27 04.09.2007 13:21
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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