lunedì 21 dicembre 2020

JSON in Sharepoint Document Library

Come certamente saprete tutti, i file con estensione .json NON possono essere caricati in una Document Library e comunque non verranno mai acceduti attraverso Sharepoint. Il motivo non viene mai esplicitato con chiarezza, ma è facilmente spiegabile. Nel web.config delle web application Sharepoint c'è la seguente entry nella sezione "handlers".

<handlers>

   <add name="JSONHandlerFactory" path="*.json" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, 

     System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 

     resourceType="Unspecified" preCondition="integratedMode" />

</handlers>

L'estensione .json in SharePoint è riservata ai .json enabled web services, in particolare la REST API per le operazioni client side. A causa dell'handler mostrato qui sopra anche se fossi in grado di caricare i miei file .json, avrei degli errori nel tentativo di accedervi a causa dell'handler che si frappone alla chiamata. L'estensione .json risulta così bloccata per mantenere l'integrità all'interno di SharePoint, come anche per l'estensione .aspx (tranne in Pages e Site Pages) e altri formati Web. Per aggirare questa limitazione basta rinominare il file .json in (per esempio) .txt.

venerdì 4 dicembre 2020

Power BI Query Code Branching

In qualunque linguaggio di programmazione vi sarete imbattuti nel "Conditional Code Branching" (in pratica l'If..Then..Else 😀). 

Se avete lavorato con Power BI, vi sarete anche imbattuti in Power Query soprattutto per l'acquisizione di dati da fonti dati esterne. 

Come funzionano questi due concetti messi insieme? In maniera piuttosto complessa e che richiede un bel po' di "pensiero laterale" è la risposta (vedi qui). 

In pratica il problema consiste nel fatto che M è un linguaggio funzionale, non imperativo, quindi ogni statement è una chiamata di funzione che ritorna un valore. 

Quindi per poter 'simulare' il blocco If..Then..Else va ripensato il tutto e gestirlo come un blocco "Then,,Else,,If". Mi spiego meglio: dato che è un linguaggio funzionale devo preparare il risultato del "Then", poi quello dell'"Else" e poi decidere quale ritornare con l'If. 


Esempio:

let

    Source = Table1,

    //THEN Code Block 

    #"ModifiedThenTable" = [your code here]    

    //ELSE Code Block 

     #"ModifiedElseTable" = [your code here]   

    result = 

        if [condition]

        then #"ModifiedThenTable"

        else #"ModifiedElseTable"

in

    #"result"