Utilizzare le seguenti procedure consigliate quando vengono utilizzati i calcoli configurabili.
Concetti di calcolo
Questi sono i concetti essenziali per la creazione di calcoli:
Blocchi di dati
Formato script di base
Calcoli bottom-up e calcoli top-down
Modalità blocco e modalità cella
Blocchi di dati
L'immagine seguente mostra un blocco di dati da un'applicazione di esempio.
I membri memorizzati di dimensioni dense costituiscono un blocco di dati. La dimensione blocco per l'applicazione di esempio precedente è 2 (Vendite e Contanti) x 8 byte = 16 byte.
Combinazioni univoche di membri di dimensioni sparse costituiscono INDEX e fanno riferimento a blocchi di dati. Nell'applicazione di esempio precedente sono disponibili in totale 2 (Effettivo, Budget) x 2 (FY17, FY18) x 2 (Gen, Feb)= 8 indici.
Nei database BSO (Block Storage Option) di Essbase un blocco costituisce membri memorizzati di una dimensione densa. Per impostazione predefinita, Conto è l'unica dimensione densa in Consolidamento finanziario e chiusura.
In questo esempio la dimensione Conto è densa e include 1977 membri memorizzati. Indica che un singolo blocco di consolidamento del database BSO include 1977 celle, ognuna delle quali rappresenta un membro del conto.
La dimensione blocco in byte sarà:
Dimensione blocco (byte) = Numero di membri memorizzati nel conto * 8
Dimensione blocco (byte) = 1977 * 8 = 15.816 byte
Nota: per visualizzare le proprietà del database da Calculation Manager, selezionare Azione e quindi Proprietà database.
Procedure consigliate per la creazione di blocchi di dati
Quando viene eseguito un calcolo configurabile che scrive in una cella dati, perché i dati vengano scritti nel database deve esistere un blocco di dati.
I blocchi di dati sono combinazioni di membri dimensione densa e sparsa memorizzati.
Per ciascuna combinazione di dimensioni sparse memorizzate vengono creati blocchi di dati separati. I membri di una dimensione densa equivalgono a un blocco.
Quando si creano calcoli configurabili, può essere necessario creare blocchi aggiuntivi per memorizzare i risultati calcolati e risolvere i problemi di dati mancanti.
È possibile abilitare l'opzione Creazione automatica blocchi in modo che il sistema crei automaticamente i blocchi mancanti. Fare riferimento a Abilitazione della creazione automatica dei blocchi per i calcoli configurabili.
Se nei calcoli configurabili si utilizza l'elaborazione bottom-up, è consigliabile creare blocchi di dati manualmente o assicurarsi che i blocchi di dati necessari esistano già.
È possibile creare blocchi di dati manualmente con uno dei metodi sotto riportati..
Assegnazione dei dati durante il processo di caricamento di questi. Ad esempio, scrivere "Zero" in una singola intersezione di membri densa, quindi scrivere "#missing" per cancellare "Zero" dopo la creazione dei blocchi.
Utilizzo del comando Essbase DATACOPY, che copia tutti i blocchi dall'origine alla destinazione, comprese le celle mancanti. Questo metodo, tuttavia, può creare blocchi non necessari e rallentare il processo di consolidamento.
Quando utilizzare Creazione automatica blocchi
Creazione automatica blocchi è un'impostazione fornita per creare blocchi mancanti durante un calcolo configurabile.
Questa impostazione ha un impatto significativo sulle prestazioni, perché utilizza il potenziale algoritmo di blocco per eseguire una ricerca nell'intero database per rilevare la presenza di blocchi e crea di conseguenza un blocco mancante, se non esiste.
Utilizzare questa impostazione solo quando si è completamente sicuri che nessun'altra tecnica di creazione di blocchi sia appropriata.
La funzione @CALCMODE(BOTTOMUP), se usata in un punto di inserimento, e Creazione automatica blocchi si escludono a vicenda.
Creazione di blocchi di dati target per funzioni @SHIFT e @PRIOR
Quando si utilizzano le funzioni @SHIFT o @PRIOR negli script di calcolo, è necessario che i blocchi di dati target siano preesistenti all'esecuzione dal calcolo. I blocchi di dati target devono far parte di un altro calcolo o caricamento dati oppure devono essere creati con l'ausilio della funzione @CREATEBLOCK.
Esempio di caso d'uso:
Sono presenti dati in Effettivo, FY16, P12, ML_HFM. I dati vengono estratti da Oracle Hyperion Financial Management ma non caricati in Effettivo, FY16, P1, ML_HFM. È necessario recuperare i dati dal periodo P12 dell'anno precedente e in Effettivo, FY17, P1, ML_HFM_Calc deve essere riportato uno storno.
Lo script di calcolo è il seguente:
Non sono stati contabilizzati giornali ("FCCS_Journal Input" in P13. Si prevede che il codice utilizzi il percorso seguente, con "ML_HFM_Calc" come ancora dei membri sparsi:
@SHIFT("P12"->"ML_HFM", -1, @CHILDREN("Years"));
Tuttavia il risultato è #MISSING.
Soluzione alternativa 1:
Soluzione alternativa 2:
Linee guida per la regola ClearEmptyBlocks
La regola business ClearEmptyBlocks consente di eseguire lo scavenging del cubo di consolidamento e quindi di eliminare i blocchi di dati vuoti. I blocchi di dati vuoti possono essere generati nell'ambito delle seguenti operazioni:
Esecuzione di regole OnDemand che generano blocchi vuoti. Ad esempio, se si utilizza la funzione @CREATEBLOCK e successivamente un blocco di dati vuoto generato non viene mai utilizzato.
Codice del punto di inserimento, ad esempio FCCS_20, dove probabilmente si verificano perdite di blocchi a causa di calcoli TOPDOWN, in seguito all'assegnazione di valori #MISSING o dell'uso di ancoraggi sparsi anziché di @CALCMODE(BOTTOM UP)
Calcoli di sistema di Financial Consolidation and Close
Procedura consigliata per eseguire la regola ClearEmptyBlocks
La procedura consigliata prevede l'esecuzione della regola al termine di qualsiasi test del punto di inserimento/regola OnDemand, quando lo script è nella fase di sviluppo. La regola ClearEmptyBlocks consente di misurare le statistiche di blocco prima e dopo l'esecuzione del calcolo in fase di sviluppo.
Nella fase di produzione eseguire la regola al termine del consolidamento di un anno completo per un anno specifico.
È possibile programmare l'esecuzione di uno script di EPM Automate al termine dell'orario di lavoro, ogni fine settimana:
call epmautomate runbusinessrule ClearEmptyBlocks Scenario ="<Scenario>" Year = "<Particular Year>" Period = "ILv10Descendants(YearTotal)" call epmautomate restructurecube Consol
Nota: la programmazione di questa attività deve prevedere un intervallo di 3-4 ore rispetto al ciclo di manutenzione giornaliero.
Formato script di base
L'immagine seguente mostra un formato di script di calcolo di esempio.
Scrittura di calcoli configurabili
L'immagine seguente mostra le regole di calcolo configurabile nella scheda Valuta locale processo di consolidamento.
L'immagine seguente mostra le regole di calcolo configurabile corrispondenti dalla scheda Valuta locale processo di consolidamento.
Un calcolo configurabile semplifica l'esecuzione di calcoli customizzati che interessano tre categorie di dati:
Calcoli non tradotti: Valuta entità + (Input FCCS_Entity o consolidamento FCCS_Entity)
Dati tradotti: Valuta padre + (Input FCCS_Entity o consolidamento FCCS_Entity)
Dati eliminati: Valuta padre + FCCS_Elimination
È importante comprendere la combinazione di valuta e consolidamento per scrivere un calcolo configurabile nel modello Regola calcolo configurabile corretto, definito anche punto di inserimento.
È ad esempio previsto l'utilizzo di FCCS_30_After Opening Balance Carry Forward_Translated se e solo se la traduzione predefinita di FCCS e il calcolo FX hanno già elaborato i dati che necessitano di attenzione speciale in FCCS_30.
Esempi di scrittura di calcoli configurabili
Si prenda in considerazione un esempio di un problema di creazione blocchi e i diversi approcci per risolvere lo stesso calcolo.
Caso d'uso:
Aggiungere valori in due conti, Warehouse_Stock e Showroom_Stock, caricati in FCCS_Managed Data, FCCS_Mvmts_NetIncome, FCCS_Local GAAP e Nessun prodotto
Memorizzare il risultato del calcolo in Account Inventory_Stock in FCCS_Other Data, FCCS_Mvmts_NetIncome, FCCS_Local GAAP e Nessun prodotto
Utilizzare il calcolo configurabile FCCS_10
Approccio 1: mediante nessun blocco membri (ancoraggio)
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
Svantaggi di questo approccio:
Questo è un calcolo denso, considerato che Inventory_Stock
è un conto sul lato sinistro. Benché il calcolo sia scritto correttamente, il risultato del calcolo non verrà visualizzato se non esiste alcun blocco precedente in FCCS_Other Data
e sono stati associati altri membri FIX per conservare il risultato.
Non è possibile applicare limitazioni di calcolo condizionali, ad esempio IF..ELSE..ENDIF.
Per introdurre blocchi con zero dati sull'intersezione precedente è necessaria una soluzione alternativa.
Approccio 2: mediante un blocco membri denso (ancoraggio)
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
Svantaggi di questo approccio:
Questo è un calcolo denso perché il blocco membri Inventory_Stock
è un conto. Benché il calcolo sia scritto correttamente, il risultato del calcolo non verrà visualizzato se non esiste alcun blocco precedente in FCCS_Other Data
e sono stati associati altri membri FIX.
Per introdurre blocchi con zero dati sull'intersezione precedente è necessaria una soluzione alternativa.
Approccio 3: mediante un blocco membri sparso (ancoraggio)
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
Vantaggio di questo approccio:
Questo è un calcolo sparso perché il blocco membri FCCS_Other Data
è un'origine dati che è una dimensione sparsa. Il calcolo restituisce un blocco come risultato.
Svantaggio di questo approccio:
L'esecuzione del calcolo del blocco membri è top-down, poiché viene utilizzato un operatore tridimensionale.
Approccio 4: mediante un blocco membri sparso e un calcolo bottom-up
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
Vantaggi di questo approccio:
Questo è un calcolo sparso perché il blocco membri FCCS_Managed Data
è un'origine dati che è una dimensione sparsa.
L'esecuzione del calcolo del blocco membri è bottom-up.
FCCS_Managed Data
è l'origine del calcolo. Il blocco risultante viene creato in FCCS_Other Data
se e solo se il blocco di dati esiste nell'origine.
Non è necessario alcun operatore tridimensionale nel lato destro del calcolo.
Non è necessario specificare esplicitamente il calcolo come bottom-up, poiché nel lato sinistro dell'assegnazione esiste un operatore tridimensionale.
Calcoli in modalità Blocco e modalità Cella
Modalità BLOCK: (modalità predefinita) in questa modalità di calcolo Essbase raggruppa le celle in un blocco e calcola simultaneamente le celle in ogni gruppo.
La modalità di calcolo Blocco è veloce, ma è necessario valutare con attenzione le dipendenze dei dati nel blocco per assicurarsi che i dati risultanti siano accurati.
Modalità CELL: in questa modalità di calcolo Essbase calcola ogni cella in modo sequenziale, seguendo l'ordine di calcolo che è basato sulla struttura.
La modalità di calcolo Cella è ovviamente più lenta. Assicura tuttavia risultati accurati per quanto riguarda le dipendenze dei dati.
Quando Essbase compila una formula, stampa un messaggio nel file di log dell'applicazione illustrando la modalità di esecuzione per la formula in modo analogo al seguente messaggio:
La formula nel membro % di profitto verrà eseguita in modalità CELL e TOPDOWN.
Essbase usa la modalità Blocco durante il calcolo di una formula, a meno che non vengano usate funzioni quali le seguenti:
@ANCEST
@CURRMBR
@ISMBR su un membro denso
@MDANCESTVAL
@MDPARENTVAL
@MDSHIFT
@NEXT
@PARENT
@PARENTVAL
@PRIOR
@SANCESTVAL
@SPARENTVAL
@SHIFT
@XWRITE
Per indurre manualmente la modalità Blocco, utilizzare @CALCMODE(BLOCK). Assicurarsi che non esistano dipendenze dati nel blocco denso.
Esempio di modalità Blocco
Eseguire il seguente calcolo, in base al mese:
Sales Synergies
è la somma dei figli di Returns and Allowances
Sales Synergies
è la somma dei figli di Returns and Allowances
, moltiplicata per il 20%Sales Synergies
è la somma dei figli di Returns and Allowances
, moltiplicata per il 10%Modalità Blocco
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
Modalità Cella e modalità Blocco indotta
Eseguire il seguente calcolo, in base al mese:
Gennaio - Sales Synergies
è la somma dei figli di Returns and Allowances
Febbraio - Sales Synergies
è la somma dei figli di Returns and Allowances
, moltiplicata per il 20%
Mesi rimanenti - Sales Synergies
è la somma dei figli di Returns and Allowances
più i valori Sales Synergies
del periodo precedente. Moltiplicare l'intero risultato per il 10%.
Modalità CELL
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
Modalità Blocco
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 d'uso Cliente A
Riclassificare i dati gestiti caricati da FDMEE per conti di tipo Conto economico specificando un membro Origine dati calcolato diverso, in base ad adeguamenti giornale
Le prestazioni sono state lente : 180 minuti per un intero anno
Cliente A - Esempio di script
Cliente A - Miglioramenti allo script
Utilizzare @REMOVE per rimuovere il conto invece di usare il controllo @ISMBR nella dimensione densa Conto
Elaborazione bottom-up
Utilizzare @ISLEV booleano invece di @LEV e @CURRMEMBER
Miglioramento delle prestazioni del 90%
Caso d'uso Cliente B
Obiettivo - Spostare i dati da alcune entità di origine in un'entità target
Non veniva eseguito il calcolo dei dati
Le prestazioni sono state lente - 3,5 ore
Cliente B - Esempio di script
Cliente B - Miglioramenti allo script
Utilizzare la copia per creare il blocco target
Il calcolo rimane top-down
Calcolo eseguito solo su un membro dimensione customizzato target
Utilizzare @LIKE per rendere generico lo script
Durata ridotta da 3,5 ore a pochi minuti
Caso d'uso Cliente C
Riclassificare i movimenti in base a FCCS_Closing_Balance_Input immesso tramite l'interfaccia utente
Le prestazioni sono state lente - 15 minuti
Cliente C - Esempio di script - Continua
Cliente C - Miglioramenti allo script
Rimuovere i membri limitati da FIX
Elaborazione bottom-up
Verificare la presenza di casi limite
Controllare prima i casi comuni.
Miglioramento delle prestazioni del 40%
Caso d'uso Cliente D
Riclassificare i dati estratti da Hyperion Financial Management, origine dati ML_HFM, e memorizzarli nel membro dell'origine dati ML_HFM_Calc
Le prestazioni sono state lente – 24 ore per un singolo periodo
Non veniva eseguita la convalida dei dati perché i blocchi non venivano creati come previsto
Cliente D - Esempio di script
Cliente D - Miglioramenti allo script
Utilizzare @REMOVE per rimuovere il conto invece di usare il controllo @ISMBR nella dimensione densa Conto
Elaborazione bottom-up
Utilizzare @ISLEV booleano invece di @LEV e @CURRMEMBER
Miglioramento delle prestazioni del 90%
Caso d'uso Cliente E
Il metodo di consolidamento è stato cambiato nel periodo corrente e si desiderava rimuovere tutti gli adeguamenti traduzione cumulativi e i trattamenti di eliminazione dei periodi precedenti
Le prestazioni sono state lente - 90 minuti
Cliente E - Miglioramenti allo script
Utilizzare Data_Input nel target per evitare l'errore di convalida relativo alla scrittura in FCCS_Intercompany_Eliminations
Utilizzare bottom-up su membri ICP analisi con input saldo chiusura
Durata ridotta da 90 minuti a 11 minuti
Riepilogo delle procedure consigliate
Elaborazione bottom-up
Utilizzare @REMOVE per rimuovere il conto invece di usare il controllo @ISMBR nella dimensione densa Conto
Utilizzare @ISLEV booleano invece di @LEV e @CURRMBR
Rimuovere i membri limitati da FIX
Utilizzare Copia per creare il blocco target se non funziona l'approccio ancora
Calcolo eseguito solo su un membro dimensione customizzato target
Utilizzare @LIKE per rendere generico lo script
Evitare la creazione automatica blocchi
Verificare la presenza di casi limite
Controllare prima i casi comuni.
Procedure consigliate per le prestazioni
Passaggi multipli a Essbase
Ogni volta che viene utilizzata l'istruzione FIX in una regola, ciascuna istruzione FIX attiverà un passaggio separato al database. In termini di prestazioni, sarebbe più opportuno evitare passaggi multipli a Essbase non includendo troppe istruzioni FIX separate.
Esempio: passaggi multipli a Essbase
FIX("Entity Currency", "FCCS_Entity Input", …..) FIX("FCCS_Data Input", … ) //Calculations; ENDFIX FIX("FCCS_Other Data", … ) //Calculations; ENDFIX ENDFIX
Esempio: modifiche suggerite per evitare passaggi multipli mediante 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
Esempio: modifiche suggerite per evitare passaggi multipli mediante Blocco membri
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
Esempio: istruzioni FIX multiple nidificate distinte che causano passaggi multipli a 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*/
Esempio: riscrittura per evitare passaggi multipli
FIX ("FCCS_Elimination",@Relative("ICP_Category A",0), "No Movement") "Custom_Elimination" ( @CALCMODE(BOTTOMUP); "640102" = "WA_Intercompany Account"->"FCCS_Intercompany Eliminations"; ) ENDFIX
Operazioni di scrittura nei membri con limitazioni
In questo esempio, si supponga di voler riclassificare i dati da "FCCS_Intercompany Eliminations" > "FCCS_Eliminations" > "Mvmts_NewBusiness" a "Data Input" > "FCCS_Eliminations" > "Mvmts Reclass."
Tuttavia, poiché "FCCS_Intercompany Eliminations" è un membro con limitazioni per la dimensione origine dati, se si utilizza un'istruzione FIX in questo membro, il sistema restituirà un errore.
Si può provare a scrivere le seguenti istruzioni per forzare il sistema a utilizzare l'elaborazione top-down.
Esempio: utilizzo dei membri con restrizioni utilizzando l'elaborazione top-down
FIX("Data Input", … ) "FCCS_Elimination" ( "Mvmts_Reclass" = -1 * "FCCS_Intercompany Eliminations"->"Mvmts_NewBusiness" ; ) ENDFIX
Esempio: riscrittura delle istruzioni utilizzando l'elaborazione bottom-up
FIX("FCCS_IntercomanyEliminations", "Mvmts_NewBusiness", … ) "FCCS_Elimination" ( @CALCMODE(BOTTOMUP); "Mvmts_Reclass"->"Data Input" = -1 * "Mvmts_NewBusiness" ; ) ENDFIX
Si noti che in questo esempio viene utilizzata un'istruzione FIX in "FCCS_Intercompany Eliminations", ma questa istruzione viene sostituita da "Data Input" nel blocco membri e il sistema non restituisce alcun errore durante la convalida.
Immissione di dati nell'input del saldo di chiusura e calcolo del trasferimento basato su ADU
In questo esempio, si supponga di voler spostare l'input del saldo di chiusura in un membro di trasferimento specifico. Si potrebbe scrivere un calcolo custom con i requisiti riportati di seguito.
FIX sulle combinazioni di membri delle dimensioni sparse per l'elaborazione bottom-up. L'elaborazione bottom-up è correlata ai blocchi e le dimensioni sparse definiscono un blocco.
Gli attributi definiti dall'utente (ADU) vengono elaborati meglio insieme a un'istruzione FIX nei conti ADU per eseguire lo stesso calcolo.
Nell'esempio seguente si suppone che tutti gli ADU specificati siano definiti in tipi di conto Attività, Passività, Equity.
FIX sui membri delle dimensioni conto di livello zero relativi a FCCS_Net Income.
Utilizzare una funzione booleana anziché calcolare il livello del membro mediante @LEV per migliorare le prestazioni.
Utilizzare la funzione booleana @ISDESC per verificare se il membro è un discendente. Sarà sempre un membro foglia.
Esempio: immissione di dati nell'input del saldo di chiusura e calcolo del trasferimento basato su ADU
Migliore utilizzo della condizione IF
Viene riportato di seguito un esempio classico di scrittura di istruzioni condizionali con IF. In questo esempio, si desidera eseguire uno specifico processo in gennaio, ma negli altri mesi si desidera eseguire processi differenti. Se il calcolo viene scritto come riportato sotto, il sistema esegue la verifica 12 volte per tutti i periodi escluso gennaio, in quanto la verifica inizia sempre da gennaio e poi salta alla clausola ELSE.
Esempio: istruzione 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
Esempio: riscrittura delle istruzioni utilizzando NOT IF
È possibile riscrivere l'istruzione IF in modo tale che 11 dei 12 periodi vengano eseguiti con la clausola IF e poi esclusi dal ramo condizionale. Solo gennaio verrà eseguito una volta nella clausola ELSE.
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
Utilizzo dell'opzione Calcoli di sistema Membro custom più alto con dimensionalità estesa
Per le dimensioni customizzate definite dall'utente, gli amministratori dei servizi possono scegliere di elaborare i calcoli di sistema utilizzando il membro più alto della dimensione customizzata, anziché tutti i membri di livello 0, al fine di ottenere prestazioni migliori. È possibile selezionare dimensioni customizzate specifiche per le quali applicare l'opzione. Fare riferimento a Calcoli di sistema.
Se si utilizza un ambiente con dimensionalità estesa, per assicurarsi che l'uso del membro custom più alto non abbia un impatto negativo sulle prestazioni, è possibile creare un blocco vuoto in "NoCustomX" all'inizio del consolidamento basato sui dati Input entità e Valuta entità, quindi usare il blocco creato per eseguire tutti i calcoli. Ad esempio, se si dispone di 1000 membri custom nella dimensione customizzata Product, è possibile creare un blocco @"No Product", impostare un comando FIX su "No Product" e utilizzare l'elaborazione bottom-up. In questo modo il sistema non dovrà elaborare successivamente tutti e 1000 i membri della dimensione Product e sarà possibile utilizzare il "prodotto totale" per il valore del totale al fine di migliorare le prestazioni complessive.
Nell'esempio seguente viene illustrato uno script di calcolo campione:
Calcolo in corso di blocchi membri FCCS_10 con l'elaborazione bottom-up
Utilizzare @CALCMODE(BOTTOMUP) e combinare i calcoli dei blocchi membri.
Se i membri FIX sono uguali nei vari calcoli, combinare i calcoli di più FIX...ENDFIX in un unico blocco di comandi FIX...ENDFIX.
Se si tratta di un calcolo singolo, evitare comandi FIX nidificati.
Gli esempi riportati di seguito illustrano l'esecuzione del calcolo con l'elaborazione top-down e un'esecuzione modificata con l'elaborazione bottom-up per migliorare l'elaborazione delle query sul lato destro.
Esempio: esecuzione di FCCS_20 C1_Validation con l'elaborazione top-down
Esempio: esecuzione di FCCS_20 C1_Validation con l'elaborazione bottom-up
Dipendenza calcolo
È consigliabile evitare le dipendenze tra entità quando i calcoli vengono eseguiti nei calcoli configurabili (punti di inserimento) e nelle regole su richiesta. Se si prova a fare riferimento al valore dell'entità A nel calcolo e se l'entità A non è stata ancora calcolata, l'entità A non avrà alcun valore.
Ad esempio, se si tenta di riclassificare i dati da "Entity A" > "ICP_B" > "Entity Currency" (origine) a "Entity B" > "ICP_A" > "Entity Currency" (destinazione), i dati nell'entità A (origine) potrebbero non essere disponibili perché non calcolati, se l'entità A e l'entità B vengono calcolate in parallelo.
In casi simili, è consigliabile tentare la riclassificazione calcolando prima di tutto l'entità A e quindi l'entità B dipendente.