Melhores Práticas para o Cálculo em Aplicativos de Dimensionalidade Estendida

Aplicativos de Dimensionalidade Estendida com Conta como a Dimensão Densa

Se estiver usando um aplicativo de Dimensionalidade Estendida com Conta como a dimensão Densa, você poderá usar essas técnicas de criação de scripts. Observe os seguintes pontos pertencentes a esses aplicativos:

  1. Ordem de dimensão: A dimensão Movimento é a primeira dimensão Esparsa na ordem de dimensões, conhecida como uma dimensão de bitmap.

  2. Os membros pai da dimensão Intercompanhia são Cálculo dinâmico.

  3. É necessário que todas as dimensões personalizadas tenham membros pai definidos como Cálculo Dinâmico.

  4. A ideia é ter uma contagem mínima de blocos de nível superior e obter agregações dinâmicas durante as operações de planilhas.

  5. Os pontos 2 e 3 acima desempenham um papel importante durante a criação de cálculos personalizados, sem considerar a necessidade de reescrever cálculos existentes, caso sejam usados membros Superiores/Pai em cálculos existentes.


Dimensões Conta e Movimento Estendidas

SET HYBRIDBSOINCALCSCRIPT FULL / NONE

HYBRIDBSOINCALCSCRIPT é obrigatório quando o lado direito da expressão tem membros superiores, por exemplo:

"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2";

Nesse caso, você precisa desabilitar HYBRIDBSOINCALCSCRIPT para a linha de objeção e, em seguida, reabilitá-la depois da execução da linha de objeção, por exemplo:

SET HYBRIDBSOINCALCSCRIPT NONE
"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2"; SET HYBRIDBSOINCALCSCRIPT FULL;

Se necessário, lembre-se de que isso só deve ser feito para regras de cálculo configurável (ponto de inserção).

SET HYBRIDBSOINCALCSCRIPT FULL / NONE

Às vezes, quando só existe um membro superior no lado direito, HYBRIDBSOINCALCSCRIPT retarda a expressão, por exemplo:

"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2";

Nesse caso, você precisa desabilitar HYBRIDBSOINCALCSCRIPT para a linha de objeção e, em seguida, reabilitá-la depois da execução da linha de objeção, por exemplo:

SET HYBRIDBSOINCALCSCRIPT NONE
"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2"; SET HYBRIDBSOINCALCSCRIPT FULL;

Se necessário, lembre-se de que isso só deve ser feito para regras de cálculo configurável (ponto de inserção).

Técnica de Adição Sucessiva

"Target_Account_Stored" -> "Mvmt_None" = "FCCS_Mvmts_Subtotal" -> "Source_Account_DynamicCalc" -> "Total Custom1" -> "Total Custom2";

Neste exemplo, a intenção é armazenar o resultado do cálculo dinâmico no lado direito, em um membro Denso armazenado. Esse cálculo não será realizado se executado com SET HYBRIDBSOINCALCSCRIPT FULL. Nessas situações, com base nos operadores de consolidação dos membros de nível zero da dimensão Personalizada definida como Adição, você pode usar uma técnica conhecida como adição sucessiva. Uma vez que a dimensão Conta é Esparsa, você usa FIX em membros do nível zero sob a conta de origem Cálculo Dinâmico. Paralelamente, lembre-se de desativar o modo Híbrido.

1.       SET HYBRIDBSOINCALCSCRIPT NONE; /* Turn OFF Hybrid mode */
2.      FIX( @RELATIVE( "Total Custom1", 0 ), @RELATIVE( "Total Custom2", 0 ), <other dimension members of FIX> )
3.      "FCCS_Mvmts_Subtotal" ( @CALCMODE( BOTTOMUP );
4.      "Target_Account_Stored" -> "Mvmt_None" = "Target_Account_Stored" -> "Mvmt_None" + "Source_Account_DynamicCalc";
5.      )
6.      ENDFIX

Considere o caso a seguir no qual alguns membros Custom1 de nível zero tenham o operador de consolidação definido como se segue: os membros Custom1_A e Custom1_B têm o operador de consolidação definido como Subtração.


Exemplo de Adição Sucessiva 3

