![]() |
#1 |
Участник
|
DialogField по неизвестному типу данных
Нужно иметь возможность на форме выбирать значение поля по умолчанию, причем поле выбирается из списка доступных полей и его тип заранее не известен, хранится по FieldId.
Почему-то расчитывал что это сработает, конечно ошибался .. : PHP код:
Если от TransDate то StringEdit с пустым лукапом (должен быть контрол с календариком) Если от NoYesId то опять StringEdit с пустым лукапом (должен быть checkbox) В принципе логично, все таки basetype запрашивал, но не у всех полей заполнено свойство EDT/Enum, есть ли какое-нибудь стандартное красивое решение подобной задачи ?
__________________
_databaseTransDelete ... bl@$ ! |
|
![]() |
#2 |
Участник
|
Цитата:
Сообщение от DTD
![]() Если поле, к примеру, происходит от smmBusRelAccount то на диалоге появляется обычный стринг (должен быть контрол с выпадающим списком smmBusRelAccount )
Если от TransDate то StringEdit с пустым лукапом (должен быть контрол с календариком) Если от NoYesId то опять StringEdit с пустым лукапом (должен быть checkbox) Как вариант сопоставить заранее созданные расширенные типы - "заглушки" с каждым базовым и использовать их в случае отсутствия конкретного типа на поле. Правда пока не знаю как при таком подходе обработать тип String, длинну которого можно указать непосредственно на поле. |
|
![]() |
#3 |
Участник
|
Тогда просто базовый RealEdit, DateEdit, StringEdit и т.д.
__________________
_databaseTransDelete ... bl@$ ! |
|
![]() |
#4 |
MCITP
|
![]()
У DictField есть вроде как метод typeId(), который как раз возвращает код EDT...
__________________
Zhirenkov Vitaly |
|
![]() |
#5 |
Участник
|
|
|
![]() |
#6 |
Участник
|
Пробовал, вылетает с ошибкой "Текст Enum ... не существует". Смотрел в ините dialogfields, - не находит своего варианта в switch. (AX4 SP2)
__________________
_databaseTransDelete ... bl@$ ! |
|
![]() |
#7 |
MCITP
|
![]()
Да действительно, этот метод возвращает код EDT в АОТ (extendedTypeId), а не тот код, который возвращает стандартная функция typeId()...
Есть преобразование из второго варианта в первый: Global::typeId2ExtendedTypeId(). А вот в обратную сторону я что-то не нашёл... :-\ Ну можно самому обратную сторону провести вот это: X++: _extendedType >> 16 & 0xffff ![]()
__________________
Zhirenkov Vitaly |
|
![]() |
#8 |
MCITP
|
![]() Цитата:
Сообщение от ZVV
![]() Да действительно, этот метод возвращает код EDT в АОТ (extendedTypeId), а не тот код, который возвращает стандартная функция typeId()...
Есть преобразование из второго варианта в первый: Global::typeId2ExtendedTypeId(). А вот в обратную сторону я что-то не нашёл... :-\ Ну можно самому обратную сторону провести вот это: X++: _extendedType >> 16 & 0xffff ![]() ![]() Надо майкросовтовцев пытать как перевести один код в другой....
__________________
Zhirenkov Vitaly |
|
![]() |
#9 |
Участник
|
Вот такой вариант у меня работает на 4.0 как положено:
X++: dialogFieldValue = dialog.addField(dictField.combinedTypeId(),
dictField.label(),
"Укажите в поле нужное значение"); Последний раз редактировалось AlGol; 13.10.2009 в 17:58. |
|
|
За это сообщение автора поблагодарили: ZVV (2), DTD (1), Gustav (2). |
![]() |
#10 |
MCITP
|
![]() Цитата:
Заодно и нашлось как преобразовать в обратную сторону: X++: type = df.typeId() << 16 | df.type(); ![]() Спасибо!
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: DTD (1), Gustav (2). |
![]() |
#11 |
Участник
|
Цитата:
* только с dictField от SysDictField
__________________
_databaseTransDelete ... bl@$ ! |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
![]() |
#12 |
Участник
|
Точно, сразу и не заметил, что стоит DictField.
В книге Inside Dynamics была рекомендация типа - "пользуйтес классами Sys... там много что полезного есть". |
|
![]() |
#13 |
Moderator
|
Мда, без бутылки с этими 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(); } |
|
![]() |
#14 |
Moderator
|
Круто! Сами сотворили или видели где?
![]() P.S. Однако торможу к вечеру. Всё! Допёр, где это - в \Classes\SysDictField\combinedTypeId ![]() Последний раз редактировалось Gustav; 13.10.2009 в 18:58. |
|
![]() |
#15 |
Участник
|
Global::fieldExt2Id
Global::fieldExt2Idx Global::fieldId2Ext Global::extendedTypeId2Type |
|
![]() |
#16 |
MCITP
|
![]() Цитата:
![]()
__________________
Zhirenkov Vitaly |
|