Grupurile de calcul sunt o caracteristică nouă în DAX, inspirată de o caracteristică similară disponibilă în MDX cunoscută sub numele de membri calculați. Grupurile de calcul sunt ușor de utilizat; cu toate acestea, proiectarea corectă a unui model cu grupuri de calcul poate fi o provocare atunci când creați mai multe grupuri de calcul sau când utilizați elemente de calcul în măsuri.

Înainte de a furniza o descriere a grupurilor de calcul, este util să petreceți ceva timp analizând cerința de afaceri care a dus la introducerea acestei caracteristici. Un exemplu care implică calcule legate de timp se potrivește perfect.

Modelul nostru eșantion conține măsuri pentru a calcula valoarea vânzărilor, costul total, marja și cantitatea totală vândută utilizând următorul cod DAX:

Toate cele patru măsuri sunt utile și oferă informații diferite despre afacere. Mai mult, toate cele patru măsuri sunt buni candidați pentru calculele de informații de timp. O cantitate anuală până la data peste vânzări poate fi la fel de interesantă ca o dată până la data peste valoarea vânzărilor și peste marjă. Același considerent este valabil pentru multe alte calcule de informații temporale: aceeași perioadă a anului trecut, creștere în procente față de anul precedent și multe altele.

Cu toate acestea, dacă se dorește construirea tuturor calculelor de informații de timp diferite pentru toate măsurile, numărul măsurilor din modelul de date poate crește foarte repede. În lumea reală, gestionarea unui model de date cu sute de măsuri este intimidantă atât pentru utilizatori, cât și pentru dezvoltatori. În cele din urmă, considerați că toate diferitele măsuri pentru calculele de inteligență temporală sunt variații simple ale unui model comun. De exemplu, versiunile anuale ale listei anterioare de patru măsuri ar arăta după cum urmează:

Toate măsurile anterioare diferă doar prin măsura de bază; toate aplică același context de filtrare DATESYTD la diferite măsuri de bază. Ar fi minunat dacă unui dezvoltator i s-ar oferi posibilitatea de a defini un calcul mai generic, folosind un substituent pentru măsură:

Codul anterior nu este o sintaxă DAX validă, dar oferă o descriere foarte bună a elementelor de calcul. Puteți citi codul anterior astfel: Când trebuie să aplicați calculul YTD la o măsură, apelați măsura după ce ați aplicat DATESYTD la coloana Data [Data]. Iată ce este un element de calcul: Un element de calcul este o expresie DAX care conține un substituent special. Substituentul este înlocuit cu o măsură de către motor chiar înainte de a evalua rezultatul. Cu alte cuvinte, un element de calcul este o variație a unei expresii care poate fi aplicată oricărei măsuri.

Mai mult, probabil că veți găsi nevoie de mai multe calcule de inteligență în timp. Într-adevăr, de la un an la altul, trimestrial până în prezent și aceeași perioadă a anului trecut sunt calcule care aparțin cumva aceluiași grup de calcule. Prin urmare, DAX oferă elemente de calcul și grupuri de calcul. Un grup de calcul este un set de articole de calcul care sunt grupate în mod convenabil, deoarece sunt variații pe același subiect.

Să continuăm cu pseudo-codul DAX:

După cum puteți vedea, am grupat patru calcule legate de timp într-un grup numit Time Intelligence. În doar patru rânduri, codul definește zeci de măsuri diferite, deoarece elementele de calcul aplică variația lor oricărei măsuri din model. Astfel, de îndată ce un dezvoltator creează o nouă măsură, variațiile CY, PY, QTD și YTD vor fi disponibile fără costuri.

