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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.08.2019, 17:07   #21  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от fed Посмотреть сообщение
Ну я не вполне понимаю, что считается исходной задачей, но я бы попробовал создать calculated field, которое бы конкатенировало значения аналитик из упомянутых мною таблиц, без использования каких-либо дополнительных view.

Ну и вообще - хотелось просто Mazzy указать, что его представления о финансовой аналитике - несколько устаревшие,
а что именно непонятно в постановке задачи?

мы не знаем заранее, что именно будем выбирать - это делает пользователь, выбирая нужную ему иерархию из атрибутов.

по твоему подходу два вопроса:

- как вообще можно сделать выборку значений из всей таблицы, зная только recId выбранных атрибутов? я не понимаю, как увязать на уровней связей таблиц имя поля значений с конкретной колонкой в той "всеобъемлющей" таблице (подозреваю хитрый ход на уровне прямого запроса в сикеле?)

- как это будет масштабироваться для тех атрибутов, которых ещё нет?
__________________
Felix nihil admirari
Старый 12.08.2019, 17:09   #22  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,514 / 4809 (166) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а что именно непонятно в постановке задачи?

мы не знаем заранее, что именно будем выбирать - это делает пользователь, выбирая нужную ему иерархию из атрибутов.

по твоему подходу два вопроса:

- как вообще можно сделать выборку значений из всей таблицы, зная только recId выбранных атрибутов? я не понимаю, как увязать на уровней связей таблиц имя поля значений с конкретной колонкой в той "всеобъемлющей" таблице (подозреваю хитрый ход на уровне прямого запроса в сикеле?)

- как это будет масштабироваться для тех атрибутов, которых ещё нет?
Ну во первых - там не только recId, но и сами значения. Во вторых - по здравому размышлению, я бы просто подджойнивал бы все к одной из этих двух, упомянутых мной, таблиц и вытаскивал бы в грид все поля аналитики оттуда. То есть - моя идея насчет calculated field - она тупиковая. Надо просто джойн делать и поля напрямую вытаскивать.
Старый 12.08.2019, 17:21   #23  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от fed Посмотреть сообщение
Ну во первых - там не только recId, но и сами значения. Во вторых - по здравому размышлению, я бы просто подджойнивал бы все к одной из этих двух, упомянутых мной, таблиц и вытаскивал бы в грид все поля аналитики оттуда.
нормальная реакция на уровне рефлексов. покажешь вариант? вот у нас есть только DimensionHierarchy, которую выбрал юзер. дальше как?

Цитата:
Сообщение от fed Посмотреть сообщение
То есть - моя идея насчет calculated field - она тупиковая. Надо просто джойн делать и поля напрямую вытаскивать.
допустим, конкатенация - это специфика именно моей задачи, можем и опустить эту часть в рамках более широкого исследования. хотя я не понимаю, как ты собираешься делать динамическую выборку колонок для группировки в аггрегации.
__________________
Felix nihil admirari
Старый 12.08.2019, 17:30   #24  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,999 / 3919 (188) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от fed Посмотреть сообщение
Ну и вообще - хотелось просто Mazzy указать, что его представления о финансовой аналитике - несколько устаревшие,
1. спасибо.
2. другими словами, они и этот пункт начали делать и выкинули? госпади... что за люди.

а остальные хитровыделанные таблицы и поля финансовой аналитики остались?
и это хитро-кастомное поле для ввода фин.аналитики тоже осталось?
а поиск со стороны пользователя то есть?

о-о-очень неохота возобновлять виртуальную машину в ажуре и открывать среду разработки.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 12.08.2019, 17:34   #25  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от mazzy Посмотреть сообщение
а поиск со стороны пользователя-то есть?
а он был вообще?
__________________
Felix nihil admirari
Старый 12.08.2019, 17:41   #26  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,999 / 3919 (188) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от wojzeh Посмотреть сообщение
а он был вообще?
по финансовой аналитике насколько я помню не было.
по inventDim - был.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 12.08.2019, 17:48   #27  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от mazzy Посмотреть сообщение
по финансовой аналитике насколько я помню не было.
по inventDim - был.
Ну, не дави из меня слезу, Мань. Про маму твою ничего не скажу. Не знаю. А папашку твоего героицкого видеть приходилось. На фронте он, правда, не воевал, но шнифер был знаменитый. Громил сейфы, будто косточки из компота.
__________________
Felix nihil admirari
За это сообщение автора поблагодарили: mazzy (2).
Старый 12.08.2019, 17:49   #28  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,514 / 4809 (166) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от wojzeh Посмотреть сообщение
нормальная реакция на уровне рефлексов. покажешь вариант? вот у нас есть только DimensionHierarchy, которую выбрал юзер. дальше как?
допустим, конкатенация - это специфика именно моей задачи, можем и опустить эту часть в рамках более широкого исследования. хотя я не понимаю, как ты собираешься делать динамическую выборку колонок для группировки в аггрегации.
  1. На форме джойним bankAccountTrans и DimensionAttributeValueSet по inner join
  2. выбираем все аттрибуты из иерархии через dimensionHierarchy::getAttributesNotInHierarchy() и класс DimensionAttributeCollection.
  3. Для каждого элемента коллекции получаем fieldId через DimensionAttributeValueSet.GetDimensionValueFieldId() поля со значением аналитики.
  4. Добавляем очередное поле по fieldId в GroupBy запроса
  5. С помощью кода, потыренного из класса SysTableBrowser, добавляем новое поле в грид (я так толком и не разобрался как все эти FormBuildBlahBlah классы работают, всегда код из table browser копировал). Альтернативный вариант - просто с самого начала создаем в гриде 50 FieldStringControls для показа аналитик и просто назначем им fieldId/Datasource.
