Salta al contenuto

Come mostrare i valori di una misura soltanto in assenza di valori BLANK( ) in tutti i periodi selezionati dall’utente

In un precedente articolo, disponibile qui, è stato illustrato come mostrare i valori di una misura soltanto quando essa abbia valori non BLANK in tutti gli anni del calendario. In figura 1 e 2 sono mostrati, rispettivamente, il modello dati usato in ambiente Power Pivot e la relativa tabella pivot mostrante la misura QTY tutti gli anni che risolve lo scenario appena descritto.

Figura 1

Figura 2

Inoltre, sempre all’interno del precedente articolo, erano presenti due note indicanti possibili miglioramenti da apportare, una riguardante l’additività del calcolo – necessaria affinché la soluzione presentata funzionasse correttamente – l’altra riguardante la possibilità che l’utente selezionasse soltanto alcuni anni di calendario e si volessero mostrare i dati nel caso in cui la misura risultasse non BLANK soltanto in ognuno degli anni contenuti in quell’elenco ridotto di anni. Ovviamente ciò rende meno restrittivo il meccanismo, in particolare se si selezionano un numero relativamente piccolo di anni rispetto al loro numero totale.

In questo articolo, affronteremo la sintesi di una misura modificata che permetta questo livello di interazione con l’utente, che sarà libero di decidere quali, tra gli anni del modello, siano quelli su cui imporre l’assenza di BLANK come criterio per mostrarne i valori. In figura 3 è mostrato il comportamento della misura QTY tutti gli anni nel caso di una selezione di anni.

Figura 3

Come si osserva facilmente in figura 3, la misura QTY tutti gli anni non offre il comportamento che stiamo qui cercando. Essa, infatti, lavora sempre considerando tutti gli anni di calendario, ignorando la selezione di anni effettuata dall’utente. Ne risulta che, nonostante tutte le aziende clienti abbiano dati nei tre anni selezionati (2015, 2016 e 2017 in figura 3), QTY tutti gli anni mostra dati soltanto per le due aziende clienti (A e C) che hanno valori di QTY tutti gli anni in ognuno dei nove anni del calendario (dal 2013 al 2021 estremi inclusi).

Sviluppo

Ciò che si vuole ottenere è mostrato in figura 4.

Figura 4

Il codice della misura QTY tutti gli anni selezionati è molto simile alla già nota QTY tutti gli anni. Per comodità, si riporta qui di seguito il codice di QTY tutti gli anni e, a seguire, si ragionerà su cosa debba essere modificato per farla diventare QTY tutti gli anni selezionati. Per finire, verrà mostrato il codice di QTY tutti gli anni selezionati, evidenziandone le piccole (ma sofisticate) differenze rispetto a QTY tutti gli anni.

QTY tutti gli anni =
VAR TuttiGliAnni =
    COUNTROWS (
        ALL ( Anno[Anno] )
    )
RETURN
    SUMX (
        VALUES ( Azienda[Azienda] );
        VAR AnniAziendaCorrente =
            COUNTROWS (
                FILTER (
                    ALL ( Anno[Anno] );
                    NOT (
                        ISEMPTY (
                            CALCULATETABLE ( Dati )
                        )
                    )
                )
            )
        RETURN
            IF (
                AnniAziendaCorrente = TuttiGliAnni;
                [Qty]
            )
    )

Cosa deve cambiare nel codice sopra riportato, per ottenere quello che cerchiamo? Per prima cosa, è necessario catturare la selezione dell’utente: tre anni (2015, 2016 e 2017). Si potrebbe pensare di sostituire, nel codice di TuttiGliAnni e AnniAziendaCorrente, VALUES ( Anno[Anno] ) al posto di ALL ( Anno[Anno] ). Se così si facesse, tuttavia, non si otterrebbe quanto richiesto. A prima vista, però, potrebbe sembrare di sì (figura 5, il codice di QTY tutti gli anni selezionati usato è a seguire). Infatti, la figura 5 appare identica alla figura 4.

