AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 13.10.2009, 16:36   #1  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Join Date: 09.08.2005
DialogField по неизвестному типу данных
Нужно иметь возможность на форме выбирать значение поля по умолчанию, причем поле выбирается из списка доступных полей и его тип заранее не известен, хранится по FieldId.

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

PHP Code:
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@$ !
Old 13.10.2009, 16:48   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,449 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Quote:
Originally Posted by DTD View Post
Если поле, к примеру, происходит от smmBusRelAccount то на диалоге появляется обычный стринг (должен быть контрол с выпадающим списком smmBusRelAccount )

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

Если от NoYesId то опять StringEdit с пустым лукапом (должен быть checkbox)
Quote:
Originally Posted by DTD View Post
но не у всех полей заполнено свойство EDT/Enum?
а какое поведение вы хотите наблюдать для полей, по которым не заполнено свойство EDT/Enum?

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

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

Ну можно самому обратную сторону провести вот это:
X++:
_extendedType >> 16 & 0xffff
по идее... ))
__________________
Zhirenkov Vitaly
Old 13.10.2009, 17:44   #8  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Quote:
Originally Posted by ZVV View Post
Да действительно, этот метод возвращает код EDT в АОТ (extendedTypeId), а не тот код, который возвращает стандартная функция typeId()...

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

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

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

Last edited by AlGol; 13.10.2009 at 17:58.
This post has been rated by: ZVV (2), DTD (1), Gustav (2).
Old 13.10.2009, 18:07   #10  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Quote:
Originally Posted by AlGol View Post
Вот такой вариант у меня работает на 4.0 как положено:

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


Спасибо!
__________________
Zhirenkov Vitaly
This post has been rated by: DTD (1), Gustav (2).
Old 13.10.2009, 18:11   #11  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Join Date: 09.08.2005
Quote:
Originally Posted by AlGol View Post
Вот такой вариант у меня работает на 4.0 как положено:

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

* только с dictField от SysDictField
__________________
_databaseTransDelete ... bl@$ !
This post has been rated by: Gustav (2).
Old 13.10.2009, 18:42   #12  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Join Date: 24.12.2001
Location: Тверь.
Quote:
Originally Posted by ZVV View Post
О точно, есть такой метод (combinedTypeId), только он в SysDictField...
Точно, сразу и не заметил, что стоит DictField.
В книге Inside Dynamics была рекомендация типа - "пользуйтес классами Sys... там много что полезного есть".
Old 13.10.2009, 18:43   #13  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 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();
}
Old 13.10.2009, 18:53   #14  
Gustav is offline
Gustav
Moderator
Gustav's Avatar
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Join Date: 24.01.2006
Location: Санкт-Петербург
Blog Entries: 19
Quote:
Originally Posted by ZVV View Post
X++:
    type = df.typeId() << 16 | df.type();
Круто! Сами сотворили или видели где?

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

Last edited by Gustav; 13.10.2009 at 18:58.
Old 13.10.2009, 19:43   #15  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
Quote:
Originally Posted by Gustav View Post
Круто! Сами сотворили или видели где?
Global::fieldExt2Id
Global::fieldExt2Idx
Global::fieldId2Ext
Global::extendedTypeId2Type
__________________
полезное на axForum, github, vk, coub.
Old 13.10.2009, 22:04   #16  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Join Date: 13.02.2004
Location: Минск
->
Quote:
Originally Posted by Gustav View Post
Добавлю до кучи свой, даже не "пятачок", а свою "копеечку", выстраданную методом подбора. Я не очень понял, как оно получилось, но тоже работает
X++:
    dialogfield = dialog.addField( df.typeId() << 16 + 11, df.name(), df.help());
Ну собственно Types::UserType - это и есть 11... Так оно и получилось.
__________________
Zhirenkov Vitaly
Tags
ax4.0

 

Similar Threads
Thread Thread Starter Forum Replies Last Post
Невозможно выполнить команду языка определения данных в () 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

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 23:56.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.