Melhores Práticas de Cálculos Configuráveis

Use estas melhores práticas ao trabalhar com cálculos configuráveis.

Conceitos de Cálculo

Estes são os conceitos essenciais para criar cálculos:

  • Blocos de Dados

  • Formato de Script Básico

  • Cálculos Ascendentes versus Descendentes

  • Modo Bloco versus Célula

Blocos de Dados

A imagem a seguir mostra um Bloco de Dados de um aplicativo de amostra.


Bloco de dados de amostra
  • Membros armazenados de dimensões densas constituem um Bloco de Dados. O tamanho do bloco para o aplicativo de amostra acima é 2 (Vendas e Caixa) x 8 bytes = 16 bytes.

  • Combinações exclusivas de membros de dimensões esparsas constituem ÍNDICES e apontam para Blocos de Dados. No aplicativo de amostra acima, há um total de 2 (Real, Orçamento) x 2 (FY17, FY18) x 2 (Jan, Fev) = 8 índices.


Índice das regras de amostra

Nos bancos de dados do Essbase Block Storage Option (BSO), um bloco constitui membros armazenados de uma dimensão Densa. No Financial Consolidation and Close, por padrão, Conta é a única dimensão Densa.

Neste exemplo, a dimensão Conta é Densa e tem 1977 membros armazenados. Isso indica que um único bloco do Console do Banco de Dados do BSO tem 1977 células – cada uma representa um membro Conta.

O tamanho do Bloco, em bytes será:

  • Tamanho do Bloco (Bytes) = Número de membros armazenados na Conta * 8

  • Tamanho do Bloco (Bytes) = 1977 * 8 = 15.816 bytes


Exemplo de propriedades do banco de dados

Observação: Para ver as propriedades do banco de dados, no Calculation Manager, selecione Ação e, em seguida, Propriedades do Banco de Dados.

Práticas Recomendadas para a Criação de Blocos de Dados

Quando um cálculo configurável que grava em uma célula de dados é executado, deve haver um bloco de dados para que os dados sejam gravados no banco de dados.

Blocos de dados são combinações de membros de dimensões Esparsa e Densa armazenadas.

São criados blocos de dados separados para cada combinação de dimensões esparsas armazenadas. Os membros de uma dimensão Densa constituem um bloco.

Quando você cria cálculos configuráveis, pode ser necessário criar blocos adicionais para armazenar os resultados calculados e resolver problemas de dados ausentes.

Você pode habilitar a opção Criar Blocos Automaticamente para que o sistema crie os blocos ausentes automaticamente. Consulte Habilitação de Criação Automática de Blocos para Cálculos Configuráveis.

Se usar o processamento Ascendente em seus cálculos configuráveis, você deverá criar os blocos de dados manualmente ou garantir que já existam blocos de dados.

Você pode criar blocos de dados manualmente usando um destes métodos:

  • Atribuição de dados durante o processo de carregamento de dados. Por exemplo, grave "Zero" em uma interseção única de membro Densa e depois grave "#missing" para limpar o "Zero" após a criação do bloco.


    Script de amostra para a criação de blocos
  • Uso do comando DATACOPY do Essbase, no qual todos os blocos da origem são copiados para o destino, inclusive as células ausentes. No entanto, esse método pode criar blocos desnecessários e retardar o processo de consolidação.

Quando usar Criar Blocos Automaticamente

Criar Blocos Automaticamente é uma configuração fornecida para criar blocos ausentes durante um Cálculo Configurável.

Essa definição tem um grande impacto no desempenho, pois ela usa o algoritmo de bloco potencial para procurar no banco de dados inteiro a presença de blocos e, apropriadamente, criar um bloco ausente, caso não exista um.

Use essa definição somente quando tiver absoluta certeza de que nenhuma das outras técnicas de criação de blocos é adequada.

A função @CALCMODE(BOTTOMUP) (se usada em um ponto de inserção) e Criar Blocos Automaticamente são mutuamente excludentes.

Criação de Blocos de Dados de Destino para Funções @SHIFT e @PRIOR

Quando você usa as funções @SHIFT ou @PRIOR em scripts de cálculo, os blocos de dados deverão existir antes de você pode executar o cálculo. Os blocos de dados de destino deverão existir como parte de outro cálculo ou carregamento de dados ou deverão ser criados usando a função @CREATEBLOCK.

Exemplo de Caso de Uso:

Os dados existem em Real, FY16, P12, ML_HFM. Os dados estão sendo extraídos do Oracle Hyperion Financial Management e não foram carregados em Real, FY16, P1, ML_HFM. Os dados devem ser recuperados do período P12 do ano anterior, e uma entrada de reversão deve ser refletida em Real, FY17, P1, ML_HFM_Calc.

Este é o script de cálculo:


Exemplo de script de cálculo do Bloco de Dados

Nenhum diário foi contabilizado ("FCCS_Journal Input" em P13. Espera-se que o código adote o caminho a seguir, com "ML_HFM_Calc" como âncora do membro esparso:

@SHIFT("P12"->"ML_HFM", -1, @CHILDREN("Years"));

No entanto, isso retorna #MISSING.

Solução alternativa 1:


Solução alternativa 1 do bloco de dados

Solução alternativa 2:


Solução alternativa 2 do bloco de dados

Diretrizes para Regras ClearEmptyBlocks

A regra de negócios ClearEmptyBlocks ajuda a limpar o cubo do console em busca de blocos de dados vazios. Blocos de dados vazios podem ser gerados como parte de:

  • Execução de regra OnDemand que gera blocos vazios. Por exemplo, usando a função @CREATEBLOCK e depois possivelmente um bloco de dados vazio gerado que nunca será usado.

  • Um código de ponto de inserção (por exemplo, FCCS_20) que possivelmente tem perdas de bloco devido a cálculos de TOPDOWN, talvez ao atribuir #MISSING; usando âncoras esparsas, em vez de usar @CALCMODE (BOTTOM UP)

  • Cálculos de Sistema do Financial Consolidation and Close

Prática Recomendada para Executar a Regra ClearEmptyBlocks

  • Uma prática recomendada é executar a regra após concluir qualquer teste de regra/ponto de inserção OnDemand quando o script estiver em fase de desenvolvimento. A regra ClearEmptyBlocks ajuda a medir as estatísticas do bloco antes e depois da execução do cálculo em desenvolvimento.

  • Na fase de produção, execute a regra após concluir uma consolidação do ano inteiro para determinado ano.

A execução de um script do EPM Automate pode ser agendada para depois do horário comercial, todo fim de semana:

call epmautomate runbusinessrule ClearEmptyBlocks Scenario ="<Scenario>" Year = "<Particular Year>"
Period = "ILv10Descendants(YearTotal)"
call epmautomate restructurecube Consol

Observação: O agendamento dessa atividade deve manter um intervalo de pelo menos três a quatro horas no Ciclo de Manutenção Diária.

Formato de Script Básico

A figura a seguir mostra o formato da amostra Script de Cálculo.


Formato Script de Cálculo

Como Escrever Cálculos Configuráveis

A imagem a seguir mostra as regras de Cálculo Configurável na guia Moeda Local do Processo de Consolidação.


Exemplo 1 da tela de cálculos configuráveis

A imagem a seguir mostra as regras de Cálculo Configurável correspondentes na guia Moeda Local do Processo de Consolidação.


exemplo 2 de cálculos configuráveis

Um cálculo configurável ajuda a executar cálculos personalizados que envolvem três categorias de dados:

  • Dados Não Traduzidos: Moeda da Entidade + (Entrada FCCS_Entity ou Consolidação FCCS_Entity)

  • Dados Convertidos: Moeda Pai + (Entrada FCCS_Entity ou Consolidação FCCS_Entity)

  • Dados Eliminados: Moeda Pai + FCCS_Elimination

É importante entender a combinação Moeda e Consolidação para escrever um cálculo configurável no modelo correto de Regra de Cálculo Configurável, também conhecido como Ponto de Inserção.

Como um exemplo, supõe-se que FCCS_30_After Opening Balance Carry Forward_Translated deva ser usado, se, e apenas se, a conversão padrão de FCCS e o cálculo FX já tiverem processado os dados que precisam de atenção especial em FCCS_30.

Como Escrever Cálculo Configurável - Exemplos

Considere como exemplo um problema de Criação de Bloco e as diferentes abordagens para solucionar o mesmo cálculo.

Caso de Uso:

  • Adicione valores em duas contas: Warehouse_Stock e Showroom_Stock carregados em FCCS_Managed Data, FCCS_Mvmts_NetIncome, FCCS_Local GAAP e No Product

  • Armazene o resultado do cálculo na Conta Inventory_Stock em FCCS_Other Data, FCCS_Mvmts_NetIncome, FCCS_Local GAAP e No Product

  • Use o cálculo configurável FCCS_10

Abordagem 1: Como Usar Bloco sem Membros (Âncora)

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ("FCCS_Other Data", "FCCS_Mvmts_NetIncome", "FCCS_No Intercompany", "No Product",
"FCCS_Local GAAP")
3.      " Inventory_Stock " = "FCCS_Managed Data"->" Warehouse_Stock " + "FCCS_Managed Data"->
"Showroom_Stock ";

4.      ENDFIX
5.      ENDFIX

Desvantagens dessa abordagem:

  1. Esse é um cálculo denso, considerando que Inventory_Stock é uma conta do lado esquerdo. Embora o cálculo esteja escrito corretamente, o resultado do cálculo não será visto se não existir um bloco anterior em FCCS_Other Data e outros membros FIX associados para manter o resultado.

  2. Não é possível impor restrições de cálculo condicional, por exemplo, IF... ELSE... ENDIF.

  3. A solução alternativa é obrigatória para introduzir manualmente blocos de dados zero na interseção acima.

Abordagem 2: Como Usar Bloco de Membros Denso (Âncora)

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ("FCCS_Other Data", "FCCS_Mvmts_NetIncome", "FCCS_No Intercompany", "FCCS_No Intercompany",
"FCCS_Local GAAP")

3.      " Inventory_Stock "(
4.      "FCCS_Managed Data"->" Warehouse_Stock " + "FCCS_Managed Data"->" Showroom_Stock ";
5.      )
6.      ENDFIX
7.      ENDFIX

Desvantagens dessa abordagem:

  1. Esse é um cálculo denso, pois o bloco de membros Inventory_Stock é uma conta. Embora o cálculo esteja escrito corretamente, o resultado do cálculo não será visto se não existir um bloco anterior em FCCS_Other Data e outros membros FIX associados.

  2. A solução alternativa é obrigatória para introduzir manualmente blocos de dados zero na interseção acima.

Abordagem 3: Como Usar Bloco de Membros Esparso (Âncora)

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ("FCCS_Mvmts_NetIncome", "FCCS_No Intercompany", "No Product", "FCCS_Local GAAP")
3.      "FCCS_Other Data" (
4.      " Inventory_Stock " = "FCCS_Managed Data"->" Warehouse_Stock " + "FCCS_Managed Data"->
"Showroom_Stock ";

5.      )
6.      ENDFIX
7.      ENDFIX

Vantagem dessa abordagem:

Esse é um cálculo esparso, pois o bloco de membros FCCS_Other Data é Origem de Dados, que é uma dimensão esparsa. O cálculo resulta em um bloco.

Desvantagem dessa abordagem:

O cálculo de bloco de membros é executado de cima para baixo, como o operador entre dimensões está sendo usado.

Abordagem 4: Como Usar Cálculo Ascendente e Bloco de Membros Esparsos

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ( "FCCS_Mvmts_NetIncome", "FCCS_No Intercompany", "No Product", "FCCS_Local GAAP")
3.      "FCCS_Managed Data"(@CALCMODE(BOTTOMUP);
4.      "FCCS_Other Data"-> "Inventory_Stock " = " Warehouse_Stock " + " Showroom_Stock "; 5.        )
6.      ENDFIX
7.      ENDFIX

Vantagens dessa abordagem:

  1. Esse é um cálculo esparso, pois o bloco de membros FCCS_Managed Data é Origem de Dados, uma dimensão esparsa.

  2. O cálculo de bloco de membros é executado de baixo para cima.

  3. FCCS_Managed Data é a origem desse cálculo. O bloco resultante é criado em FCCS_Other Data, se, e apenas se, o bloco de dados existir na origem.

  4. Nenhum operador entre dimensões é obrigatório no lado direito do cálculo.

  5. Há uma necessidade de especificar explicitamente o cálculo como Ascendente, pois há um operador entre dimensões no lado esquerdo dessa atribuição.

Cálculos do Modo Bloco versus Célula

  • Modo BLOCO: (modo padrão) Nesse modo de cálculo, o Essbase agrupa as células em um bloco e, simultaneamente, calcula as células em cada grupo.

  • O modo de cálculo de bloco é rápido, mas você precisa considerar cuidadosamente as dependências de dados no bloco a fim de garantir que os dados resultantes sejam precisos.

  • Modo CÉLULA: Nesse modo de cálculo, o Essbase calcula cada célula sequencialmente, seguindo a ordem de cálculo, que se baseia no outline.

  • O modo de cálculo de célula é mais lento por motivos óbvios. No entanto, ele garante resultados precisos no que diz respeito às dependências de dados.

  • Quando o Essbase compila uma fórmula, ele imprime uma mensagem no arquivo de log do aplicativo, explicando o modo de execução para a fórmula semelhante à seguinte mensagem:

    Formula on member Profit % will be executed in CELL and TOPDOWN mode.

O Essbase usa o modo Bloco ao calcular uma fórmula, a menos que ela use funções como estas:

  • @ANCEST

  • @CURRMBR

  • @ISMBR on a dense member

  • @MDANCESTVAL

  • @MDPARENTVAL

  • @MDSHIFT

  • @NEXT

  • @PARENT

  • @PARENTVAL

  • @PRIOR

  • @SANCESTVAL

  • @SPARENTVAL

  • @SHIFT

  • @XWRITE

Para induzir manualmente o modo Bloco, use @CALCMODE(BLOCK). Certifique-se de que não haja dependências de dados no seu bloco denso.

Exemplo de Modo Bloco

Execute o seguinte cálculo, com base no mês:

  • Janeiro – Sales Synergies é a soma dos filhos de Returns and Allowances
  • Fevereiro – Sales Synergies é a soma dos filhos de Returns and Allowances – multiplicar por 20%
  • Meses restantes – Sales Synergies é a soma dos filhos de Returns and Allowances – multiplicar por 10%

Modo Bloco

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ("Sales Synergies", "FCCS_No Intercompany", "FCCS_Managed Data", "No Product", "FCCS_Local GAAP")
3.      "FCCS_Mvmts_NetIncome" (
4.      IF (@ISMBR("Jan"))
5.      @SUM(@Children("Returns and Allowances"));
6.      ELSEIF (@ISMBR("Feb"))
7.      @SUM(@Children("Returns and Allowances")) * 0.2;
8.      ELSE
9.      @SUM(@Children("Returns and Allowances")) * 0.1;
10.     ENDIF
11.     )
12.     ENDFIX
13.     ENDFIX

Modo Célula versus Modo Bloco Induzido

Execute o seguinte cálculo, com base no mês:

Janeiro – Sales Synergies é a soma dos filhos de Returns and Allowances

Fevereiro - Sinergias de Vendas são a soma dos filhos de Devoluções e Abatimentos - multiplicar por 20%

Meses restantes - Sales Synergies é a soma dos filhos de Returns and Allowances mais Sales Synergies do período anterior. Multiplicar o resultado inteiro por 10%.

Modo CÉLULA

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ("Sales Synergies", "FCCS_No Intercompany", "FCCS_Managed Data", "No Product", "FCCS_Local GAAP")
3.      "FCCS_Mvmts_NetIncome" (
4.      IF (@ISMBR("Jan"))
5.      @SUM(@Children("Returns and Allowances"));
6.      ELSEIF (@ISMBR("Feb"))
7.      @SUM(@Children("Returns and Allowances")) * 0.2;
8.      ELSE
9.      (@SUM(@Children("Returns and Allowances")) + @PRIOR("Sales Synergies")) * 0.1;
10.     ENDIF
11.     )
12.     ENDFIX
13.     ENDFIX

Modo Bloco

1.   FIX ("FCCS_Entity Input", "Entity Currency")
2.      FIX ("Sales Synergies", "FCCS_No Intercompany", "FCCS_Managed Data", "No Product", "FCCS_Local GAAP")
3.      "FCCS_Mvmts_NetIncome" (@CALCMODE(BLOCK);
4.      IF (@ISMBR("Jan"))
5.      @SUM(@Children("Returns and Allowances"));
6.      ELSEIF (@ISMBR("Feb"))
7.      @SUM(@Children("Returns and Allowances")) * 0.2;
8.      ELSE
9.      (@SUM(@Children("Returns and Allowances")) + @PRIOR("Sales Synergies")) * 0.1;
10.     ENDIF
11.     )
12.     ENDFIX
13.     ENDFIX

Caso de Uso do Cliente A

  • Reclassifique Dados Gerenciados carregados de FDMEE para contas Declaração de Renda em outro membro Origem de Dados calculado, com base nos ajustes do diário

  • O desempenho estava lento: 180 minutos para um ano inteiro

Cliente A - Exemplo de Script


Caso de uso do Cliente A

Cliente A - Aprimoramentos de Script

  • Use @REMOVE para remover a Conta, em vez de usar a verificação @ISMBR na dimensão densa Conta

  • Processamento Ascendente

  • Use o booliano @ISLEV, em vez de @LEV e @CURRMEMBER

  • Desempenho aprimorado em 90%

Caso de Uso do Cliente B

  • Objetivo – mover os dados de algumas entidades Origem para uma entidade Destino

  • Os dados não estavam sendo calculados

  • O desempenho estava lento – 3,5 horas

Cliente B - Exemplo de Script


Caso de uso do cliente B

Cliente B - Aprimoramentos de Script

  • Use Copiar para criar o bloco de destino

  • O cálculo permanece Descendente

  • Cálculo executado apenas em um membro de dimensão Personalizado de destino

  • Use @LIKE para tornar o script genérico

  • Tempo reduzido de 3,5 horas para alguns minutos

Caso de Uso do Cliente C

  • Reclassifique movimentos com base no FCCS_Closing_Balance_Input inserido por meio da interface de usuário

  • O desempenho estava lento – 15 minutos


Caso de uso do cliente C

Cliente c - Exemplo de Script (continuação)


Caso de uso do cliente C (continuação)

Cliente C - Aprimoramentos de Script

  • Remova os membros restritos do FIX

  • Processamento Ascendente

  • Procure casos de borda

  • Procurar primeiro os casos comum

  • Desempenho aprimorado em 40%

Caso de Uso do Cliente D

  • Reclassifique dados extraídos de Hyperion Financial Management, origem de dados ML_HFM, e armazene-os no membro de origem de dados ML_HFM_Calc

  • O desempenho estava lento – 24 horas para um único período

  • Os dados não estavam sendo vinculados, pois os blocos não estavam sendo criados conforme esperado

Cliente D - Exemplo de Script


Caso de uso do cliente D

Caso de uso do cliente D (continuação)

Cliente D - Aprimoramentos de Script

  • Use @REMOVE para remover a Conta, em vez de usar a verificação @ISMBR na dimensão densa Conta

  • Processamento Ascendente

  • Use o booliano @ISLEV, em vez de @LEV e @CURRMEMBER

  • Desempenho aprimorado em 90%

Caso de Uso do Cliente E

  • O método Consolidação mudou no período atual, desejo de remover todos os tratamentos cumulativos de CTA e eliminação dos períodos antigos

  • O desempenho estava lento – 90 minutos


Caso de Uso do Cliente E

Cliente E - Aprimoramentos de Script

  • Use Data_Input no destino para evitar o erro de validação sobre como gravar em FCCS_Intercompany_Eliminations

  • Use Ascendente nos membros ICP do cruzamento que tiveram Entrada de Saldo de Fechamento

  • Tempo reduzido de 90 minutos para 11 minutos

Resumo das Melhores Práticas

  • Processamento Ascendente

  • Use @REMOVE para remover a conta, em vez de usar a verificação @ISMBR na dimensão densa Conta

  • 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

  • Cálculo executado apenas em um membro de dimensão Personalizado de destino

  • Use @LIKE para tornar o script genérico

  • Evite a criação automática de bloco

  • Procure casos de borda

  • Procurar primeiro os casos comum

Melhores Práticas para Desempenho

Vários Passos para o Essbase

Toda vez que a instrução FIX é usada em uma regra, cada FIX aciona um passo separado para o banco de dados. Por motivos de desempenho, seria melhor evitar vários passos para o Essbase não incluindo muitas instruções FIX separadas.

Exemplo - Várias Passagens para Essbase

FIX("Entity Currency", "FCCS_Entity Input", …..)
        FIX("FCCS_Data Input", … )
                //Calculations;
        ENDFIX
        
        FIX("FCCS_Other Data", … )
                //Calculations;
        ENDFIX

ENDFIX

Exemplo: Alterações sugeridas para evitar várias passagens usando IF...ENDIF

FIX("Entity Currency", ...)
        FIX( @List("FCCS_Data Input", "FCCS_Other Data"), … )
                "FCCS_Entity Input"( @CALCMODE(BOTTOMUP);
                        IF(@ISMBR("FCCS_Data Input")
                                //Calculations for "FCCS_Data Input";
                        ELSE                    
                                //Calculations "FCCS_Other Data";
                        ENDIF   
                )
        ENDFIX
ENDFIX

Exemplo: Alterações sugeridas para evitar várias passagens usando Blocos de Membros

FIX("Entity Currency", ...)
        FIX( @List("FCCS_Data Input", "FCCS_Other Data"), … )
                "FCCS_Entity Input"( @CALCMODE(BOTTOMUP);
                        IF(@ISMBR("FCCS_Data Input")
                                //Calculations for "FCCS_Data Input";
                        ELSE                    
                                //Calculations "FCCS_Other Data";
                        ENDIF   
                )
        ENDFIX
ENDFIX

Exemplo: Várias instruções FIX aninhadas separadas que causam várias passagens para Essbase

FIX("FCCS_Elimination")
        FIX("No Movement")
                Fix(@Relative("ICP_Category",0))
                "Custom_Elimination" (
                        "InterSales"="Other_InterAcct"->"FCCS_Intercompany Eliminations";
                )
                ENDFIX  /*Intercompany*/
        ENDFIX  /*Movement*/
 ENDFIX  /*Consolidation*/

Exemplo: Reescrever para evitar várias passagens

FIX ("FCCS_Elimination",@Relative("ICP_Category A",0), "No Movement")
        "Custom_Elimination" ( @CALCMODE(BOTTOMUP);
                "640102" = "WA_Intercompany Account"->"FCCS_Intercompany Eliminations";
        )
ENDFIX

Como Escrever em Membros Restritos

Neste exemplo, suponha que você queira reclassificar "FCCS_Intercompany Eliminations" > "FCCS_Eliminations" > "Mvmts_NewBusiness" para "Data Input" > "FCCS_Eliminations" > "Mvmts Reclass."

No entanto, uma vez que "FCCS_Intercompany Eliminations" é um membro restrito para a dimensão Origem de Dados, se você tentar usar FIX neste membro, o sistema retornará um erro.

Você pode tentar escrever as instruções a seguir, que forçam o sistema a usar o processamento Descendente.

Exemplo: Como trabalhar com membros restritos usando processamento de Cima para Baixo

FIX("Data Input", … ) 
        "FCCS_Elimination" (
                 "Mvmts_Reclass" = -1 * "FCCS_Intercompany Eliminations"->"Mvmts_NewBusiness" ; 
        )               
ENDFIX

Exemplo: Reescrever as instruções usando o processamento BottomUp

FIX("FCCS_IntercomanyEliminations", "Mvmts_NewBusiness", … )
        "FCCS_Elimination" ( @CALCMODE(BOTTOMUP);
                 "Mvmts_Reclass"->"Data Input" = -1 * "Mvmts_NewBusiness" ; 
        )               
ENDFIX

Observe que nesse exemplo, você tem uma instrução FIX em "FCCS_Intercompany Eliminations", mas a substitui por "Data Input" no bloco de membros, e o sistema não retornará um erro durante a validação.

Inserção de Dados na Entrada de Saldo de Fechamento e Como Calcular o Movimento com Base em UDAs

Neste exemplo, suponha que você deseja mover a Entrada de Saldo de Fechamento para um membro de Movimento específico. Você poderia escrever um cálculo personalizado com estes requisitos:

  • Utilize instruções Fix em combinações de membros de dimensão esparsas juntas para processamento Ascendente. O processamento Ascendente é relacionado a blocos, e as dimensões esparsas definem um bloco.

  • Os atributos definidos pelo usuário (user-defined attributes - UDAs) têm melhor processamento quando usados juntos como uma instrução FIX nas contas UDA para executar o mesmo cálculo.

  • O exemplo abaixo pressupõe que todos os UDAs especificados estão definidos nos Tipos de Conta ASSET / LIABILITY / EQUITY.

  • Instrução FIX em membros da dimensão Conta de nível zero relacionados a FCCS_Net Income

  • Utilize uma função booliana em vez de calcular o nível do membro usando @LEV para melhorar o desempenho

  • Utilize a função booliana @ISDESC para verificar se o membro é um descendente. Ele sempre será um membro folha.

Exemplo: Inserção de Dados na Entrada de Saldo de Fechamento e Como Calcular o Movimento com Base em UDAs


Exemplo de Cálculo Configurável para Entrada de Saldo de Fechamento usando UDAs

Melhor Maneira de Usar a Condição IF

Veja abaixo um exemplo comum de quando você escreve as instruções condicionais usando IF. Nesse exemplo, você deseja realizar um processo específico para o mês de Janeiro, mas algo diferente nos outros meses. Se o cálculo for escrito como abaixo, o sistema passará pela verificação 12 vezes em todos os períodos, exceto Janeiro, uma vez que ele sempre busca Janeiro primeiro, e depois se dividirá para a cláusula ELSE.

Exemplo: Instrução IF

FIX ("Entity Currency", "FCCS_Entity Input" … )
        "Mvmt_Increase01" ( @CALCMODE(BOTTOMUP);
                IF(@ISMBR("Jan"))
                                "FCCS_ClosingBalance_Input" - @PRIOR("FCCS_ClosingBalance_Input"->                   "Dec", 1, @RELATIVE("Years", 0));
                ELSE
                                "FCCS_ClosingBalance_Input" - "FCCS_TotalOpeningBalance";
                ENDIF
        )
ENDFIX

Exemplo: Como reescrever usando NOT IF

Você pode reescrever a instrução IF para que 11 dos 12 períodos sejam executados com a cláusula IF e depois removidos da ramificação condicional. Somente Janeiro será executado na cláusula ELSE uma vez.

FIX ("Entity Currency", "FCCS_Entity Input", …)         
        "FCCS_ClosingBalance_Input"(@CALCMODE(BOTTOMUP);
        IF (NOT @ISMBR("Jan"))
                "Mvmt_Increase01" = "FCCS_ClosingBalance_Input" - "FCCS_TotalOpeningBalance";
        ELSE
                IF(NOT @ISMBR(@MEMBERAT(@CHILDREN("Years"),1)))
              "Mvmt_Increase01" = "FCCS_ClosingBalance_Input" - "FCCS_ClosingBalance_Input"->"Dec"->            @MEMBER(@PREVSIBLING(@CURRMBR("Years")));
                  ENDIF;
         ENDIF;
        )
ENDFIX

Utilização da Opção de Cálculo do Sistema Membro Personalizado Principal com Dimensionalidade Estendida

Para dimensões Personalizadas definidas pelo usuário, os Administradores do Serviço podem optar por processar Cálculos do Sistema usando o Membro Principal da dimensão Personalizada, em vez de todos os membros de nível 0, para tornar o desempenho mais rápido. Você pode selecionar dimensões Personalizadas específicas para as quais a opção possa ser usada. Consulte Cálculos do Sistema.

Se você estiver usando um ambiente de Dimensionalidade Estendida, para garantir que a utilização do Membro Principal Personalizado não prejudicará o desempenho, crie um bloco vazio em "NoCustomX", no início da consolidação com base nos dados de Entrada da Entidade e de Moeda da Entidade e utilize esse bloco para executar todos os cálculos. Por exemplo, se tiver 1000 membros Personalizados na dimensão Personalizada Produto, você poderá criar um bloco @"No Product", uma instrução FIX em "No Product" e utilizar o processamento Ascendente. Dessa forma, o sistema não precisará percorrer todos os 1000 membros da dimensão Produto, e você poderá usar "Produto Total" para o valor total, a fim de melhorar o desempenho geral.

O seguinte exemplo exibe uma amostra de Script de Cálculo:


Exemplo de Cálculo Configurável para o Membro Principal Personalizado

Como Calcular Blocos de Membros FCCS_10 usando o Processamento Ascendente

  1. Use @CALCMODE(BOTTOMUP) e combine cálculos de bloco de membros.

  2. Combine cálculos em várias instruções FIX...ENDFIX em uma única instrução FIX...ENDFIX, se os membros da instrução FIX forem iguais entre os cálculos.

    Caso esse seja um cálculo único, evite usar instruções FIX dentro de instruções FIX.

Os exemplos a seguir mostram o cálculo usando um processamento Descendente e um exemplo modificado usando um processamento Ascendente para melhorar o processamento de consultas no lado direito.

Exemplo: Execução de FCCS_20 C1_Validation Usando um Processamento Descendente
Exemplo de Cálculo Configurável C1 Descendente

Exemplo: Execução de FCCS_20 C1_Validation Usando um Processamento Ascendente


Exemplo de Cálculo Configurável C1 Ascendente

Dependência de Cálculo

Você deve evitar dependências entre entidades quando os cálculos são feitos em Cálculos Configuráveis (pontos de inserção) e Regras sob Demanda. Se você tentar fazer referência ao valor da Entidade A no cálculo e, se Entidade A ainda não tiver sido calculada, a Entidade A não terá valor.

Por exemplo, se você tentar reclassificar dados da "Entidade A" > "ICP_B" > "Moeda da Entidade" (origem) para "Entidade B" > "ICP_A" > "Moeda da Entidade" (destino), os dados na Entidade A (origem) podem não estar disponíveis, uma vez que podem não ter sido calculados, se ambas as entidades, A e B, estiverem sendo calculadas paralelamente.

Nesses casos, a reclassificação deve ser tentada primeiro calculando-se a Entidade A e, em seguida, a Entidade B dependente.