Lipsesc încă câteva detalii în înțelegerea grupurilor de calcul, dar este necesar doar unul pentru a începe să profite de ele și pentru a defini primul grup de calcul: Cum alege utilizatorul o variantă? După cum am spus, un element de calcul nu este o măsură; este o variație a unei măsuri. Prin urmare, un utilizator are nevoie de o modalitate de a introduce într-un raport o măsură specifică cu una sau mai multe variații ale măsurii în sine. Deoarece utilizatorii au obiceiul de a selecta coloane din tabele, grupurile de calcul sunt implementate ca și cum ar fi coloane în tabele, în timp ce elementele de calcul sunt ca valorile coloanelor date. În acest fel, utilizatorul poate utiliza grupul de calcul din coloanele unei matrice pentru a afișa diferite variații ale unei măsuri în raport. De exemplu, articolele de calcul descrise anterior se aplică coloanelor unei matrice, prezentând diferite variații ale măsurii cuantumului vânzărilor.

sqlbi

Crearea grupurilor de calcul folosind Editorul tabular

Editorul tabular este primul instrument care permite dezvoltatorilor să creeze grupuri de calcul. Deoarece grupurile de calcul au nevoie de versiunea de compatibilitate 1470 a modelului Tabular, începând din iunie 2019 acestea sunt disponibile numai în Analysis Services 2019 și Azure Analysis Services.

În Editorul tabular, elementul de meniu Model/Grup de calcul nou creează un grup de calcul nou, care apare ca un tabel în model cu o pictogramă specială. În figura următoare, grupul de calcul a fost redenumit Time Intelligence.

Un grup de calcul este un tabel special cu o singură coloană, numit Atribut în mod implicit în Editorul tabular. În modelul nostru eșantion, am redenumit această coloană Time calc; apoi am adăugat trei elemente (YTD, QTD, și SPLY pentru aceeași perioadă a anului trecut) utilizând elementul din meniul contextual Element de calcul nou disponibil făcând clic dreapta pe coloana Time calc. Fiecare element de calcul are o expresie DAX.

Funcția SELECTEDMEASURE este implementarea DAX a substituentului pe care l-am folosit în pseudo-codul DAX anterior. Codul DAX pentru fiecare element de calcul este descris în următorul cod. Comentariul care precede fiecare expresie DAX identifică elementul de calcul corespunzător:

Cu această definiție, utilizatorul vede un nou tabel numit Time Intelligence, cu o coloană numită Time calc care conține trei valori: YTD, QTD, și SPLY. Utilizatorul poate crea un feliator pe acea coloană sau îl poate folosi pe rândurile și coloanele vizuale, ca și cum ar fi o coloană reală din model. De exemplu, când utilizatorul selectează YTD, motorul aplică YTD element de calcul pentru orice măsură este în raport. Următoarea figură prezintă o matrice care conține măsura cuantumului vânzărilor. Deoarece feliatorul selectează YTD variația măsurii, numerele afișate sunt valori de la an la zi.

Dacă în același raport utilizatorul selectează SPLY, rezultatul va fi foarte diferit.

Dacă utilizatorul nu selectează o valoare sau dacă utilizatorul selectează mai multe valori împreună, atunci motorul nu aplică nicio variantă măsurii originale.

Grupurile de calcul pot merge mai departe decât atât. La începutul acestui articol am introdus patru măsuri diferite: valoarea vânzărilor, costul total, marja și cantitatea vânzărilor. Ar fi extrem de frumos dacă utilizatorul ar putea folosi un feliator pentru a selecta metrica de afișat și nu numai calculul de inteligență de timp de aplicat. Am dori să prezentăm un raport generic care să împărțească oricare dintre cele patru valori în funcție de lună și an, permițând utilizatorului să aleagă valoarea dorită. Cu alte cuvinte, dorim să obținem raportul de mai jos.

În exemplul prezentat, utilizatorul răsfoiește marja utilizând o variație de la un an la altul. Cu toate acestea, utilizatorul poate alege orice combinație de tăietoare legate de cele două grupuri de calcul, Metric și Time calc.

Pentru a obține acest raport, am creat un grup de calcul suplimentar numit Metric, care include Suma de vânzări, Cost total, Marja, și Cantitatea de vânzări elemente de calcul. Expresia pentru fiecare element de calcul doar evaluează măsura corespunzătoare.

