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