AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX Blogs
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search Mark Forums Read

 
 
Thread Tools Search this Thread Display Modes
Old 10.08.2019, 04:57   #1  
Blog bot is offline
Blog bot
Участник
 
25,646 / 848 (80) +++++++
Join Date: 28.10.2006
How to filter existing transactions based on a financial dimension value set
Источник: http://alexvoy.blogspot.com/2019/08/...nsactions.html
==============

Let's assume that we want to see our bank accounts balances grouped by a financial set, which may be different than that set up for your transactions.



For example, existing transactions presume to have values for the following dimension attributes.





However, our selection can be different. For this exercice sake I opted for Business unit and Department.




So, instead of one balance for the whole bank account, we want to get it distributed per every combination of Business unit and Department values.









Another point to consider is the fact that these attributes are not mandatory; in other words, we don't have values for all attributes in all transactions.


It can be easily achieved if we find a way to create a column with all sought dimension attribute values concatened as depicted.



Generally speaking this is a job a BI solution; however, it is possible to do in D365 by means of Views.

Let's solve this problem step by step.

Fisrt view is for all selected attributes that we should populate values for, exist them or not.



Second, collect all existing values which match our selected attributes.



Then, group all found dimension attribute sets.



Now we create a view based on the latter and sought attributes without relation in outer join. By that we will get a Carthesian product of all possible combinations between them.



At this step we outer join the latter with the found (existing) values. Here we can add a computed column if we want to see something else than just an empty value.




private static server str displayValueWithNA() // X++
{
str sRet;
tableName viewName = viewstr(CDPDimensionAttributeValuesUnionView);
str cDisplayValue = SysComputedColumn::comparisonField(viewName,
viewstr(CDPDimensionAttributeValuesSelectedView),
fieldStr(CDPDimensionAttributeValuesSelectedView, DisplayValue));

sRet =
SysComputedColumn::if(SysComputedColumn::isNotNullExpression(cDisplayValue),
cDisplayValue,
SysComputedColumn::returnLiteral('n/a')
);

return sRet;
}



Final view will contain all the values found on the previous step grouped by dimension attribute value set so that in a computed column all values be concatened in the required order.





private static server str finDimValues() // X++
{
return @"STUFF((SELECT '-' + t3.DisplayValue
from CDPDimensionAttributeValuesUnionView as t3
where
t1.DimensionAttributeValueSet = t3.DimensionAttributeValueSet
order by t3.DIMENSIONATTRIBUTE
for xml path('')), 1, 1, '')";
}


Having this view in inner join combination allows you to filter any transactional data by a set of dimenions without coding.





Источник: http://alexvoy.blogspot.com/2019/08/...nsactions.html
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.
Old 10.08.2019, 12:50   #2  
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 Blog bot View Post
For example, existing transactions presume to have values for the following dimension attributes.

это замечательно. но похоже, пример раскрывает как отфильтровать две ПОСЛЕДОВАТЕЛЬНЫЕ позиции. причем ничего не говорится, что в этих позициях могут находится и другие аналитики.

я думаю, что в статье обязательно требуется рассмотреть случай, когда в одной позиции могут находится несколько разных аналитик, в списке которых есть одинаковые значения. я навскидку уже не помню, но в демопримере был случай, когда во вторую позицию с одними счетами прибылей и убытков могли записываться либо CostCenter, а в другие счета прибылей и убытков во вторую позицию могли записываться Purpose. Или нечто подобное. Причем в обоих списках были значения 010.

возвращаясь к статье:

разбирать аналитики на примере банковских проводок - не очень. либо надо обосновать каким образом на банковских проводках могут возникнуть разные комбинации аналитик.

для каждой view стоит привести пример данных. Особенно для таких "By that we will get a Carthesian product of all possible combinations between them".


очень хотелось бы статью, в которой раскрывались бы решения для следующих обыденных задач:

задача 1: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010. В какой бы позиции не находился CostCenter. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010.

задача 1': то же самое, что в задаче 1, только CostCenter = 01*.
задача 1'': то же самое, что в задаче 1, только CostCenter = 01*..02*,!021.