Figura 5

QTY tutti gli anni selezionati =
VAR TuttiGliAnniSelezionati =
    COUNTROWS (
        VALUES ( Anno[Anno] )
    )
RETURN
    SUMX (
        VALUES ( Azienda[Azienda] );
        VAR AnniSelezionatiAziendaCorrente =
            COUNTROWS (
                FILTER (
                    VALUES ( Anno[Anno] );
                    NOT (
                        ISEMPTY (
                            CALCULATETABLE ( Dati )
                        )
                    )
                )
            )
        RETURN
            IF (
                AnniSelezionatiAziendaCorrente = TuttiGliAnniSelezionati;
                [Qty]
            )
    )

Se, tuttavia, si include un altro anno nella selezione, in particolare un anno in cui non tutte le aziende hanno dati – per esempio il 2014 in cui B non ha dati -, i dati di B sono ancora visibili (figura 6).

Figura 6

In figura 6, i dati di B non dovrebbero essere visibili visto che la selezione è su quattro anni e B ha valori soltanto per tre. Il problema è che VALUES restituisce i valori di una colonna visibili nel filter context, e dunque fa vedere soltanto il particolare anno presente nel contesto. Dunque, col codice sopra riportato, è sempre vero che TuttiGliAnni e AnniAziendaCorrente sono uguali. ALLSELECTED, al contrario, permetterà di andare oltre il singolo anno visibile, ma senza considerare tutti e nove gli anni come farebbe ALL, bensì soltanto quelli selezionati (quattro, in quest’ultimo caso), come è visibile in figura 7.

Figura 7

Il codice corretto di QTY tutti gli anni selezionati – e commentato nei soli punti di modifica rispetto a quello di QTY tutti gli anni -, è a seguire. Nel citare, nei commenti, 4 anni e non 9, il codice fa riferimento alla figura 7. Lo stesso codice, se si selezionano i soli 2015, 2016 e 2017, fornisce il risultato già osservato in figura 4 e, dunque, risolve il problema.

QTY tutti gli anni selezionati =
VAR TuttiGliAnniSelezionati =
    COUNTROWS (
        ALLSELECTED ( Anno[Anno] ) — 4 anni (2014, 2015, 2016 e 2017) e non 9
    )
RETURN
    SUMX (
        VALUES ( Azienda[Azienda] );
        VAR AnniSelezionatiAziendaCorrente =
            COUNTROWS (
                FILTER (
                    ALLSELECTED ( Anno[Anno] );
                    — ancora 4 anni (2014, 2015, 2016 e 2017) e non 9
                    NOT (
                        ISEMPTY (
                            CALCULATETABLE ( Dati )
                        )
                    )
                )
            )
        RETURN
            IF (
                AnniSelezionatiAziendaCorrente = TuttiGliAnniSelezionati;
                [Qty]
            )
    )

Conclusioni

Come sempre, in DAX bisogna prima riflettere ed immaginare, poi scrivere codice. La modifica necessaria alla soluzione del problema è molto piccola ma per nulla banale. In effetti, ALLSELECTED è la funzione più complessa di tutto il DAX (non la più potente, tale ruolo resta a CALCULATE, ma sicuramente la più complessa). Tuttavia, ALLSELECTED può essere usata tranquillamente senza conoscerne in toto i meccanismi interni – estremamente complessi – e “facendo finta” che essa ignori i filtri in una visual ma non quelli esterni alla visual, come appare faccia nel nostro caso per la colonna Anno[Anno]. ALLSELECTED, in realtà. non ha alcuna idea di visual o slicer esterno ad una visual, tuttavia non è necessario andare a fondo su questo per usarla. Basta non usarla come funzione tabellare e non annidarla in iterazioni profonde dove la context transition diventi difficile da notare e da sottoporre a debug.

Autore del Post

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *