Procedure consigliate per i calcoli configurabili

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.


Blocco di dati 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.


Indice regole di esempio

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


Esempio di proprietà database

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.


    Script campione per la creazione di 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:


Esempio di script di calcolo del blocco dati

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 del blocco dati 1

Soluzione alternativa 2:


Soluzione alternativa del blocco dati 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.


Formato script di calcolo

Scrittura di calcoli configurabili

L'immagine seguente mostra le regole di calcolo configurabile nella scheda Valuta locale processo di consolidamento.


Schermata di configurazione calcoli - Esempio 1

L'immagine seguente mostra le regole di calcolo configurabile corrispondenti dalla scheda Valuta locale processo di consolidamento.


Esempio di calcolo configurabile 2

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:

  1. 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.

  2. Non è possibile applicare limitazioni di calcolo condizionali, ad esempio IF..ELSE..ENDIF.

  3. 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:

  1. 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.

  2. 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:

  1. Questo è un calcolo sparso perché il blocco membri FCCS_Managed Data è un'origine dati che è una dimensione sparsa.

  2. L'esecuzione del calcolo del blocco membri è bottom-up.

  3. 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.

  4. Non è necessario alcun operatore tridimensionale nel lato destro del calcolo.

  5. 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:

  • 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, 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


Caso d'uso Cliente A

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


Caso d'uso Cliente B

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


Caso d'uso Cliente C

Cliente C - Esempio di script - Continua


Caso d'uso Cliente C - 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


Caso d'uso Cliente D

Caso d'uso Cliente D - Continua

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


Caso d'uso Cliente E

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


Esempio di calcolo configurabile per l'input del saldo di chiusura mediante 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:


Esempio di calcolo configurabile per il membro custom più alto

Calcolo in corso di blocchi membri FCCS_10 con l'elaborazione bottom-up

  1. Utilizzare @CALCMODE(BOTTOMUP) e combinare i calcoli dei blocchi membri.

  2. 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 di calcolo configurabile C1 con l'elaborazione top-down

Esempio: esecuzione di FCCS_20 C1_Validation con l'elaborazione bottom-up


Esempio di calcolo configurabile C1 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.