задача 2: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010 и Department = 010. В какой бы позиции не находились CostCenter и Department. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010.

задача ***: отфильтровать с условием "или". в запросах по остальным значениям (не финансовая аналитика) в поисковом выражении можно использовать скобки.
https://axapta.mazzy.ru/lib/search/


Примечание: можно посмотреть в 1С:Бухгалтерию, в которой задача выборки по субконто давно решена. можно также рассказать какой ценой решили эту задачу в 1С:Бухгалтерии.

Quote:
Originally Posted by Blog bot View Post
However, our selection can be different. For this exercice sake I opted for Business unit and Department.
опять же - и Business unit, и Department может находится в разных позициях в разных проводках.
в том числе, в некоторых случаях сначала может идти Business unit, а затем Department. а в некоторых - сперва Department, а затем Business unit. Причем между этими аналитиками могут быть расположены другие аналитики.

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

Quote:
Originally Posted by Blog bot View Post
Let's solve this problem step by step.
му-ха-ха-ха!!!
ни в коем случае не хочу принижать достоинства статьи и изложенного подхода.
Хочу сказать лишь одно - архитекторы, которые это чудо задолжили в Аксапту... они как собирались выполнять фильтрацию? какой способ по их мнению должны были использовать пользователи?

приходит такой пользователь и спрашивает "как отфильтровать по CostCenter"
а архитектор отвечает - "нет-нет, ты еще не готов к этому" https://coub.com/view/1avfh5

а для продвинутых програмеров-в-закрытой-системе он начинает ответ с фразы "Let's solve this problem step by step..."


Quote:
Originally Posted by Blog bot View Post
Now we create a view based on...
е-е-е-е-е!!!!
we - это пользователи? или программисты?
сколько таких вью должны создать программисты в закрытой системе, чтобы пользователи хотя бы перестали ругаться?

Quote:
Originally Posted by Blog bot View Post
...without relation in outer join
серьезно?
и сколько значений сможет обслуживать этот подход к фильтрации?
можно ли вводить значения как критерий через запятую? со звездочкой? а с другими мета символами?

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

Quote:
Originally Posted by Blog bot View Post
X++:
private static server str displayValueWithNA()   // X++
{
    str         sRet;
    tableName   viewName                = viewstr(CDPDimensionAttributeValuesUnionView);
    str         cDisplayValue  = SysComputedColumn::comparisonField(viewName,
                                                                                viewstr(CDPDimensionAttributeValuesSelectedView),
                                                                                fieldStr(CDPDimensionAttributeValuesSelectedView, DisplayValue));
    
    sRet =
        SysComputedColumn::if(SysComputedColumn::isNotNullExpression(cDisplayValue),
                                cDisplayValue,
                                SysComputedColumn::returnLiteral('n/a')
                            );
 
    return sRet;
}
серьезно?

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

Quote:
Originally Posted by Blog bot View Post
X++:
private static server str finDimValues() // X++
{
return @"STUFF((SELECT '-' + t3.DisplayValue
from CDPDimensionAttributeValuesUnionView as t3
where
t1.DimensionAttributeValueSet = t3.DimensionAttributeValueSet
order by t3.DIMENSIONATTRIBUTE
for xml path('')), 1, 1, '')";
}
серьезно?!
__________________
полезное на axForum, github, vk, coub.

Last edited by mazzy; 10.08.2019 at 13:37.
Old 10.08.2019, 14:03   #3  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1635 (57) ++++++++
Join Date: 07.06.2003
Blog Entries: 1
Quote:
Originally Posted by mazzy View Post
опять же со всем восхищением к изворотливости ума.
но задача тривиальной фильтрации действительно требует вот такого кода?
серьезно?!
Картинка прямо в тему
Name:  sova.jpg
Views: 6610
Size:  78.4 KB
А чем для задачи Financial dimension sets не подошли, они вроде как раз для группировки нужны(если я правильно понял проблему)
Old 10.08.2019, 14:57   #4  
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 trud View Post
А чем для задачи Financial dimension sets не подошли
понятия не имею. кстати, тоже бы посмотрел на ответ.

