martedì 21 febbraio 2017

Caratteristiche di un buon universo BO

Riporto di seguito le caratteristiche che dovrebbe avere un universo Business Objects

Dal punto di vista "utente", ovvero per quanto riguarda ciò che l'utente finale dell'universo può "vedere" e usare:

- i nomi delle classi e degli oggetti devono essere molto familiari all'utente
- la disposizione delle classi e delle sottoclassi di oggetti deve essere ben organizzara e se possibile in gerarchia
- gli oggetti all'interno delle classi devono essere disposti dall'alto verso il basso dal padre verso il nipote, cioè in gerarchia se possibile, questo consente all'utente di usare il drill down anche se non sono state create delle gerarchie personalizzate
- l'universo deve avere una descrizione chiara e aggiornata
- gli oggetti devono avere una descrizione sempre (se possibile anche le classi); le descrizioni accettano i tag HTML, è possibile quindi inserire dei ritorni a capo e dei colori
- gli oggetti particolari devono avere il formato gestito a livello di universo
- le misure o metriche che hanno senso solo per una classe di oggetti devono stare nella medesima classe di questi oggetti
- i contesti di analisi devono avere un nome familiare all'utente, ma soprattutto devono avere una descrizione che consenta all'utente di prendere una decisione, cioè capire quale tipo di analisi otterrà scegliendo un contesto al posto di un altro
- devono essere gestite le incompatibilità tra oggetti
- devono essere gestiti i limiti di righe estratte e di tempo dedicati alla query perché i valori di default sono troppo restrittivi
- le liste di valori degli oggetti, se possono essere esposte all'utente come gerarchie padre/figlio, vanno modificate rispetto al default (select distinct di una colonna), in modo che l'utente sia agevolato nella scelta del valore interessato, potendo quindi scegliere il padre e quindi il valore di interesse
- le liste di valori se possibile devono avere un ordinamento, perchè per default eseguono una select distinct del campo senza ordinamento
- è utile creare degli oggetti che forniscano all'utente alcune date standard di riferimento, come ad esempio la data di oggi, di ieri, del primo e dell'ultimo giorno del mese in corso e del mese precedente, l'ultimo giorno dell'anno, ecc, dato che l'utente potrà poi usare questi oggetti, apparentemente inutili se esposti come risultato della query, ma fondamentali invece se utilizzati come condizioni nella query, perchè l'utente potrà usarli in combinazione con altri oggetti per costruire condizioni dinamiche, come ad esempio: DATA INGRESSO CLIENTE >= IERI oppure DATA DI APERTURA DEL TICKET >= INIZIO DELL'ANNO IN CORSO
- una variante del punto precedente, relativo agli oggetti dedicati alle date, dovrebbe includere dei @prompt nell'sql, in modo che l'utente possa utilizzare un oggetto che permetta di avere una data pari a oggi - X giorni, dove X viene gestito dall'utente grazie al @prompt

Dal punto di vista "tecnico", ovvero per quanto riguarda le funzionalità tecniche che l'utente subisce in modo trasparente

- deve in diversi casi essere rimosso il flag che costringe l'universo a creare molteplici query per ogni metrica o misura
- devono essere gestite eventuali outerjoin in modo che l'utente non inserisca involontariamente dei filtri man mano che aggiunge oggetti nelle query; ogni universo dovrebbe avere un obiettivo di analisi specifico, ad esempio il Cliente o i Ticket, quindi aggiungendo oggetti nella query non si dovrebbero filtrare le righe e quindi mantenere la cardinalità corretta di Clienti e Ticket
- devono essere gestiti i numeri di righe delle tabelle, in modo automatico (il sistema conta le righe) o in modo manuale; questa funzione è utile perchè l'sql sarà costruito considerando i "pesi" delle tabelle e quindi la FROM sarà gestita in modo coerente nell'SQL (per oracle ricordarsi di modificare il parametro REVERSE_TABLE_WEIGHT da Y a N)
- descrivere le varie versioni di modifica dell'universo, inserendo degli oggetti dimensione nascosti, che hanno per nome la versione o la data della modifica, e nella descrizione un testo che spieghi cosa è stato modificato
- inserire nel modello dati delle descrizioni vicino alle tabelle
- evitare se possibile l'uso eccessivo di alias e quindi il proliferare di oggetti ridondanti verso l'utente
- gestire il parametro BOUNDARY_WEIGHT_TABLE: questo parametro permette di evidenziare una soglia di righe, superata tale soglia, i filtri delle query creati dagli utenti con gli oggetti non saranno gestiti nella WHERE condition dell'SQL, ma come sotto SELECT all'interno della FROM, dove ovviamente la sotto SELECT avrà il filtro richiesto dall'utente nella sua WHERE
- ovviamente prima della pubblicazione deve essere fatto un check di integrità

