|
10.08.2019, 12:50 | #1 |
Участник
|
прежде всего, огромное спасибо.
Цитата:
я думаю, что в статье обязательно требуется рассмотреть случай, когда в одной позиции могут находится несколько разных аналитик, в списке которых есть одинаковые значения. я навскидку уже не помню, но в демопримере был случай, когда во вторую позицию с одними счетами прибылей и убытков могли записываться либо 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С:Бухгалтерии. Цитата:
в том числе, в некоторых случаях сначала может идти Business unit, а затем Department. а в некоторых - сперва Department, а затем Business unit. Причем между этими аналитиками могут быть расположены другие аналитики. статья о фильтрации по чудо-финансовым-аналитикам без рассмотрения таких случаев не может трактоваться как полезная. му-ха-ха-ха!!! ни в коем случае не хочу принижать достоинства статьи и изложенного подхода. Хочу сказать лишь одно - архитекторы, которые это чудо задолжили в Аксапту... они как собирались выполнять фильтрацию? какой способ по их мнению должны были использовать пользователи? приходит такой пользователь и спрашивает "как отфильтровать по CostCenter" а архитектор отвечает - "нет-нет, ты еще не готов к этому" https://coub.com/view/1avfh5 а для продвинутых програмеров-в-закрытой-системе он начинает ответ с фразы "Let's solve this problem step by step..." е-е-е-е-е!!!! we - это пользователи? или программисты? сколько таких вью должны создать программисты в закрытой системе, чтобы пользователи хотя бы перестали ругаться? серьезно? и сколько значений сможет обслуживать этот подход к фильтрации? можно ли вводить значения как критерий через запятую? со звездочкой? а с другими мета символами? фиг с ними, с пользователями. если использовать этот подход программно, то из кода сколько значений для фильтрации предполагается? Цитата:
Сообщение от Blog bot
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; } опять же со всем восхищением к изворотливости ума. но задача тривиальной фильтрации действительно требует вот такого кода? Цитата:
Сообщение от Blog bot
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, '')"; } Последний раз редактировалось mazzy; 10.08.2019 в 13:37. |
|
10.08.2019, 14:03 | #2 |
Участник
|
Цитата:
А чем для задачи Financial dimension sets не подошли, они вроде как раз для группировки нужны(если я правильно понял проблему) |
|
10.08.2019, 14:57 | #3 |
Участник
|
понятия не имею. кстати, тоже бы посмотрел на ответ.
а вот пользователи точно НЕ формулируют свои вопросы в терминах Financial dimension sets с удовольствием послушаю как можно применить Financial dimension sets в ответе на вопрос "как отфильтровать по CostCenter" |
|
10.08.2019, 21:55 | #4 |
Участник
|
Цитата:
дополнительная проблема в том, что не для всех атрибутов есть наборы значений (затем и нужен тут тов. Декарт)
__________________
Felix nihil admirari |
|
10.08.2019, 15:02 | #5 |
Участник
|
и кстати, не соглашусь.
подход в статье очень интересный и хитроумный. другое дело, что даже для proof of concept с такой фин.аналитикой нужно быть еще хитроумнее. беда в том, что в ax2012 и выше для ответа тривиальный вопрос про фильтрацию по фин.аналитике требуется очень хитроумный ответ программиста. Financial dimension values concatened by mask Последний раз редактировалось mazzy; 10.08.2019 в 15:06. |
|
10.08.2019, 21:40 | #6 |
Участник
|
на здоровье! может, стоит слить оба топика, а то и так мозг плавится, а тут два треда получились?
Цитата:
Цитата:
Цитата:
Сообщение от mazzy
. я навскидку уже не помню, но в демопримере был случай, когда во вторую позицию с одними счетами прибылей и убытков могли записываться либо CostCenter, а в другие счета прибылей и убытков во вторую позицию могли записываться Purpose. Или нечто подобное. Причем в обоих списках были значения 010.
Цитата:
Сообщение от mazzy
возвращаясь к статье:
разбирать аналитики на примере банковских проводок - не очень. либо надо обосновать каким образом на банковских проводках могут возникнуть разные комбинации аналитик. для каждой view стоит привести пример данных. Особенно для таких "By that we will get a Carthesian product of all possible combinations between them". Цитата:
Сообщение от mazzy
очень хотелось бы статью, в которой раскрывались бы решения для следующих обыденных задач:
задача 1: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010. В какой бы позиции не находился CostCenter. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010. задача 1': то же самое, что в задаче 1, только CostCenter = 01*. задача 1'': то же самое, что в задаче 1, только CostCenter = 01*..02*,!021. задача 2: отфильтровать проводки по счетам прибылей и убытков с CostCenter = 010 и Department = 010. В какой бы позиции не находились CostCenter и Department. При условии, что эти же позиции могут занимать другие аналитики И в этих других аналитиках также может существовать значение 010. Цитата:
Сообщение от mazzy
задача ***: отфильтровать с условием "или". в запросах по остальным значениям (не финансовая аналитика) в поисковом выражении можно использовать скобки.
https://axapta.mazzy.ru/lib/search/ Цитата:
Цитата:
Сообщение от mazzy
опять же - и Business unit, и Department может находится в разных позициях в разных проводках.
в том числе, в некоторых случаях сначала может идти Business unit, а затем Department. а в некоторых - сперва Department, а затем Business unit. Причем между этими аналитиками могут быть расположены другие аналитики. Цитата:
Цитата:
Сообщение от mazzy
ни в коем случае не хочу принижать достоинства статьи и изложенного подхода.
Хочу сказать лишь одно - архитекторы, которые это чудо задолжили в Аксапту... они как собирались выполнять фильтрацию? какой способ по их мнению должны были использовать пользователи? приходит такой пользователь и спрашивает "как отфильтровать по CostCenter" а архитектор отвечает - "нет-нет, ты еще не готов к этому" https://coub.com/view/1avfh5 Цитата:
Сообщение от mazzy
а для продвинутых програмеров-в-закрытой-системе он начинает ответ с фразы "Let's solve this problem step by step..."
е-е-е-е-е!!!! we - это пользователи? или программисты? сколько таких вью должны создать программисты в закрытой системе, чтобы пользователи хотя бы перестали ругаться? Цитата:
Цитата:
Цитата:
а как ещё можно получить все возможные комбинации, как ни всех на всех перемножить? нормальный вариант, но нужно примерно представлять масштабы бедствия перед такими ковровыми бомбардировками. в моём случае всех значений всего 3500. перемножить на 2,3,....12 атрибутов - не бог весть какая беда. Цитата:
в аксе есть табличка со значениями выбранных атрибутов в столбцах, которые можно легко слепить в одну строку, но... ты просто загляни в неё... только сядь, если стоишь, а лучше ляг. я не в состоянии придумать динамический подход к этой подзадаче. поэтому просто провернул этот фокус с прямым запросом в сикеле. видимо, сказывается сертификация в QlikView. моей первой реакцией на эту задачу было вынести всё это из аксапты к свиньям собачьим (то есть, в какой-нибудь там PowerBI или т.п.), но архитектор сказал "don't ссы и делай всё тута". ну, вот я и сделал. спасибо за дискуссию. интересно обсудить этот сюжет с двух сторон: как вообще юзера должны управляться с измерениями, и как можно улучшить (или даже исправить косяки) этого конкретного решения.
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 10.08.2019 в 21:51. |
|
|
За это сообщение автора поблагодарили: mazzy (93). |
25.09.2019, 16:33 | #7 |
Участник
|
Цитата:
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 |
|
|
|