Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

NavigazioneMarittima:PowerBI Programmazione

From Aino Wiki

Jump to: navigation, search

Custom visuals

L'ambiente di sviluppo include l'installazione di node.js, pbiviz e Visual Studio Code (preparazione ambiente di sviluppo).

Linguaggio delle formule

Power Query M

PowerBI usa un linguaggio interno per le composizioni delle formule chiamato: Power Query M: [1]

Seguono lo stesso esempio in due momenti. E' il risultato del "Query Editor" dopo aver aggiunto una colonna con l' "Advanced Editor". Si aggiunge una colonna con la differenza di date, traformata in giorni e con l'aggiunta di 1 (giorno). PURTROPPO però questi cambiamenti non son tollerati dalla "Direct Query" di ciò se ne ha notizia al salvataggio.
Es. 1

let
    Source = Sql.Database("SPXMIW2869", "RS_Plan_ProjectVCVI_Test"),
    dbo_v_Projects = Source{[Schema="dbo",Item="v_Projects"]}[Data],
    #"Added Custom" = Table.AddColumn(dbo_v_Projects, "Days", each [DateTo]-[DateFrom]),
    #"Inserted Days" = Table.AddColumn(#"Added Custom", "Days.1", each Duration.Days([Days]) + 1, Int64.Type),
    #"Removed Columns" = Table.RemoveColumns(#"Inserted Days",{"Days"}),
    #"Reordered Columns" = Table.ReorderColumns(#"Removed Columns",{"IDProject", "IDOwner", "FullName", "Description", "DateFrom", "DateTo", "Days.1", "ProgressPerc"})
in
    #"Reordered Columns"

Es. 2. Stessa funzione di prima ma semplificata

let
    Source = Sql.Database("SPXMIW2869", "RS_Plan_ProjectVCVI_Test"),
    dbo_v_Projects = Source{[Schema="dbo",Item="v_Projects"]}[Data],
    #"Added Custom" = Table.AddColumn(dbo_v_Projects, "Days", each Duration.Days([DateTo]-[DateFrom]) + 1)
in
    #"Added Custom"

DAX

Dax, Data Analysis Expressions, è una libreria di funzioni e operatori che è possibile combinare per creare formule ed espressioni nei modelli di dati per Power BI (ed anche per Analysis Services e Power Pivot in Excel).
Le formule DAX includono funzioni, operatori e valori per eseguire query e calcoli avanzati sui dati presenti in tabelle e colonne correlate nei modelli di dati tabulari.
Ottimi manuali Online:

Tutorial:

Varie

Riferimento a tabelle:
'Table Name'[ColumnName] caso in cui nel nome della tabella ci siano spazi TableName[ColumnName] caso in cui nel nome della tabella NON ci siano spazi

Funzioni

Sulle Date

  • Restituisce la data di oggi: NOW() , TODAY()
  • Per avere solo l'orario di una data: TimeValue() , es.: Time = TimeValue([Date])
  • Restituisce una data personalizzata: DATE(), es.: DATE( YEAR(TODAY()) + 1, 3, 31)
  • Differenza in giorni tra due date: DATEDIFF(<DataInizio>, <DataFine>, <intervallo>)
 <intervallo> può essere: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUATER, YEAR
 è RESTITUITO SEMPRE UN VALORE INTERO

NOTA la data vuota è data da: DATE(00, 01, 01) che corrisponde al 01/01/1900

Sulle Stringhe

Canonici
  • LEN(campo), restituisce la lunghezza di una stringa
  • LEFT(campo, n), Prende i primi n caratteri di un campo stringa
  • RIGHT(campo, n), Prende i primi n caratteri di un campo stringa
Varie soluzioni
  • Substring() si simula così, ad es.: _ada_format = LEFT(_SpecialDates[ada], 3) & "-" & LEFT(RIGHT(_SpecialDates[ada], LEN(_SpecialDates[ada]) - 3), 12)

Booleane - logiche

Per verificare se il valore di un campo è nulla, NULL, si può usare ISBLANK(), quindi si potrà in aggiunta usare la funzione IF() che si paserà sul risultato della prima.
NOTA la funzione BLANK() può esser usata per restituire un valore vuoto.

[campoCalcolato] = IF(ISBLANK([Valore A])
                          ,BLANK()
                          ,DIVIDE(
                                 COUNTA(FILTER(Tabella, [Valore A] = "Yes"))
                                 ,COUNTA([Value A])
                                 )
                      )

Operatori logici

OR = || AND = && Esempio in una "Measure":