venerdì 18 aprile 2014

Media rolling degli ultimi X mesi

Ho trovato questa soluzione molto interessante, quindi la condivido così com'è aggiungendo solo una spiegazione in italiano: al seguente link è possibile capire come ottenere la media di un valore numerico per gli ultimi 12 mesi rolling, per esempio.
Immaginiamo di avere una tabella che per ogni mese ci fornisce i nostri ricavi, ma che al fianco di ogni mese vogliamo vedere la media delle revenue per gli ultimi 12 mesi precedenti ad ogni mese.
La soluzione proposta al seguente link fa al caso vostro, si basa su due funzioni, cioè la sommacumulata() e la funzione indietro() o precedente().
La soluzione spiega anche come usare i filtri per nascondere le righe inutili e quindi utilizza la funzione nessunfiltro() per fare in modo che la formula alla base della soluzione funzioni comunque, anche se la tabella ha un filtro che serve a mascherare le righe inutili

Link Soluzione: media ultimi mesi rolling


giovedì 5 dicembre 2013

Differenza tra periodi

Tramite l'operatore "Dove" abbiamo la possibilità di calcolare la differenza (delta) tra informazioni disponibili su differenti periodi temporali, ad esempio tra differenti settimane; il calcolo può essere comodamente posizionato in una colonna di "footer", per intenderci la colonna che Web Intelligence aggiunge quando chiediamo una somma in una tabella a campi incrociati, evitando quindi di avere invece la differenza all'interno del corpo e vederla quindi ripetuta per ogni periodo temporale.

Nell'esempio che segue abbiamo un report che mostra una tabella a campi incrociati che espone due settimane a confronto, le due settimane messe a confronto sono pilotate da un apposito filtro sulla tabella. Nella colonna di totale dove di solito Web Intelligence inserisce le sue somme automatiche ho sostituito la formula della somma con la seguente formula:

=([Nr Id 00 Risorsa Final] Dove ([Data riferimento]=Max([Data riferimento]) In Blocco)) - ([Nr Id 00 Risorsa Final] Dove ([Data riferimento]=Min([Data riferimento]) In Blocco))

In questo modo il filtro derivante dall'operatore Dove si focalizzerà sulla prima settimana selezionata dal filtro sulla tabella e sulla seconda e quindi calcolerà in modo semplice e veloce la differenza; questa soluzione consente di modificare velocemente il filtro, ad esempio con un controllo di input, ed ottenere sempre la differenza.


mercoledì 27 novembre 2013

Novità introdotte da Web Intelligence 4.1 rispetto alla 3.1