Старый 12.08.2019, 17:55   #29  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,514 / 4809 (166) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от fed Посмотреть сообщение
  1. На форме джойним bankAccountTrans и DimensionAttributeValueSet по inner join
  2. выбираем все аттрибуты из иерархии через dimensionHierarchy::getAttributesNotInHierarchy() и класс DimensionAttributeCollection.
  3. Для каждого элемента коллекции получаем fieldId через DimensionAttributeValueSet.GetDimensionValueFieldId() поля со значением аналитики.
  4. Добавляем очередное поле по fieldId в GroupBy запроса
  5. С помощью кода, потыренного из класса SysTableBrowser, добавляем новое поле в грид (я так толком и не разобрался как все эти FormBuildBlahBlah классы работают, всегда код из table browser копировал). Альтернативный вариант - просто с самого начала создаем в гриде 50 FieldStringControls для показа аналитик и просто назначем им fieldId/Datasource.
Вообще правильнее будет при открытии формы аналогичным подходом добавить в грид ВООБЩЕ все аналитики. А потом при выборе пользователем другой Hierarchy - скрывать или показывать часть аналитик (соответственно - добавляя группировки)
За это сообщение автора поблагодарили: mazzy (2).
Старый 12.08.2019, 18:03   #30  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от fed Посмотреть сообщение
пункты 4 и 5
очень вдохновляют. так-то можно вообще что угодно закодить.
интересно, как быстро это будет работать (вариант с 100500 колонок до неба мне сразу не нравится)

кстати, пустые значения нам тоже нужны.
__________________
Felix nihil admirari
Старый 12.08.2019, 18:04   #31  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от fed Посмотреть сообщение
Вообще правильнее будет при открытии формы аналогичным подходом добавить в грид ВООБЩЕ все аналитики. А потом при выборе пользователем другой Hierarchy - скрывать или показывать часть аналитик (соответственно - добавляя группировки)
а кто вообще говорил про какие-то формы? хотим через data entity всё показывать наружу, например
__________________
Felix nihil admirari
Старый 25.09.2019, 16:33   #32  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
591 / 399 (15) ++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от mazzy Посмотреть сообщение
серьезно?

опять же со всем восхищением к изворотливости ума.
но задача тривиальной фильтрации действительно требует вот такого кода?


серьезно?!
нам тут не до шуток!!! я тут вот заглянул в стандартный DimensionSetEntity, а там... а там... а там вот чо:

X++:
 ///  Each enterprise can expose different dimension attributes.  Therefore, we have determine what dimension attributes
    ///  columns are exposed, then concatenate the fields separated by the account delimiter.
    ///  Example: dimensionField1 - + dimensionField2 - + dimensionField3 ...
    /// </remarks>
    private static server str displayValue()
    {
        str displayValueSql;
        str accountDelimiterSql;
        str dimensionValueColumns;
        str accountDelimiterEscapedSql;

        SysDictEnum delimiterDictEnum = new SysDictEnum(enumnum(DimensionSegmentDelimiter));
        int enumValue = delimiterDictEnum.firstValue();

        for (int i = 1; i <= delimiterDictEnum.values(); i++)
        {
            str enumLabel = delimiterDictEnum.index2Label(enumValue);
            accountDelimiterSql += strfmt(
                "WHEN %1 THEN '%2'\n", delimiterDictEnum.index2Value(enumValue), enumLabel);

            accountDelimiterEscapedSql += strfmt(
                "WHEN %1 THEN '%2'\n", delimiterDictEnum.index2Value(enumValue), DimensionSetEntity::generateEscapedDelimiter(enumLabel));
            enumValue = delimiterDictEnum.nextValue(enumValue);
         }

        // Get the list of all dimension attributes that have metadata columns
        dimensionValueColumns = DimensionSchemaAndDataSynchronizationUtility::getSynchronizedDimensionValueColumnNames(
            tablestr(DimensionAttributeValueSet));

        if (strLen(dimensionValueColumns) == 0)
        {
            // No table extension columns.
            displayValueSql = SysComputedColumn::returnLiteral('');
        }
        else
        {
            str errorMessage = strReplace("@Dimension:DimensionEntitiesDimensionStructureNotCreated", "'", "''");
            LanguageId systemLanguageId = SystemParameters::find().SystemLanguageId;

            // Determine the error message based on system language
            if (systemLanguageId != '')
            {
                errorMessage = strReplace(SysLabel::labelId2String2("@Dimension:DimensionEntitiesDimensionStructureNotCreated", systemLanguageId), "'", "''");;
            }

            //Create view sql
            displayValueSql = strfmt(
                @"
                SELECT (
                   SELECT CASE WHEN
                            NonNullDisplayValue IS NOT NULL
                            THEN NonNullDisplayValue
                            ELSE '%4'
                        END
                        FROM
                        (
                        -- Remove initial delimiter
                        SELECT STUFF(
                            (SELECT
                                    -- Prepend with delimiter and escape internal delimiters
                                    DIMENSIONSEGMENTDELIMITER + COALESCE(
                                        REPLACE(REPLACE(DIMLIST.DISPLAYVALUE, '\', '\\'),
                                                DIMENSIONSEGMENTDELIMITER,
                                                DIMENSIONSEGMENTDELIMITERESCAPED),
                                        '')
                                FROM
                                    (SELECT TOP (1) DH.RECID
                                        FROM DIMENSIONHIERARCHY DH
                                        JOIN DIMENSIONHIERARCHYINTEGRATION DHI
                                            ON DHI.DIMENSIONHIERARCHY = DH.RECID
                                            AND DHI.ISDEFAULT = 1
                                            AND DHI.PARTITION = T1.PARTITION
                                        WHERE
                                            DH.PARTITION = T1.PARTITION
                                            AND DH.STRUCTURETYPE = %2
                                    ) AS DH
                                JOIN DIMENSIONHIERARCHYLEVEL DHL
                                    ON DHL.DIMENSIONHIERARCHY = DH.RECID AND DHL.PARTITION = T1.PARTITION
                                JOIN DIMENSIONATTRIBUTE DA
                                    ON DA.RECID = DHL.DIMENSIONATTRIBUTE AND DA.PARTITION = T1.PARTITION
                                LEFT JOIN
                                        (SELECT DIMENSIONATTRIBUTE, DISPLAYVALUE
                                            FROM
                                                (SELECT * FROM DIMENSIONATTRIBUTEVALUESET DAVS
                                                    WHERE DAVS.PARTITION = T1.PARTITION AND DAVS.RECID = T1.RECID) P

                                            UNPIVOT
                                                (DISPLAYVALUE for DIMENSIONATTRIBUTE IN (%3))
                                                        AS DIMENSIONVALUECOLUMNNAME
                                        ) AS DIMLIST 
                                    ON
                                        DIMLIST.DIMENSIONATTRIBUTE = REPLACE(DA.DIMENSIONVALUECOLUMNNAME COLLATE Database_Default, '.', '$')
                                ORDER BY DHL.DIMENSIONHIERARCHY, DHL.LEVEL_
                                FOR XML PATH(''), TYPE
                            ).value('(./text())[1]', 'NVARCHAR(MAX)'),
                            1, LEN(DIMENSIONSEGMENTDELIMITER), '')
                         AS NonNullDisplayValue)
                    AS DisplayValueFormat)
                    FROM
                        (SELECT TOP(1)
                                --Determine the account delimiter
                                CASE DIMENSIONSEGMENTDELIMITER
                                    %1
                                END AS DIMENSIONSEGMENTDELIMITER,
                            --Determine the account delimiter escaped
                            CASE DIMENSIONSEGMENTDELIMITER
                                %5
                            END AS DIMENSIONSEGMENTDELIMITERESCAPED
                        FROM DIMENSIONPARAMETERS
                        WHERE DIMENSIONPARAMETERS.PARTITION = T1.PARTITION
                    ) AS DIMENSIONPARAMETERS
                ",
                accountDelimiterSql,
                enum2int(DimensionHierarchyType::DataEntityDefaultDimensionFormat),
                dimensionValueColumns,
                errorMessage,
                accountDelimiterEscapedSql);
        }
        
        return displayValueSql;
    }
__________________
Felix nihil admirari
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
How to lookup and set a new value for Financial dimension Blog bot DAX Blogs 0 03.10.2015 02:35
emeadaxsupport: How to change the Storage dimension group on items with existing Inventory transactions Blog bot DAX Blogs 0 01.10.2015 21:11
NAV Team: Filtering on Dimension Values Blog bot Dynamics CRM: Blogs 0 12.06.2012 18:02
Khue Trinh: Setting up a link between a financial dimension and the site inventory dimension Blog bot DAX Blogs 0 27.09.2010 13:05
wiki.dynamicsbook: Changes Made in Navision Attain 3.60 Blog bot Dynamics CRM: Blogs 0 02.09.2008 13:23
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.