а вот пользователи точно НЕ формулируют свои вопросы в терминах Financial dimension sets
с удовольствием послушаю как можно применить Financial dimension sets в ответе на вопрос "как отфильтровать по CostCenter"
__________________
полезное на axForum, github, vk, coub.
Old 10.08.2019, 15:02   #5  
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 trud View Post
Картинка прямо в тему
и кстати, не соглашусь.
подход в статье очень интересный и хитроумный.

другое дело, что даже для proof of concept с такой фин.аналитикой нужно быть еще хитроумнее.

беда в том, что в ax2012 и выше для ответа тривиальный вопрос про фильтрацию по фин.аналитике требуется очень хитроумный ответ программиста.
Financial dimension values concatened by mask
__________________
полезное на axForum, github, vk, coub.

Last edited by mazzy; 10.08.2019 at 15:06.
Old 10.08.2019, 21:40   #6  
wojzeh is offline
wojzeh
Участник
wojzeh's Avatar
Соотечественники
 
681 / 517 (19) +++++++
Join Date: 27.04.2006
Location: Montreal
Quote:
Originally Posted by mazzy View Post
прежде всего, огромное спасибо.
на здоровье! может, стоит слить оба топика, а то и так мозг плавится, а тут два треда получились?


Quote:
Originally Posted by mazzy View Post
это замечательно. но похоже, пример раскрывает как отфильтровать две ПОСЛЕДОВАТЕЛЬНЫЕ позиции. причем ничего не говорится, что в этих позициях могут находится и другие аналитики.
твоё замечание я не понял, извини. что меняется, от того, последовательные они или нет? выборка идёт по всем наборам, так как они и использованы в транзакциях. в каждом наборе заданы атрибуты и их значения. какая нам разница, в каких они позициях? ты посмотри структуру всех вьюх, там всё ровно так, как оно и используется в аксе - никакой самодеятельности.

Quote:
Originally Posted by mazzy View Post
я думаю, что в статье обязательно требуется рассмотреть случай, когда в одной позиции могут находится несколько разных аналитик, в списке которых есть одинаковые значения
решается задача, разумеется, группировки сальдо по выбранным значениям измерений (фильтрация по выбранному набору атрибутов), и никакой фильтрации по собственно значениям тут нет - это может делать уже сам пользователь в броузере.

Quote:
Originally Posted by mazzy View Post
. я навскидку уже не помню, но в демопримере был случай, когда во вторую позицию с одними счетами прибылей и убытков могли записываться либо CostCenter, а в другие счета прибылей и убытков во вторую позицию могли записываться Purpose. Или нечто подобное. Причем в обоих списках были значения 010.
см. выше. пофиг на значения, они не сравниваются.

Quote:
Originally Posted by mazzy View Post
возвращаясь к статье:

разбирать аналитики на примере банковских проводок - не очень. либо надо обосновать каким образом на банковских проводках могут возникнуть разные комбинации аналитик.

для каждой view стоит привести пример данных. Особенно для таких "By that we will get a Carthesian product of all possible combinations between them".
сделал. хотя не очень понимаю, чем облегчит муки и страдания.

Quote:
Originally Posted by mazzy View Post
очень хотелось бы статью, в которой раскрывались бы решения для следующих обыденных задач:

задача 1: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010. В какой бы позиции не находился CostCenter. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010.

задача 1': то же самое, что в задаче 1, только CostCenter = 01*.
задача 1'': то же самое, что в задаче 1, только CostCenter = 01*..02*,!021.


задача 2: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010 и Department = 010. В какой бы позиции не находились CostCenter и Department. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010.
похоже, я точно что-то важное пропускаю с этими "позициями"... можешь попробовать прикрутить предложенное решение к таблице с твоими проводками и проверить, как оно работает? дать тебе проектик, чтоб не колупать руками?