Elenco di seguito le novità più interessanti introdotte da Web Intelligence 4.1 rispetto alla versione 3.1, in molti probabilmente stanno aspettando che la main release 4.x diventi stabile, e quindi probabilmente partono dalla versione 3.1.

  • interfaccia di Web Intelligence Rich Client completamente ridisegnata
  • nuove forme grafiche come: grafico a colonne, mappa calore, mappa di testo, grafico mono barra, waterfall
  • export/import di file excel da 1.000.000 di righe (.XLSX)
  • fit to one page
  • la possibilità di nascondere le colonne di una tabella o una tabella intera, anche sulla base di una formula (esempio: la tabella si nasconde al verificarsi di alune condizioni)
  • nuovo data management dove è possibile vedere velocemente il numero di righe estratte, la durata delle query, duplicare le query, unire le query o cancellarle; selezionando gli oggetti di una query si possono vedere i valori distinti oppure facendo doppio click su una query si può vedere un set tidotto di righe in modalità datasheet
  • gestione dei Template: import ed export di fogli di stile CSS utile per creare un solo template di colori e font e riutilizzarlo in tutti i report
  • semplificata e diretta gestione degli ordinamenti
  • migliorata la cestione della CPU, Web Intelligence Rich Client quando chiude un documento consete già l'apertura di un nuovo report perchè prosegue in backgroud
  • migliorate integrazioni con SAP, è possibile lanciare una query BEx
  • uso dei drill con il tasto (+) vicino all'elemento nel caso di universi OLAP
  • merge delle dimensioni con bottone destro sulla dimensione per velocizzare il merge
  • dall'editor delle formule ora è possibile accedere ai possibili valori di una dimensione, senza doverli digitare a mano
  • si può costringere la query a cancellare gli oggetti non usati nel report
  • link tra una tabella e un grafico: selezionando degli elementi in una tabella si causano dei filtri in un grafico sulla stessa pagina
  • nuovo motore dedicato ai grafici che migliorata la gestione, molte cose si possono modificare velocemente con bottone destro, migliorata la gestione dei colori
  • freeze colums e rows durante la modalità di lettura dei dati
  • copia/incolla degli oggetti e delle query tra documenti diversi
  • preview di un set di dati mentre si prepara la query; i valori possono essere trasformati in condizioni della query tramite bottone destro del mouse
  • nel pannello delle query la funzionalità di ricerca degli oggetti ora filtra la lista degli oggetti dell'universo mostrando solo gli oggetti che corrispondono alla ricerca
  • nuove formule con funzioni che consentono la gestione dei Set e dei Livelli nelle dimensioni nel caso di universi OLAP
  • possibilità di raggruppare i dati in modo semplice e veloce, evitando le riclassifiche nel DB o nell’universo
  • possibilità di salvare nella query le risposte date ad un prompt
  • possibilità di copiare il nome, il tipo e la descrizione di un oggetto per incollari ad esempio in un file di testo o in un documento
Purtroppo parallelamente abbiamo perso la possibilità di creare una crosstab, trascinando una dimensione direttamente sopra l'intestazione di una tabella e la gestione diretta dei filtri complessi di un report (ora tale gestione è diventata un po' più macchinosa e scomoda).

Grafico a barre nella riga della tabella

Segnalo questo video molto interessante che mostra come ottenere un grafico a barre all'interno delle righe di una tabella grazie ad alcune formule e una sapiente formattazione.

Video

sabato 4 maggio 2013

Calendario

Vi è mai successo di estrarre dati da un universo, per esempio per un periodo temporale definito a livello di singolo giorno, e di verificare poi che le date estratte a volte hanno dei buchi? Significa che per un particolare giorno i dati non sono disponibili, questo però crea un difetto visivo brutto esteticamente se si realizza un grafico, o comunque anche in forma tabellare se si portano le date in colonna non si avrà continuità tra le date da sinistra verso destra, rendendo brutta visivamente una eventuale linea temporale.
È possibile risolvere il problema creando una nuova query nel report che ci fornisca una sorta di calendario, che garantisca quindi la presenza di una data per tutti i giorni necessari.

La query calendario può puntare ad un universo, l'importante è essere sicuri che tale query possa fornire tutte le singole date che ci servono, e poi sincronizzare la nuova query con la precedente per data. Sincronizzando, se la prima query ha diverse dimensioni di analisi oltre alla data, sarebbe importante avere la possibilità di sincronizzare le due query per data e per tutte le dimensioni che la prima query include, per evitare poi di avere problemi perchè le due query sono differenti per quanto riguarda le dimensioni di analisi. Ovviamnete se le due query hanno le stesse dimensioni per via della sincronia, si potrebbe allora obiettare che la seconda query è uguale alla prima, e quindi anche questa potrebbe non avere tutte le date necessarie: non è detto, perchè magari la prima query ha dei filtri particolari che la portano a non estrarre tutte le date possibili per il perido analizzato, quindi sulla seconda si possono evitare tali filtri, solo per arrivare ad avere tutte le date necessarie e poter sincronizzare. In questo caso la seconda query può essere un duplicato della prima e poi cambieremo i filtri.