Conditional Date1 = IF(([Selected DateFrom] <= [DatetoM1] 
							&& [Selected DateTo] >= [DateFromM1])
						|| [FlatStatus] = "Freezed" 
						|| [FlatStatus] = "Late" 
					 ,"T", "F") 

IF

Doc IF

IF(<logical_test>, <value_if_true>[, <value_if_false>])

Parametri:

Termine Definizione
logical_test Qualsiasi valore o espressione che può dare come risultato TRUE o FALSE.
value_if_true Valore restituito se il test logico dà come risultato TRUE.
value_if_false (Facoltativo) Valore restituito se il test logico dà come risultato FALSE. Se omesso, viene restituito BLANK.

Es. nella definizione di una variabile:

_parameter = IF(V_D_rpt_trf_cps_cc_rtype[rtype]="1" 
&& V_D_rpt_trf_cps_cc_rtype[site]="Rome"
				,CONCATENATE(" ", V_D_rpt_trf_cps_cc_rtype[parameter])
				,V_D_rpt_trf_cps_cc_rtype[parameter])

SWITCH

E' simile al "CASE WHEN THEN ELSE" di T-SQL. Sintassi:

SWITCH(, , [, , ]…[, ])  

Parametri

Termine Definizione
expression Qualsiasi espressione DAX che restituisce un singolo valore scalare, dove l'espressione deve essere valutata più volte (per ogni riga/contesto).
value Valore costante da confrontare con i risultati di expression.
result Qualsiasi espressione scalare da valutare se i risultati di expression corrispondono all'elemento value corrispondente.
else Qualsiasi espressione scalare da valutare se i risultati di expression non corrispondono a nessuno degli argomenti di value.

es.:

= SWITCH (
         [Month Number Of Year],
         1, "January",
         2, "February",
         3, "March",
         4, "April",
         5, "May",
         6, "June",
         7, "July",
         8, "August",
         9, "September",
         10, "October",
         11, "November",
         12, "December",
         "Unknown month number"
        )
= SWITCH (
        TRUE,
        [Reorder Point] > [Safety Stock Level], "Good: Safety stock level exceeded",
        [Reorder Point] = [Safety Stock Level], "Minimal: Safety stock level met",
        [Reorder Point] < [Safety Stock Level], "At risk: Safety stock level not met",
        ISBLANK ( [Reorder Point] ), "Incomplete: Reorder point not set",
        ISBLANK ( [Safety Stock Level] ), "Incomplete: Safety stock level not set",
        "Unknown"
        )

Elaborazioni dinamiche

CALCULATE

  • CALCULATE(<expression>,<filter1>,<filter2>…) Valuta una espressione nel contesto di dati filtrati. Il primo parametro, l'espressione, è essenzialmente una 'measure'. Il valore restituito è il risultato dell'espressione fornita Dettagli

Es.:

Selected DateFrom = CALCULATE (IF(FORMAT(MIN(Calendar[Date]), "dd/MM/yyyy") = FORMAT(TODAY(), "dd/MM/yyyy")
				, MIN(Calendar[Date])-20
				, MIN(Calendar[Date]))
				, ALLSELECTED(Calendar[Date]) )