Uma importante consideração ao usar essa técnica: Quando a regra de negócios for executada várias vezes, é bem possível que a conta de destino tenha um valor acumulado. Isso resulta em números incorretos. Portanto, considere inicializar o valor de destino para #Missing, em um processo BOTTOMUP, pois o script seria executado pelo menos uma vez.


Exemplo de Adição Sucessiva 4

Evite estas construções:

  1. CALC DIM, CALC ALL, AGG e quaisquer outras expressões sem atribuição que calculem uma subárvore. Uma prática sugerida é limitar o uso de CALC DIM e AGG às dimensões em que nenhum membro armazenado dependa de membros dinâmicos.

  2. Não use CREATENONMISSINGBLOCK ou CREATEBLOCKONEQ em scripts de cálculo.

  3. Evite usar essas funções nos pontos de inserção:

    • @ALLOCATE

    • @CREATEBLOCK

    • @IRREX

    • @MDALLOCATE

    • @MDSHIFT

    • @MOVSUMX

    • @PTD

    • @SANCESTVAL

    • @STDEV

    • @STDEVP

    • @STDEVRANGE

    • @SYD

    • @TREND

Como Usar um Bloco de Membros Esparsos e BOTTOMUP

Cenário de Aplicativo de Dimensão Não Estendida