Se non è possibile creare una seconda query su un universo per ottenere tutte le date del periodo interessato è possibile creare un elenco di date in excel e caricare quindi il file excel come nuova query in Web Intelligence Rich Client, sincronizzando la query che punta al file excel con la prima per data dovremmo colmare i buchi delle date mancanti. Se necessario è possibile declinare il file excel per tutte le date e le dimensioni di analisi utili per la sincronia, per non avere problemi di sincronizzazione. Se la moltiplicazione tra le date del calendario nel file excel e le occorrenze delle altre dimensioni eccede un certo numero può darsi che il file excel diventi troppo popoloso e difficoltoso da manutenere, rendendo questa soluzione scomoda.

sabato 30 marzo 2013

Riclassificare i ricavi per fasce e visualizzare i ricavi medi per fascia e offerta

E' possibile utilizzare una IF per riclassificare ad esempio i ricavi in Euro dei nostri clienti, per dividerli in fasce di ricavo, e creare una matrice che per ogni offerta e quindi per ogni fascia di ricavo ci dica nell'incrocio degli assi qual'è il ricavo medio che ci danno i clienti appartenenti a quella fascia di ricavo / offerta.
Non è difficile e con due formule è possibile ottenere la fascia di ricavo da mettere in riga nella nostra matrice, e la media per cliente.

Passo 1
Creiamo la formula che costituisce la fascia di ricavo e inseriamola in una variabile che chiameremo Range Ricavi.
La formula ha la seguente sintassi:
=(IF([Supplied Euro Amount]>80;">80";IF([Supplied Euro Amount]>74,99;"75-80";IF([Supplied Euro Amount]>69,99;"70-75";IF([Supplied Euro Amount]>64,99;"65-70";IF([Supplied Euro Amount]>59,99;"60-65";IF([Supplied Euro Amount]>54,99;"55-60";IF([Supplied Euro Amount]>49,99;"50-55";IF([Supplied Euro Amount]>44,99;"45-50";IF([Supplied Euro Amount]>39,99;"40-45";IF([Supplied Euro Amount]>34,99;"35-40";IF([Supplied Euro Amount]>29,99;"30-35";IF([Supplied Euro Amount]>24,99;"25-30";IF([Supplied Euro Amount]>19,99;"20-25";IF([Supplied Euro Amount]>14,99;"15-20";IF([Supplied Euro Amount]>9,99;"10-15";IF([Supplied Euro Amount]>4,99;"05-10";"00-05")))))))))))))))))




Passo 2
Creiamo la matrice; in riga mettiamo la nostra nuova variabile [Range Ricavi]: si tratta di una variabile che costringerà la matrice ad aggregare i dati che metteremo nel corpo. In colonna mettiamo l'oggetto [Riclass Mktg Offer 1] che ci arriva dall'universo (questo oggetto in pratica contiene le offerte per i clienti), in sezione mettiamo l'oggetto [Class Unita] che ci arriva dall'universo (classifica i clienti per classe di appartenenza).

Passo 3
Nel corpo della matrice digitiamo la seguente formula
=Media([Supplied Euro Amount] In ([Customer No];[Range Ricavi];[Riclass Mktg Offer 1];[Class Unita])

In pratica la formula che calcola la media usa l'operatore In () per contestualizzare il calcolo della media; la contestualizzazione costringe la media a lavorare per tutte le dimensioni che sono coinvolte nella matrice in riga, in colonna e in sezione (pagina), ma aggiunge una dimensione di analisi, cioè l'oggetto [Customer No] che arriva dall'universo, in questo modo la media sarà calcolata all'interno della matrice per singolo cliente, e poi inserita nel corretto incrocio di riga e colonna, cioè nel corretto incrocio di [Range Ricavi], [Riclass Mktg Offer 1] e [Class Unita] (che è in sezione).
L'operatore In () usato con una dimensione di analisi aggiuntiva che non viene usata nel report, costringe la media ad andare in dettaglio, in questo caso sul singolo cliente ([Customer No]), e calcolare quindi la media per cliente.



Le immagini e gli oggetti si riferiscono a casi reali, ecco perchè i nomi degli oggetti spesso sono un pò particolari, e i numeri mascherati. Seleziona le immagini per vederle meglio e ingrandire.