Filtraggio

  • ALL( [ | <column>[, <column>[, <column>[,…]]]] )</code>, il primo parametro è la tabella da cui rimuovere i filtri ed il secondo è la colonna. SCOPO: Restituisce una tabella o una colonna senza i filtri. Dettagli
  • ALLSELECTED([<tableName> | <columnName>[, <columnName>[, <columnName>[,…]]]] ), il primo parametro (opzionale) è il nome di una tabella esistente, il secondo parametro (opzionale) è il nome del campo della tabella di prima. SCOPO: Restituisce il contesto della query CON i filtri. Dettagli
  • ISFILTERED(tabella[campo], valore se campo filtrato, valore se campo NON filtrato)
  • Casi esemplari

    Uso ISFILTERED()
    Supponendo di verificare se uno slicer a selezione multipla sia filtrato:

    SlicerPowerBI CheckBox.png

    Si può creare una measure da visualizzare in una Card:

    _IsOwnerFiltered = IF ( ISFILTERED(v_ProjectOwners[OwnerName]), 1, 0)
    

    NOTA l'uso di due valori '1' e '0' nei casi di condizione positiva e negativa, le costanti true e false non sono gestibili.
    TIPS, questo metodo potrebbe essere usato per "accendere" o "spegnere" altri visuals in funzione della scelta fatta sullo slicer, basta usare la mesaure appena creata come fitro nella rappresentazione delle grandezze nel visual che si vorrà accendere o spegnere.

    PROBLEMA, ISFILTERED() è inefficace se inserito in una measure da valutare come campo ogni volta che viene selezionato un elemento dello slicer, occorre usare SWITCH().
    Nel caso dobbiamo verificare un filtro che condizioni un calcolo in una measure di una vista converrrebbe usare SWITCH().
    Con questa istruzione non possiamo riferirci a campi della vista che non siano oggetto di una funzione di aggregazione (es. MIN, MAX, SUM), pertanto occorre capire come i dati sono aggregati nel visual su cui rappresentare il campo calcolato.
    Nel seguente esempio la selezione di un owner deve influenzare il calcolo dei giorni di effort associati ad ogni Sistema il cui progetto dell'owner (Technical Leader) appartiene. Se non c'è selezione si divide l'effort per il numero di Sistemi\Vendor coinvolti, invece, se si seleziona un owner\technical leader l'effort va anche diviso per il numero di owner eventualmente associati al progetto.
    Si aggiungono due colonne con un calcolo in parallelo:

    _EffortFlatVendors = (v_ProjectOwners_Smpl[Effort] 
    		/ v_ProjectOwners_Smpl[NrVendors])
    
    _EffortFlatVendorsOwners = (v_ProjectOwners_Smpl[Effort] 
    			    / v_ProjectOwners_Smpl[NrVendors]) 
    			* 
    			   (1
    			    / v_ProjectOwners_Smpl[NrOwners])
    

    Quindi saranno usate nella measure che userà la SWITCH:

    _CalcSharedEffor = SWITCH(  SELECTEDVALUE( v_ProjectOwners_Smpl[OwnerName] )
    			, "Owner1", SUM(v_ProjectOwners_Smpl[_EffortFlatVendors])
    			, "Owne2", SUM(v_ProjectOwners_Smpl[_EffortFlatVendors])
    			, "Owner3", SUM(v_ProjectOwners_Smpl[_EffortFlatVendors])
    			, SUM(v_ProjectOwners_Smpl[_EffortFlatVendorsOwners])
    			)
    

    Variabili

    Stringhe

    Elenco funzioni sulle stringhe: docs.microsoft.com
    COMBINEVALUES, concatena con separatore n-campi di tabelle.
    EVALUATE DISTINCT(SELECTCOLUMNS(DimDate, "Month", COMBINEVALUES(",", [MonthName], [CalendarYear])))
    Visualizzerà una tabella con la seguente colonna:

    January,2007
    February,2007
    ...etc
    

    CONCATENATE, Unisce due stringhe di testo in una sola.
    CONCATENATE(<text1>, <text2>)

    RIGHT, prende n caratteri di una stringa contando da destra
    RIGHT(<text>, <num_chars>)
    Esempio:
    CONCATENATE("W", RIGHT(CONCATENATE("0", WEEKNUM('Calendar'[Date])), 2))
    Produrrà stringhe come: W01, W10, W54

    Date

    • DATE
    • HOUR
    • NOW() restituisce la data di oggi ma CON orario
    • TODAY() restituisce la data di oggi ma SENZA orario
    • EOMONTH
    • WEEKDAY

    Funzione

    Calendar è una tabella col campo [Date]

    IsToday = 
    	var currentRowDate = FORMAT(Calendar[Date], "dd/MM/yyyy")  
    	
    	var isToday= FORMAT(NOW(), "dd/MM/yyyy") 
    	
    	return 
    		IF(isToday= currentRowDate
    			, "yes"
    			, "no")
    

    Campi custom

    Campo data senza orario

    Esiste già il campo [adetdate] nella vista V_D_rpt_trf_cps_cc ma è di tipo DateTime, senza appesantire la vista SQL si può aggiingere un "campo trasformato" in PowerBI, allo scopo la definizione del nuovo campo si può fare usando DAX. Segue esempio ma attenzione a cambiarne la tipologia di formato da testo a data.

    _adetdate_short = FORMAT('V_D_rpt_trf_cps_cc'[adetdate], "dd/MM/YY")
    

    Campo ora da data

    Si usa la funzione HOUR(<datetime>)

    _hour = HOUR('V_D_rpt_trf_cps_cc'[adetdate])
    

    Mappa e Link


    PowerBI | MS Power apps


    MS SQL | SSRS - Reporting Server | SQL Integration Services | Tools di Reportistica
    C# | Visual Studio | Dizionario IT


    Parole chiave:

Author