Quote:
Originally Posted by mazzy View Post
задача ***: отфильтровать с условием "или". в запросах по остальным значениям (не финансовая аналитика) в поисковом выражении можно использовать скобки.
https://axapta.mazzy.ru/lib/search/
это уже выкрутасы с собственно фильтрами. думаю в сторону регулярных выражений. на той выборке, которую дают мои вьюхи можно измываться уже с готовой строкой аналитик, как душеньке угодно.

Quote:
Originally Posted by mazzy View Post
Примечание: можно посмотреть в 1С:Бухгалтерию, в которой задача выборки по субконто давно решена. можно также рассказать какой ценой решили эту задачу в 1С:Бухгалтерии.
ну, там можно много чего посмотреть, как можно было сделать в аксе. я с того свою забугорную карьеру и начал. пришёл на первое собеседование и сразу им сказал, что аксапту не знаю, но щас вам, парни, расскажу, как всё круто сделано в 1С. они меня и взяли сразу

Quote:
Originally Posted by mazzy View Post
опять же - и Business unit, и Department может находится в разных позициях в разных проводках.
в том числе, в некоторых случаях сначала может идти Business unit, а затем Department. а в некоторых - сперва Department, а затем Business unit. Причем между этими аналитиками могут быть расположены другие аналитики.
ну, мы по кругу ходить не будем. это же одно и то же ты повторил многократно. если не работает, то приведи мне пример, где оно не так работает?


Quote:
Originally Posted by mazzy View Post
статья о фильтрации по чудо-финансовым-аналитикам без рассмотрения таких случаев не может трактоваться как полезная.

му-ха-ха-ха!!!
да там не му-ха-ха! там гы-ы-ы-ы! потому что ты ещё не видел running totals по всем датам!

Quote:
Originally Posted by mazzy View Post
ни в коем случае не хочу принижать достоинства статьи и изложенного подхода.
Хочу сказать лишь одно - архитекторы, которые это чудо задолжили в Аксапту... они как собирались выполнять фильтрацию? какой способ по их мнению должны были использовать пользователи?

приходит такой пользователь и спрашивает "как отфильтровать по CostCenter"
а архитектор отвечает - "нет-нет, ты еще не готов к этому" https://coub.com/view/1avfh5
это оч хороший вопрос. ау? где вы, архитекторы? я бы тоже с удовольствием послушал. по-моему, тут же была пара светлых голов, которые писали статьи на эту тему? trud?

Quote:
Originally Posted by mazzy View Post
а для продвинутых програмеров-в-закрытой-системе он начинает ответ с фразы "Let's solve this problem step by step..."



е-е-е-е-е!!!!
we - это пользователи? или программисты?
сколько таких вью должны создать программисты в закрытой системе, чтобы пользователи хотя бы перестали ругаться?
разумеется, мы - программисты (народ мускулистый)

Quote:
Originally Posted by mazzy View Post
серьезно?
и сколько значений сможет обслуживать этот подход к фильтрации?
какие тебе видятся проблемы с масштабированием? в каком именно месте?

Quote:
Originally Posted by mazzy View Post
можно ли вводить значения как критерий через запятую? со звездочкой? а с другими мета символами?
куда ты собрался вводить? в постановке задачи можно лишь выбрать набор атрибутов (Dimension set)

Quote:
Originally Posted by mazzy View Post
фиг с ними, с пользователями.
если использовать этот подход программно, то из кода сколько значений для фильтрации предполагается?
не понял вопроса.

Quote:
Originally Posted by mazzy View Post
...without relation in outer join
серьезно?
а как ещё можно получить все возможные комбинации, как ни всех на всех перемножить? нормальный вариант, но нужно примерно представлять масштабы бедствия перед такими ковровыми бомбардировками. в моём случае всех значений всего 3500. перемножить на 2,3,....12 атрибутов - не бог весть какая беда.

Quote:
Originally Posted by mazzy View Post
опять же со всем восхищением к изворотливости ума.
но задача тривиальной фильтрации действительно требует вот такого кода?
ещё разок: тут задача группировки, во-первых, а во-вторых, фильтрации по выбранным атрибутам, а не по значениям.


