12.11.2008, 11:17 | #1 |
Участник
|
Финансовые аналитики
Добрый день!
У меня вопрос, подскажите пожалуйста кто знает: как программно получить список финансовых аналитик, а точнее их названия? P.S. DAX 4.0 SP2 |
|
12.11.2008, 11:27 | #2 |
Developer
|
X++: while select Dimensions {...} |
|
12.11.2008, 12:01 | #3 |
Ищущий знания...
|
если речь идёт просто о том какие фин аналитики есть в системе, то можно вот так:
X++: SysDictEnum dictEnum = new SysDictEnum(enumnum(SysDimension)); int i, cnt, iSearch; ; cnt = dictEnum.lastValue(); for(i=dictEnum.firstValue(); iSearch <= cnt; i = dictEnum.nextValue(i)) { iSearch++; info(dictEnum.value2Label(i)); }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
12.11.2008, 12:08 | #4 |
Участник
|
Цитата:
Сообщение от lev
если речь идёт просто о том какие фин аналитики есть в системе, то можно вот так:
X++: SysDictEnum dictEnum = new SysDictEnum(enumnum(SysDimension)); int i, cnt, iSearch; ; cnt = dictEnum.lastValue(); for(i=dictEnum.firstValue(); iSearch <= cnt; i = dictEnum.nextValue(i)) { iSearch++; info(dictEnum.value2Label(i)); } |
|
12.11.2008, 12:47 | #5 |
Участник
|
Возможная избыточность цикла
Цитата:
Сообщение от lev
если речь идёт просто о том какие фин аналитики есть в системе, то можно вот так:
X++: SysDictEnum dictEnum = new SysDictEnum(enumnum(SysDimension)); int i, cnt, iSearch; ; cnt = dictEnum.lastValue(); for(i=dictEnum.firstValue(); iSearch <= cnt; i = dictEnum.nextValue(i)) { iSearch++; info(dictEnum.value2Label(i)); } Мастером финансовых аналитик (или просто в AOT) добавляем новый элемент со значением 101 (т.е. не последовательно 0,1,2,3,4,...) в enum SysDimension - в итоге цикл начинает отрабатывать 102 итерации т.к. сравнение идет iSearch <= 101 начиная с 0. Если необходим список активных значений, то дополнительно можно проверить на предмет активности конфигурационного ключа на значении enum'а, что-то в таком духе: X++: static void jbDimensionListByEnum(Args _args) { DictEnum dictEnum = new DictEnum( enumNum( SysDimension ) ) ; Counter enumIdx ; #define.OnlyActive ; for( enumIdx = 0; enumIdx < dictEnum.values(); enumIdx++ ) { #if.OnlyActive if( !isConfigurationKeyEnabled( dictEnum.index2ConfigurationKey( enumIdx ) ) ) continue ; #endif info( dictEnum.index2Label(enumIdx)); } } |
|
|
За это сообщение автора поблагодарили: jiller (1). |
12.11.2008, 12:57 | #6 |
Участник
|
И еще такой вопрос: как получить информацию о EDT, используемых в массиве типа Dimension?
|
|
12.11.2008, 13:02 | #7 |
MCTS
|
Еще более короткий вариант, тут вообще ничего проверять не надо
X++: int c; ; for (c = 1; c <= new DictType(extendedtypenum(Dimension)).arraySize(); c++) info(new DictType(extendedtypenum(Dimension)).label(c)); Отвечая на последний вопрос, new DictType(extendedtypenum(Dimension)) вам в помощь, там большинство методов этого объекта требуют указания индекса элемента. Последний раз редактировалось Eldar9x; 12.11.2008 в 13:15. |
|
|
За это сообщение автора поблагодарили: lev (1). |
12.11.2008, 13:03 | #8 |
Ищущий знания...
|
Согласен.
Просто в разрезе описанной задачи посчитал, что такого кода достаточно, т.к. сомневаюсь что в финансовых аналитиках, кто то добавит элемент со значением 101.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
12.11.2008, 13:33 | #9 |
Участник
|
Всем огромное спасибо за помощь!
|
|
12.11.2008, 14:05 | #10 |
Участник
|
Просто раз уж тему открыл, то предложу и свое решение задачи:
X++: static void Job2(Args _args) { SetEnumerator dimensionsEnumerator = Dimensions::dimensionCodesSet().getEnumerator(); SysDimension sysDimension; ; while (dimensionsEnumerator.moveNext()) { sysDimension = dimensionsEnumerator.current(); print enum2str(sysDimension); } pause; } |
|
|
За это сообщение автора поблагодарили: lev (1), player (1). |
14.07.2011, 07:47 | #11 |
Участник
|
А если нужно добавить поля на форму?
У меня есть расширение этой задачи - добавление на форму "отвязанных" контролов по фин. аналитикам. Вариант с добавлением всех и последующим скрытием не интересен, т.к. заранее не известно, сколько аналитик будет.
Делаю так: X++: DictEnum DictEnum = new DictEnum(enumnum(SysDimension)); FormBuildDesign formBuilddesign = form.design(); FormBuildGroupControl formBuildGroupControl; FormStringControl c; int i; ; if (dictEnum){ for (i=0; i<dictEnum.values(); i++){ c = DimensionList.addControl(FormControlType::String,strfmt("_%1",dictEnum.index2Symbol(i))); c.extendedDataType(global::extendedTypeName2Id(strfmt("Dimension[%1]",i))); c.showLabel(true); c.label(dictEnum.index2Name(i)); c.lookupButton(2); } } Не подскажете, в чем дело? Последний раз редактировалось gefr; 14.07.2011 в 08:07. |
|
14.07.2011, 08:25 | #12 |
Участник
|
Цитата:
Когда будете создавать unbound контрол вручную какой расширенный тип выберете? Что, по-вашему, должен вернуть метод global::extendedTypeName2Id(strfmt("Dimension[%1]",i))? |
|
14.07.2011, 08:35 | #13 |
Administrator
|
Цитата:
Нашел для себя 2 "обходных" пути. 1. Для диалогов - наследников RunBase есть класс DialogAddDimensionType_CheckButton_RU. Он добавляет в диалог флажки, по количеству элементов в массиве в типе Dimension. По сути здесь простой цикл и все. Но это решает задачу добавления именно "отвязанных" контролов. Важно! Здесь список контролов подготавливается ДО init формы. Т.к. после - уже не получается (ну у меня тогда не получилось). При этом лукапы для каждого элемента массива тут работать не будут (если пытаться заменить галки на строковые поля). Т.е. если хочется добавить контрол с лукапом в случае массива - он должен быть "связанным" 2. Если нужно сделать лукап со списком полей (а может и лукап со списком значений) аналогично форме расширенного запроса (SysQueryForm) - то нужно использовать класс SysQueryForm (его можно использовать, предварительно подготовив всякие таблички и Query). При этом, обращаю внимание - там используется табличка TmpSysQuery и у контрола типа Dimension проставлен не EDT, а FieldId, причем свойство ArraySize не используется (оно не работает), а в FieldId подставлено значение fieldId2Ext(fieldnum(Dimension), i), где i - индекс массива. Здесь видно, что лукап у поля "Значения" строится в зависимости от выбранного элемента массива.
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 14.07.2011 в 08:46. |
|
|
За это сообщение автора поблагодарили: Sergey Petrov (1). |
14.07.2011, 08:45 | #14 |
Участник
|
2 S.Kuskov: да, вы правы, тупанул переделал так - все равно не помогло.
X++: c.extendedDataType(typeid(Dimension));
c.arrayIndex(i); |
|
14.07.2011, 08:47 | #15 |
Administrator
|
Я ж сказал - не работает это свойство. Ошибся в названии - не ArraySize, а arrayIndex
__________________
Возможно сделать все. Вопрос времени |
|
14.07.2011, 08:53 | #16 |
Участник
|
Цитата:
Вот тут ещё было обсуждение этой проблемы Статьи аналитик Последний раз редактировалось S.Kuskov; 14.07.2011 в 08:55. |
|
14.07.2011, 09:40 | #17 |
Участник
|
Там, к сожалению, про диалоги. В диалогах проблем нет, я это и так знал, сразу попробовал и здесь, на форме. На форме не срастается
|
|
14.07.2011, 12:44 | #18 |
----------------
|
X++: public void init() { FormBuildDesign formBuilddesign = form.design(); FormBuildGroupControl formBuildGroupControl = form.design().control('AddGroup'); formBuildStringControl bc; ; bc = formBuildGroupControl.addControl(FormControlType::STRING,'RunTimeControl'); bc.extendedDataType(typeId2ExtendedTypeId(typeId(Dimension))); bc.arrayIndex(2); super(); } |
|
|
За это сообщение автора поблагодарили: sukhanchik (4), S.Kuskov (3), Player1 (1). |
14.07.2011, 14:33 | #19 |
Участник
|
К сожалению, не могу добавить благодарность 2Wamr - сайт артачится. Но все равно - спасибо.
|
|