1.FIX ("FCCS_EntityInputFCCS_EntityInputFCCS_EntityInputFCCS_EntityInput FCCS_EntityInput FCCS_EntityInputFCCS_EntityInputFCCS_EntityInputFCCS_EntityInput", "Entity "Entity Currency" Currency" Currency" Currency" Currency" Currency" Currency" )
2.FIX ("Inventory_StockInventory_StockInventory_StockInventory_Stock Inventory_StockInventory_Stock Inventory_Stock Inventory_Stock ", "FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome ", "FCCS_NoFCCS_NoFCCS_NoFCCS_No FCCS_NoIntercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", "No "No Product", Product", Product", Product", Product", Product", Product", "FCCS_LocalFCCS_LocalFCCS_LocalFCCS_Local FCCS_Local GAAP" GAAP" GAAP" )
3."FCCS_ManagedFCCS_ManagedFCCS_ManagedFCCS_Managed FCCS_Managed FCCS_Managed Data" Data" Data" (
4."FCCS_OtherFCCS_OtherFCCS_OtherFCCS_Other FCCS_Other FCCS_Other Data" Data" Data" ="Warehouse_StockWarehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock " +"Showroom_Stock Showroom_StockShowroom_Stock Showroom_StockShowroom_Stock Showroom_Stock ";
5.)
6.ENDFIX
7.ENDFIX ENDFIX

Cenário de Aplicativo de Dimensão Estendida

8.FIX ("FCCS_EntityFCCS_EntityFCCS_EntityFCCS_Entity FCCS_Entity Input", Input", Input", Input", Input", Input", Input", "Entity "Entity Currency" Currency" Currency" Currency" Currency" Currency" Currency" )
9.FIX ("Inventory_StockInventory_StockInventory_StockInventory_Stock Inventory_StockInventory_Stock Inventory_Stock Inventory_Stock ", "FCCS_ManagedFCCS_Managed FCCS_Managed FCCS_ManagedFCCS_ManagedData" Data" Data" ,"FCCS_NoFCCS_NoFCCS_NoFCCS_No FCCS_NoIntercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", "No "No Product", Product", Product", Product", Product", Product", Product", "FCCS_LocalFCCS_LocalFCCS_LocalFCCS_Local FCCS_Local GAAP" GAAP" GAAP" )
10 ."FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome " (
11 ."FCCS_OtherFCCS_OtherFCCS_OtherFCCS_Other FCCS_Other FCCS_Other Data" Data" Data" ="Warehouse_StockWarehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock " +"Showroom_Stock Showroom_StockShowroom_Stock Showroom_StockShowroom_Stock Showroom_StockShowroom_Stock ";
12 .)
13 .ENDFIX ENDFIX
14 .ENDFIX

O membro Movimento "FCCS_Mvmts_NetIncome" é usado como âncora. A dimensão Movimento é considerada uma dimensão de bitmap. É a primeira dimensão esparsa depois da dimensão densa Conta. Na medida do possível, os cálculos envolvendo um único membro de dimensão Movimento devem usar o membro Movimento como bloco de membros (conhecido como âncora).

Cálculo Envolvendo Membros Principais/Pai como Origem

Origem de Aplicativo de Dimensão Não Estendida

1.       FIX ("Entity Currency", "FCCS_Entity Input")
2.      FIX("FCCS_Managed Data", "FCCS_Intercompany Top",
"Total Custom1", "Total Custom2")
3.      "FCCS_Mvmts_NetIncome"(
4.      IF(@ISLEV("Entity", 0))
5.      "Account 3" = "Account 1" + "Account 2";
6.      )
7.      ENDFIX
8.      ENDFIX

Cenário de Aplicativo de Dimensão Estendida

1.       FIX ("Entity Currency", "FCCS_Entity Input")
2.      FIX("Account 3" ,"FCCS_Managed Data", "FCCS_No Intercompany", "No Custom1", "No Custom2")

3.      "FCCS_Mvmts_NetIncome"(
4.      IF(@ISLEV("Entity", 0))
5.      "FCCS_Intercompany Top"->"Total Custom1"-
>"Total Custom2"->"Account 1" + "FCCS_Intercompany Top"-
>"Total Custom1"->"Total Custom2"->"Account 2"; 6.     )
7.      ENDFIX
8.      ENDFIX
  1. Os membros principais são Cálculos Dinâmicos e não podem ser utilizados em expressões FIX. Portanto, utilize-os no lado direito do cálculo e redirecione o resultado para"Sem <member>".

  2. Um único membro de dimensão densa que armazena o resultado do cálculo deverá ser inserido em FIX.

Melhores Práticas para o Cálculo em Aplicativos de Dimensionalidade Estendida

  • Só use o processamento BottomUp quando o cálculo do lado direito não envolver membros Principais/Pai.

  • Use @Remove para remover o membro denso, em vez de usar a verificação @ISMBR na dimensão densa.

  • Use @ISLEV booliano, em vez de@LEV e @CURRMBR.

  • Remova os membros restritos do FIX.

  • Use Copiar para criar o bloco de destino caso a abordagem de âncora não funcione.

  • O cálculo deve ser executado apenas no membro da dimensão Personalizada de destino.

  • Use @LIKE para tornar o script genérico.

  • Procure casos de borda.

  • Procurar primeiro os casos comum

  • Quando os cálculos direcionarem para um único membro da dimensão Movimento, use esse membro Movimento como um bloco de membros, conhecido como âncora.

  • Quando os cálculos direcionarem para um único membro de dimensão Conta em que a Conta é uma dimensão Densa, mova o membro Conta para FIX. Em um aplicativo em que Período e Movimento são os membros Densos, mova o membro Conta para o lado esquerdo do cálculo.

Aplicativos de Dimensão Estendida usam um modo de agregação híbrida. O construto SET HYBRIDBSOINCALCSCRIPT está disponível como parte do Calculation Manager e controla se os cubos do aplicativo utilizam o modo de agregação híbrida em scripts de cálculo quando os membros armazenados dependem de membros dinâmicos.

Para obter uma lista das funções Essbase suportadas nos aplicativos de Dimensionalidade Estendida, consulte "Funções Suportadas no Modo de Agregação Híbrida" em Oracle Essbase Technical Reference.

Caso de Uso do Cliente A

Neste caso de uso, os cálculos originais incluíam esses problemas:

  • Cálculos manuais de Fluxo de Caixa

  • O desempenho ficava lento quando eram inseridos cálculos de Fluxo de Caixa nos pontos de inserção, em comparação para quando não havia cálculos. A consolidação de uma entidade levava dois minutos, em comparação para um tempo de 40 segundos sem o cálculo.

  • O cálculo não pode usar o Fluxo de Caixa pré-implantado devido às respectivas práticas estatutárias.

Cálculos Originais

1.       FIX("Entity Currency", "FCCS_Entity Input")
2.      /* Account CA3_010 - CET1 Capital ratio */
3.      /* Account CA3_020 - Surplus(+)/Deficit(-) of CET1 capital */
4.      FIX ("FCCS_No Movement", "No Custom2", "No Custom3", "No Custom4", "FCCS_Data Input", "FCCS_No Intercompany")
5.      "Submitted" (
6.      "CA3_010" = ("FCCS_Mvmts_Subtotal"->"Total Custom1"->"Total Custom2"->"Total Custom3"-> "FCCS_Intercompany Top"->"FCCS_Total Data Source"->"FCCS_YTD"->"CA1_020" / "FCCS_Intercompany      Top"->"FCCS_Total Data Source"->"FCCS_YTD"-> "CA2_010") - @Prior("CA3_010"->"FCCS_YTD");

7.      "CA3_020" = ("FCCS_Mvmts_Subtotal"->"Total Custom1"->"Total Custom2"->"Total Custom3"-> "FCCS_Intercompany Top"->"FCCS_Total Data Source"->"FCCS_YTD"->"CA1_020" - ("FCCS_Intercompany Top"->"FCCS_Total Data Source"->"FCCS_YTD"->
"CA2_010" * 0.045)) - @Prior("CA3_020"->"FCCS_YTD");
8.      ENDFIX
9.      ENDFIX

O cálculo não é feito corretamente devido a estes motivos:

  1. Os cálculos do lado direito são basicamente consultas para o Essbase porque a maioria dos membros pai das respectivas dimensões são Cálculos Dinâmicos.

  2. No caso acima, estão sendo iniciadas duas consultas simultâneas, e o cálculo propriamente dito só começará quando os resultados forem extraídos, o que provocará um cache de fórmula lento.

  3. O script acima é executado para cada entidade, durante uma consolidação, independentemente do nível da entidade.

Cálculo Revisado

O exemplo a seguir mostra um cálculo revisado.

1.       SET HYBRIDBSOINCALCSCRIPT NONE; /*Turn OFF HYBRID BSO Mode */
2.      FIX("Entity Currency", "FCCS_Entity Input")
3.      /* Account CA3_010 - CET1 Capital ratio */
4.      /* Account CA3_020 - Surplus(+)/Deficit(-) of CET1 capital */
5.      /* First perform the natural aggregation in BOTTOMUP mode */
6.      FIX (@RELATIVE("Total Custom1", 0), @RELATIVE("Total Custom2", 0), @RELATIVE("Total Custom3", 0), "No Custom4",
@RELATIVE("FCCS_Total Data Source", 0), @RELATIVE("FCCS_Intercompany Top", 0))
7.      "FCCS_Mvmts_Subtotal"(@CALCMODE(BOTTOMUP);
8.      IF (@ISLEV("ENTITY", 0))
9.      "FCCS_No Movement"->"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_010" = "FCCS_No Movement"->
"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_010" + ("FCCS_YTD"->"CA1_020"/"FCCS_YTD"->"CA2_010");

10.     "FCCS_No Movement"->"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_020" = "FCCS_No Movement"->
"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_020" +
("FCCS_YTD"->"CA1_020" - ("FCCS_YTD"->"CA2_010" * 0.045));
11.     ENDIF;
12.     )
13.     ENDFIX
14.     /* Now leverage usage of @SHIFMINUS instead of subtraction and @PRIOR */
15.     FIX ("No Custom2", "No Custom3", "No Custom4", "FCCS_Data Input", "FCCS_No Intercompany", "Submitted", "CA3_010")
16.     "FCCS_No Movement"(@CALCMODE(BOTTOMUP);
17.     IF (@ISLEV("ENTITY", 0))
18.     @SHIFTMINUS("CA3_010", "FCCS_YTD"->"CA3_010", -1);
19.     ENDIF;
20.     )
21.     ENDFIX
22.     FIX ("No Custom2", "No Custom3", "No Custom4", "FCCS_Data Input", "FCCS_No Intercompany", "Submitted", "CA3_020")
23.     "FCCS_No Movement"(@CALCMODE(BOTTOMUP);
24.     IF (@ISLEV("ENTITY", 0))
25.     @SHIFTMINUS("CA3_020", "FCCS_YTD"->"CA3_020", -1);
26.     ENDIF;
27.     )
28.     ENDFIX
29.     ENDFIX

Aprimoramentos de Script

  • Cada cálculo de consulta é segregado como um FIX separado, e o membro denso de destino é movido para FIX

  • O script é executado apenas na entidade de nível zero, durante uma consolidação

  • O membro Movimento é usado como âncora

  • Desempenho aprimorado de dois minutos para 30 segundos por entidade

Aplicativos de Dimensionalidade Estendida com Conta como uma Dimensão Esparsa e Período e Movimento como Dimensões Densas

Esta seção descreve as técnicas de criação de scripts para aplicativos de Dimensionalidade Estendida que usam Conta como uma dimensão Esparsa. Quando você seleciona para criar um aplicativo ou converter um que já existe em um com Período e Movimento como dimensões Densas e Conta como uma dimensão Esparsa, lembre-se destes pontos:

  1. Período e Movimento são dimensões Densas.

  2. A dimensão Conta é Esparsa.

  3. Os membros da dimensão Movimento Pai Pré-implantados são Cálculos Dinâmicos.

  4. Os membros Pai da dimensão Intercompanhia são Cálculos Dinâmicos.

  5. Todos os membros Pai da dimensão Personalizada devem ser Cálculos Dinâmicos.

  6. A ideia é ter contagem mínima de blocos de nível superior e atingir agregações dinâmicas durante as operações de planilha.

  7. Os pontos 2 e 3 desempenham um papel importante durante a criação de cálculos personalizados, sem considerar a necessidade de reescrever cálculos existentes, caso sejam usados membros Pai em cálculos existentes.


Exemplo de dimensões Densa e Esparsa

Caso de Uso do Cliente A

Cálculo do membro IC_Inventory_Alloc da Origem de Dados, com base nos dados de origem dos dados FCCS_Managed

Antes da otimização


Caso de Uso do Cliente A

Cliente A - Script do Cálculo Original

  • a. Executa TOPDOWN

  • b. Usa membros Superiores do Cálculo Dinâmico do lado direito, causando assim lentidão na recuperação dos dados

  • c. O cálculo multiplica e divide desnecessariamente usando a mesma interseção


Detalhes do Caso de Uso do Cliente A

Caso de Uso do Cliente A - Script de Cálculo Modificado

O script de cálculo modificado usa a técnica de adição sucessiva e o processamento BOTTOMUP.

  • a. O cálculo é executado no modo BSO - SET HYBRIDBSOINCALCSCRIPT NONE

  • b. @CREATEBLOCK é usado para criar blocos IC_Inventory_Alloc de destino com base nos blocos de dados FCCS_Managed de origem, BOTTOMUP

  • c. No lugar dos membros Superiores do Cálculo Dinâmico, são usados membros armazenados no lado direito.


Script modificado do Caso de Uso do Cliente A

Caso de Uso do Cliente B

Esse cálculo de conta Excedente teve que ser reescrito após a migração para o modelo Conta como Esparsa. A propriedade Armazenamento de Dados dos membros pai pré-implantados na dimensão Movimento é Cálculo Dinâmico. Isso gerou alguns desafios, uma vez que os tempos de consolidação foram comprometidos. O cálculo teve que ser interrompido após a migração.

Tempo total do ano após a adoção de melhores práticas:


Resultados de tempo do Caso de Uso do Cliente B

Caso de Uso do Cliente B - Cálculo Original

No cálculo FCCS_20 original:

  • a. Os membros da dimensão Movimento foram usados como âncora. O membro "FCCS_Mvmts_Total" de Movimento é Cálculo Dinâmico, e não poderia ser usado como âncora.

  • b. A dimensão Conta é Esparsa, portanto, os membros superiores "FCCS_Total Liabilities and Equity" e "FCCS_Total Assets" no lado direito resultaram em tempos de cálculo mais lentos.


Script original do Caso de Uso do Cliente B

Exemplo de Caso de Uso Esparso 5

Caso de Uso do Cliente B - Cálculo Modificado

Este exemplo mostra o cálculo FCCS_20 modificado.

  • a. O membro Consolidação é usado como âncora.

  • b. A técnica de adição sucessiva é usada com FIX nos membros de nível zero de "FCCS_Total Liabilities and Equity" e "FCCS_Total Assets", primeiro adicionando todos os passivos e patrimônios líquidos e, em seguida, subtraindo todos os ativos


Caso de Uso do Cliente B - Cálculo Modificado