Quote:
Originally Posted by mazzy View Post
серьезно?!
в аксе есть табличка со значениями выбранных атрибутов в столбцах, которые можно легко слепить в одну строку, но... ты просто загляни в неё... только сядь, если стоишь, а лучше ляг. я не в состоянии придумать динамический подход к этой подзадаче. поэтому просто провернул этот фокус с прямым запросом в сикеле. видимо, сказывается сертификация в QlikView.

моей первой реакцией на эту задачу было вынести всё это из аксапты к свиньям собачьим (то есть, в какой-нибудь там PowerBI или т.п.), но архитектор сказал "don't ссы и делай всё тута". ну, вот я и сделал.

спасибо за дискуссию. интересно обсудить этот сюжет с двух сторон: как вообще юзера должны управляться с измерениями, и как можно улучшить (или даже исправить косяки) этого конкретного решения.
__________________
Felix nihil admirari

Last edited by wojzeh; 10.08.2019 at 21:51.
This post has been rated by: mazzy (93).
Old 10.08.2019, 21:55   #7  
wojzeh is offline
wojzeh
Участник
wojzeh's Avatar
Соотечественники
 
681 / 517 (19) +++++++
Join Date: 27.04.2006
Location: Montreal
Quote:
Originally Posted by mazzy View Post
понятия не имею. кстати, тоже бы посмотрел на ответ.

а вот пользователи точно НЕ формулируют свои вопросы в терминах Financial dimension sets
с удовольствием послушаю как можно применить Financial dimension sets в ответе на вопрос "как отфильтровать по CostCenter"
да никак. в том-то и пуля, что в транзакциях один набор используется, а пользователю хочется другой.

дополнительная проблема в том, что не для всех атрибутов есть наборы значений (затем и нужен тут тов. Декарт)
__________________
Felix nihil admirari
Old 12.08.2019, 14:17   #8  
fed is offline
fed
Moderator
fed's Avatar
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,914 / 5737 (197) ++++++++++
Join Date: 13.03.2002
Location: Hüfingen,DE
Возможно, я невнимательно читал дискуссию, но ведь в D365FO значения аналитик продублированы в динамические (то есть - не видимые в AOD и создаваемые во время настроек ГК) поля в таблицах DimensionAttributeValueSet (для default dimensions) и DimensionAttributeValueCombination (для LedgerDimension) ). FieldId этих полей можно получить через вызовы функций, а потом добавить в query или в calculated field во view.
Например:
X++:
FieldId costcenterFieldId = DimensionAttributeValueSet::getDimensionValueFieldId('COSTCENTER'); //fieldId аналитики costCenter для default Dimension
FieldId costCenterFieldId = DimensionAttributeCombination::getDimensionValueFieldId('COSTCENTER'); //fieldId аналитики costCenter для Ledger dimension
DimensionAttributeCombination::getDimensionKeyFieldId('COSTCENTER'); //fieldId поля со ссылкой по recId на значение аналитики costCenter для LedgerDimension.
После того как fieldId получен можно эти таблицы заджойнить например с custTable (для dimensionAttributeValueSet) или с GeneralJournalAccountEntry (для DimensionAttributeCombination), потом создать range по fieldId и поискать по условию !"".
Второй вариант я не пробовал, но dimensionAttributeValueSet с custTable и vendTable я джойнил и значение аналитики через calculated field во view вытаскивал. Работает без проблем, фильтрует, сортирует, группирует и тп (поскольку это обычное поле, сделанное почти как в DAX2009).

Last edited by fed; 12.08.2019 at 15:05.
This post has been rated by: trud (5).
Old 12.08.2019, 15:29   #9  
raz is offline
raz
NavAx
raz's Avatar
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,500 / 1098 (40) ++++++++
Join Date: 22.07.2003
Location: МО
https://community.dynamics.com/ax/f/...ensions-in-ax7