Când există mai multe grupuri de calcul în același model de date, este important să se definească în ce ordine ar trebui să fie aplicate de motorul DAX. Proprietatea Precedence a grupurilor de calcul definește ordinea de aplicare: primul grup de calcul aplicat este cel cu valoarea mai mare. Pentru a obține rezultatul dorit, am mărit proprietatea Precedence a grupului de calcul Time Intelligence la 10.

În consecință, motorul aplică grupul de calcul Time Intelligence înainte de grupul de calcul Metric, care menține proprietatea Precedence la valoarea implicită de zero. Următorul cod DAX include definiția fiecărui element de calcul din grupul de calcul metric:

Aceste elemente de calcul nu sunt modificatori ai măsurii inițiale. În schimb, înlocuiesc complet măsura inițială cu una nouă. Pentru a obține acest comportament, am omis o trimitere la SELECTEDMEASURE în expresie. SELECTEDMEASURE este utilizat foarte des în elementele de calcul, dar nu este obligatoriu.

Includerea și excluderea măsurilor din elementele de calcul

Există scenarii în care un element de calcul implementează o variație care nu are sens asupra tuturor măsurilor. În mod implicit, un element de calcul își aplică efectele asupra tuturor măsurilor. Cu toate acestea, dezvoltatorul ar putea dori să limiteze măsurile care sunt afectate de un element de calcul.

Se pot scrie condiții în DAX care analizează măsura curentă evaluată în model utilizând fie ISSELECTEDMEASURE, fie SELECTEDMEASURENAME. Funcția ISSELECTEDMEASURE returnează TRUE dacă măsura evaluată de SELECTEDMEASURE este inclusă în lista de măsuri specificată în argumente. De exemplu, următorul cod aplică elementul de calcul oricărei măsuri, cu excepția măsurii% Marjă:

O altă funcție care poate fi utilizată pentru a analiza măsura selectată într-o expresie de element de calcul este SELECTEDMEASURENAME, care returnează un șir în loc de o valoare booleană. De exemplu, codul anterior poate fi scris și în acest fel:

ISSELECTEDMEASURE este preferabil în locul SELECTEDMEASURENAME din mai multe motive:

  • Dacă numele măsurii este scris greșit folosind o comparație cu SELECTEDMEASURENAME, codul DAX returnează pur și simplu FALS fără să ridice o eroare.
  • Dacă numele măsurii este scris greșit folosind ISSELECTEDMEASURE, expresia eșuează cu eroarea Argumente de intrare nevalide pentru ISSELECTEDMEASURE .
  • Dacă o măsură este redenumită în model, toate expresiile care utilizează ISSELECTEDMEASURE sunt redenumite automat în editorul de modele (fixare formulă), în timp ce șirurile comparate cu SELECTEDMEASURENAME trebuie actualizate manual.

Funcția SELECTEDMEASURENAME ar trebui luată în considerare atunci când logica de afaceri a unui element de calcul trebuie să aplice o transformare bazată pe o configurație externă. De exemplu, funcția ar putea fi utilă atunci când există un tabel cu o listă de măsuri care ar trebui să permită un comportament într-un element de calcul, astfel încât modelul să aibă o configurație externă care poate fi modificată fără a necesita o actualizare a codului DAX.

Concluzii

Grupurile de calcul sunt o caracteristică nouă și interesantă a DAX. În acest prim articol tocmai am introdus grupuri de calcul. Următoarele articole descriu în mai multe detalii proprietățile disponibile, câteva exemple de utilizări posibile și cea mai bună practică pentru a scrie cod de încredere.

Returnează un set de date din anul până la ultima dată vizibilă în contextul filtrului.

DATESYTD ([,]) SELECTEDMEASURE

Returnează măsura care este evaluată în prezent.

SELECTEDMEASURE () ISSELECTEDMEASURE

Returnează adevărat dacă una dintre măsurile specificate este în curs de evaluare.

ISSELECTEDMEASURE ([, [, []]] SELECTEDMEASURENAME

Returnează numele măsurii care este evaluată în prezent.