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.
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.
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
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.
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:
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 2:
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.
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.
A imagem a seguir mostra as regras de Cálculo Configurável correspondentes na guia Moeda Local do Processo de Consolidação.
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:
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.
Não é possível impor restrições de cálculo condicional, por exemplo, IF... ELSE... ENDIF.
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:
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.
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:
Esse é um cálculo esparso, pois o bloco de membros FCCS_Managed Data
é Origem de Dados, uma dimensão esparsa.
O cálculo de bloco de membros é executado de baixo para cima.
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.
Nenhum operador entre dimensões é obrigatório no lado direito do cálculo.
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:
Sales Synergies
é a soma dos filhos de Returns and Allowances
Sales Synergies
é a soma dos filhos de Returns and Allowances
– multiplicar por 20%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
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
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
Cliente c - Exemplo de Script (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
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
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
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:
Como Calcular Blocos de Membros FCCS_10 usando o Processamento Ascendente
Use @CALCMODE(BOTTOMUP) e combine cálculos de bloco de membros.
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: Execução de FCCS_20 C1_Validation Usando um Processamento 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.