X++:
    private void test()
    {
        GeneralJournalAccountEntry          generalJournalAccountEntry;
        GeneralJournalEntry                 generalJournalEntry;
        DimensionAttributeValueCombination  dimensionAttributeValueCombination;

        Query                               query = new Query();
        QueryRun                            queryRun;
        QueryBuildDataSource                qbds1, qbds2, qbds3;

        str                                 strData;
        
        qbds1 = query.addDataSource(tableNum(GeneralJournalAccountEntry));
        qbds1.addSelectionField(fieldNum(GeneralJournalAccountEntry, TransactionCurrencyAmount), SelectionField::Sum);
        qbds1.addSelectionField(fieldNum(GeneralJournalAccountEntry, AccountingCurrencyAmount), SelectionField::Sum);
        qbds1.addGroupByField(fieldNum(GeneralJournalAccountEntry, TransactionCurrencyCode));

        qbds2 = qbds1.addDataSource(tableNum(GeneralJournalEntry));
        qbds2.relations(false);
        qbds2.addLink(fieldNum(GeneralJournalAccountEntry, GeneralJournalEntry), fieldNum(GeneralJournalEntry, RecId));
        qbds2.fetchMode(QueryFetchMode::One2One);
        qbds2.addGroupByField(fieldNum(GeneralJournalEntry, AccountingDate));
        qbds2.addGroupByField(fieldNum(GeneralJournalEntry, SubledgerVoucherDataAreaId));

        qbds3 = qbds1.addDataSource(tableNum(DimensionAttributeValueCombination));
        qbds3.relations(false);
        qbds3.addLink(fieldNum(GeneralJournalAccountEntry, LedgerDimension), fieldNum(DimensionAttributeValueCombination, RecId));
        qbds3.fetchMode(QueryFetchMode::One2One);
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(MainAccountValue)));
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(BusinessUnitValue)));
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(LegalEntityValue)));
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(DepartmentValue)));

        queryRun = new QueryRun(query);

        while (queryRun.next())
        {
            generalJournalAccountEntry         = queryRun.get(tableNum(GeneralJournalAccountEntry));
            generalJournalEntry                = queryRun.get(tableNum(GeneralJournalEntry));
            dimensionAttributeValueCombination = queryRun.get(tableNum(DimensionAttributeValueCombination));

            strData = strFmt('%1;%2;%3;%4;%5;%6;%7;%8;%9;', 
                generalJournalAccountEntry.TransactionCurrencyAmount,
                generalJournalAccountEntry.AccountingCurrencyAmount,
                generalJournalAccountEntry.TransactionCurrencyCode,
                generalJournalEntry.AccountingDate,
                generalJournalEntry.SubledgerVoucherDataAreaId,
                dimensionAttributeValueCombination.(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(MainAccountValue))),
                dimensionAttributeValueCombination.(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(BusinessUnitValue))),
                dimensionAttributeValueCombination.(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(LegalEntityValue))),
                dimensionAttributeValueCombination.(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(DepartmentValue))),
                );
        }
    }
Old 12.08.2019, 15:35   #10  
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 raz View Post
X++:
        qbds1.addSelectionField(fieldNum(GeneralJournalAccountEntry, TransactionCurrencyAmount), SelectionField::Sum);
группировка по валюте?
__________________
полезное на axForum, github, vk, coub.
Old 12.08.2019, 15:40   #11  
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 raz View Post
X++:
        qbds3 = qbds1.addDataSource(tableNum(DimensionAttributeValueCombination));
....
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(MainAccountValue)));
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(BusinessUnitValue)));
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(LegalEntityValue)));
        qbds3.addGroupByField(fieldName2Id(tableNum(DimensionAttributeValueCombination), identifierStr(DepartmentValue)));
Я правильно понимаю, что сейчас есть таблица, устроенная подобно InventDim, в которой каждое значение аналитики находится в своей колонке. а в GeneralJournalAccountEntry указывается идентификатор, подобный InventDim?
__________________
полезное на axForum, github, vk, coub.
Old 12.08.2019, 15:59   #12  
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 fed View Post
После того как fieldId получен
почему fieldid один?

насколько я помню, их может быть насколько в зависимости от того какой dimSet используется.

насколько я помню, в том то и проблема, что эта финансовая аналитика была устроена как субконто в 1С:Бухаглтерии, а не как InventDim в Аксапте. Другими словами, не было таблицы в которой в одной колонке были бы значения одной финансовой аналитики.

конечно могу сильно ошибаться, поскольку уже давно в новые аксапты не заглядывал. очень хочется увидеть статьи на тему - как легко делать выборку финансовой аналитики в интерфейсе пользователя, в программном коде X++, а также из внешних систем (SQL запрос, MDX-запрос, C# и прочее). Ну, или хоть как-нибудь.
Quote:
Originally Posted by mazzy View Post
задача 1: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010. В какой бы позиции не находился CostCenter. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010.

задача 1': то же самое, что в задаче 1, только CostCenter = 01*.
задача 1'': то же самое, что в задаче 1, только CostCenter = 01*..02*,!021.


задача 2: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010 и Department = 010. В какой бы позиции не находились CostCenter и Department. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010.

задача ***: отфильтровать с условием "или". в запросах по остальным значениям (не финансовая аналитика) в поисковом выражении можно использовать скобки.
https://axapta.mazzy.ru/lib/search/


Примечание: можно посмотреть в 1С:Бухгалтерию, в которой задача выборки по субконто давно решена. можно также рассказать какой ценой решили эту задачу в 1С:Бухгалтерии.
__________________
полезное на axForum, github, vk, coub.

Last edited by mazzy; 12.08.2019 at 16:01.
Old 12.08.2019, 16:20   #13  
fed is offline
fed
Moderator
fed's Avatar
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,914 / 5737 (197) ++++++++++
Join Date: 13.03.2002
Location: Hüfingen,DE
Quote:
Originally Posted by mazzy View Post
насколько я помню, в том то и проблема, что эта финансовая аналитика была устроена как субконто в 1С:Бухаглтерии, а не как InventDim в Аксапте.
Ну вот сейчас (то есть - по крайней мере начиная с D365FOE 7.30, но вероятно и с более ранних версий), все сделано именно как inventDim. То есть - в дополнение к хитромудрым таблицам DAX2012, в таблички, на которые ссылаются DefaultDimension и ledgerDimension добавлены поля со значениями аналитик.
Поэтому, для настройки аналитик, система требует входа в Maintanance Mode (просто чтобы не добавлять новые поля, когда другие пользователи работают)
Old 12.08.2019, 16:28   #14  
fed is offline
fed
Moderator
fed's Avatar
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,914 / 5737 (197) ++++++++++
Join Date: 13.03.2002
Location: Hüfingen,DE
Гм. Пожалуй вот здесь вот есть наиболее полный пример работы с новым методом доступа к аналитике.
This post has been rated by: Logger (3).
Old 12.08.2019, 16:38   #15  
raz is offline
raz
NavAx
raz's Avatar
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,500 / 1098 (40) ++++++++
Join Date: 22.07.2003
Location: МО
Quote:
Originally Posted by mazzy View Post
группировка по валюте?
Это был тестовый Job, что бы поверить, рабочий вариант не такой.
Old 12.08.2019, 16:41   #16  
wojzeh is offline
wojzeh
Участник
wojzeh's Avatar
Соотечественники
 
681 / 517 (19) +++++++
Join Date: 27.04.2006
Location: Montreal
Quote:
Originally Posted by mazzy View Post
Я правильно понимаю, что сейчас есть таблица, устроенная подобно InventDim, в которой каждое значение аналитики находится в своей колонке. а в GeneralJournalAccountEntry указывается идентификатор, подобный InventDim?
ага. на-ка вот, насладись красотой!

Click image for larger version

Name:	DimensionAttributeValueCombination.png
Views:	10009
Size:	95.6 KB
ID:	12365

открываешь такой это чудо-юдо в бровзере, а там - хоба-на!

Click image for larger version

Name:	DimensionAttribute2.png
Views:	9775
Size:	74.9 KB
ID:	12366

круче, чем у копперфильда, разрезающего амаяка акопяна!

а поиск идёт по имени столбца

X++:
/// <summary>
    /// Gets the Value fieldId of the <c>DimensionAttributeValueCombination</c> table for a <c>DimensionAttribute</c> name.
    /// </summary>
    /// <param name = "_dimensionAttributeName">The name of the <c>DimensionAttribute</c>.</param>
    /// <returns>The Id of the Value field.</returns>
    public static FieldId getDimensionValueFieldId(Name _dimensionAttributeName)
    {
        container cachedResult = DimensionCache::getValue(DimensionCacheScope::DimensionKeyValueColumn, [DimensionMetadataConstants::DimensionCombinationValueColumn, _dimensionAttributeName]);

        if (cachedResult == conNull())
        {
            DimensionAttribute dimensionAttribute = DimensionAttribute::findByName(_dimensionAttributeName);

            if (!dimensionAttribute)
            {
                throw error(Error::wrongUseOfFunction(funcName()));
            }

            if (dimensionAttribute.getStatus() == DimensionAttributeStatus::Inactive)
            {
                throw error("@Dimension:DimensionAttributeInactive");
            }

            cachedResult = [fieldName2id(tableNum(DimensionAttributeValueCombination), dimensionAttribute.DimensionValueColumnName)];
            DimensionCache::insertValue(DimensionCacheScope::DimensionKeyValueColumn, [DimensionMetadataConstants::DimensionCombinationValueColumn, _dimensionAttributeName], cachedResult);
        }

        FieldId dimensionAttributeFieldId = conpeek(cachedResult, 1);

        return dimensionAttributeFieldId;
    }
Name:  DimensionAttribute.png
Views: 4332
Size:  54.0 KB
__________________
Felix nihil admirari
This post has been rated by: mazzy (2).
Old 12.08.2019, 16:42   #17  
wojzeh is offline
wojzeh
Участник
wojzeh's Avatar
Соотечественники
 
681 / 517 (19) +++++++
Join Date: 27.04.2006
Location: Montreal
Quote:
Originally Posted by fed View Post
Возможно, я невнимательно читал дискуссию, но ведь в D365FO значения аналитик продублированы в динамические
и как это помогает решит поставленную задачу?
__________________
Felix nihil admirari
Old 12.08.2019, 16:44   #18  
wojzeh is offline
wojzeh
Участник
wojzeh's Avatar
Соотечественники
 
681 / 517 (19) +++++++
Join Date: 27.04.2006
Location: Montreal
Quote:
Originally Posted by raz View Post
Это был тестовый Job, что бы поверить, рабочий вариант не такой.
мой-то вариант чем не рабочий?
__________________
Felix nihil admirari
Old 12.08.2019, 16:48   #19  
wojzeh is offline
wojzeh
Участник
wojzeh's Avatar
Соотечественники
 
681 / 517 (19) +++++++
Join Date: 27.04.2006
Location: Montreal
Quote:
Originally Posted by fed View Post
Гм. Пожалуй вот здесь вот есть наиболее полный пример работы с новым методом доступа к аналитике.
Quote:
New dimension fields are added when a dimension is activated.
и как это возможно отловить в рамках поставленной задачи? (хинт: никак)
__________________
Felix nihil admirari
Old 12.08.2019, 17:01   #20  
fed is offline
fed
Moderator
fed's Avatar
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,914 / 5737 (197) ++++++++++
Join Date: 13.03.2002
Location: Hüfingen,DE
Quote:
Originally Posted by wojzeh View Post
и как это возможно отловить в рамках поставленной задачи? (хинт: никак)
Ну я не вполне понимаю, что считается исходной задачей, но я бы попробовал создать calculated field, которое бы конкатенировало значения аналитик из упомянутых мною таблиц, без использования каких-либо дополнительных view.

Ну и вообще - хотелось просто Mazzy указать, что его представления о финансовой аналитике - несколько устаревшие,
P.S. Да и вообще можно просто подджойнить любую таблицу либо к DimensionAttributeValueSet, либо к DimensionAttributeValueCombination и сделать маленький универсальный метод, который бы все значения аналитик из одной из этих таблиц к гриду добавляет. И пусть пользователь там сам ищет как хочет - даже без конкатенации.

Last edited by fed; 12.08.2019 at 17:06.
This post has been rated by: mazzy (2), Logger (3).
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
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
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

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 03:19.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.