Articoli

how to

Business Central offre di default l’integrazione al Common Data Service, come tutte le sue funzionalità però si può estendere, vediamo in che modo.

Oggigiorno l’integrazione tra sistemi è sempre più importante, app e servizi diversi si integrano sempre più tra loro formando un’unica rete al servizio dell’utente. Business Central si integra con la suite di Office365 tramite il Common Data Service (Cds), una base dati comune a tutti i servizi che vengono utilizzati da Office365, alla base standard di dati esposti sul Cds, è possibile come molte altre funzionalità, aggiungere le proprie personalizzazioni per modellare al meglio l’utilizzo del prodotto alle proprie esigenze.

Ipotizziamo quindi di dover integrare nel common data service una nuova tabella di business central che servirà nell’esecuzione di un Flow di Power Automate basato su Planner in modo che ad ogni nuova task venga generato e assegnato un numero di serie definito in Business Central.

Il primo passo è quindi la creazione di una normalissima tabella:

table 89100 "VAR Projects Planner Teams"
{
    Caption = 'Projects Planner Teams Setup';
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Project Code"; Code[50])
        {
            DataClassification = CustomerContent;
        }
        field(15; "Planner Id"; text[100])
        {
            DataClassification = CustomerContent;
        }
        field(20; "Planner Task No. Series"; Code[50])
        {
            DataClassification = CustomerContent;
            TableRelation = "No. Series";
        }
    }
keys
    {
        key(PK; "Project Code")
        {
            Clustered = true;
        }
    }
}

Seguita dalla sua page per l’inserimento dei dati

page 89100 "VAR Project Planner Teams"
{
    PageType = List;
    ApplicationArea = All;
    UsageCategory = Administration;
    SourceTable = "VAR Projects Planner Teams";

    layout
    {
        area(Content)
        {
            repeater(GroupName)
            {
                field("Project Code"; "Project Code")
                {
                    ApplicationArea = All;

                }
                field("Planner Id"; "Planner Id")
                {
                    ApplicationArea = All;
                }
                field("Planner Task No. Series"; "Planner Task No. Series")
                {
                    ApplicationArea = All;
                }
            }
        }
    }

Fin qua nulla di particolare, passiamo ora alla parte che serve all’esposizione sul Common Data Service.
Come detto inizialmente servono alcune cose:

    • Una pagina esposta sul Cds contenente le info di setup.
    • Una Procedura esposta anch’essa sul cds che stacchi un nuovo numero di serie alla creazione del task planner.

Iniziamo con la creazione della page esposta sul common data service, per fare questo basta creare una pagina di tipo API della tabella creata poco prima:

page 89101 "VAR Project Planner Teams API"
{
    PageType = API;
    Caption = 'VARProjectPlannerTeamsAPI';
    APIPublisher = 'VRP';
    APIVersion = 'v2.0';
    APIGroup = 'PRIMECDSDT';
    EntityName = 'VRPProjectPlannerTeams';
    EntitySetName = 'PPTSetup';
    DelayedInsert = true;
    SourceTable = "VAR Projects Planner Teams";

    layout
    {
        area(Content)
        {
            repeater(GroupName)
            {
                field(ProjectCode; "Project Code")
                {
                    applicationarea = all;
                }
                field(PlannerId; "Planner Id")
                {
                    applicationarea = all;
                }
                field(PlannerTaskNoSeries; "Planner Task No. Series")
                {
                    applicationarea = all;
                }
            }
        }
    }
}

E quindi creiamo anche la Codeunit contenente la funzione riguardante il nr. di serie da staccare.

codeunit 89100 "VAR CDS Connector"
{
    procedure GetNextNoSeries(plannerid: text): Text[50]
    var
        ProjectPlannerTeamsSetup: Record "VAR Projects Planner Teams";
        NoSeriesMgt: Codeunit NoSeriesManagement;
        JsonArray: JsonArray;
        JsonToken: JsonToken;
    begin
        ProjectPlannerTeamsSetup.Reset();
        ProjectPlannerTeamsSetup.SetRange("Planner Id", PlannerId);
        if not ProjectPlannerTeamsSetup.FindFirst() then exit('');

        exit(NoSeriesMgt.GetNextNo(ProjectPlannerTeamsSetup."Planner Task No. Series", WorkDate(), true));
    end;
}

Questa codeunit dovrà essere esposta come servizio web nel webclient di Business Central.

A questo punto l’app di Business Central è pronta e può essere pubblicata.

Si passa ora su PowerAutomate (ma potrebbe valere la stessa cosa anche per PowerApp).

La page e la codeunit sono esposte dal servizio di Business Central ma non sono ancora visibili nel common data service, per poterle vedere è necessario creare un connettore personalizzato.

Un connettore personalizzato si crea accedendo alla sezione dati e selezionando “connettori personalizzati”

Si accede così alla pagina dove è possibile creare o gestire i vari connettori di dati, dove si dovrà creare un nuovo connettore da zero.

A questo punto basterà seguire i passaggi per configurare il connettore.

La configurazione avviene tramite 4 passi più uno di test in cui si definiscono url di collegamento, credenziali che devono essere richieste, le chiamate che il connettore deve fare e le risposte che il connettore riceve.

Nel primo passo si definisce il nome che il connettore avrà e l’host con l’indirizzo che espone le API, nel nostro caso essendo le api esposte da un Business Central Saas inseriremo l’endpoint generale della API di Business Central (api.businesscentral.dynamics.com)

Il secondo passo consiste nella definizione dei criteri di autenticazione al servizio. Quindi definiremo per semplicità l’autenticazione di Base (traduzione italiana per la Basic Authentication), con i due parametri che dovranno essere richiesti dal connettore al momento dell’utilizzo nel flow nel nostro caso inseriremo il parametro di username (nome utente) e password.

N.B. in questa scheda si definiscono solo i parametri e non vanno immessi dati sensibili.

Arriviamo al terzo passo, in questa scheda vengono definiti le azioni e i trigger che il connettore deve eseguire. Le azioni sono le operazioni che il connettore esegue e nel nostro caso sono due chiamate ai webservice di Business Central. I trigger invece sono le operazioni, eseguite da Business Central che possono fare scattare il flow, questi trigger vengono creati con i webhook ma nel nostro caso non ne abbiamo bisogno.

Definiremo quindi due azioni: GetProjectData che recupera le informazioni di setup come l’Id del planner e il nr. di serie da utilizzare e GetPlannerTaskNo che stacca il nr. di serie da assegnare al Task di Planner.

Le azioni si creano cliccando su “Nuova Azione” e compilando le varie schede che vengono proposte, nella prima si definiscono i nomi dell’azione, nella seconda si definisce qual è la richiesta da fare al servizio web, è possibile inserire dei parametri in modo che possano variare a richiesta nel Flow inserendoli tra due parantesi graffe {}.

La creazione delle azioni può avvenire in maniera manuale o in maniera semi automatica cliccando su “Importa da esempio”, in questo caso utilizzando un software esterno come Insomnia è possibile copiare la chiamata al webservice e la risposta che il webservice restituisce. Leggendo i Json in automatico verranno impostati i nomi dei valori che il webservice restituisce.

A questo punto passiamo a creare anche la seconda azione nello stesso modo, una volta ultimato è possibile passare al quarto step e testare il connettore.

Una volta testato è possibile salvarlo e a questo punto il connettore è pronto ad essere utilizzato.

Passiamo quindi alla creazione del flow.

Il nostro connettore lo troviamo tra i connettori personalizzati:

E il suo utilizzo è identico a tutti gli altri connettori standard di Power Automate.

Creiamo quindi il nostro flow:

Una volta salvato e attivato sarà pronto all’utilizzo.

Andiamo nel nostro planner per verificare se funziona, creiamo un task e attendiamo qualche secondo per l’esecuzione del flow.

Dopo qualche secondo il titolo del task prende il nr. di serie staccato da Business Central.

Questo è solo un esempio dei numerosi modi in cui Business Central può essere integrato al meglio all’interno della suite di Office365 al fine di rispecchiare al meglio i flussi aziendali dei clienti.

 

Semplifica i processi, prendi decisioni più informate e accelera la crescita con Dynamics 365 Business Central, una soluzione di gestione aziendale completa progettata per le piccole e medie imprese.

Dynamics 365 Developer

 

How to

Trello, uno strumento online per la gestione dei progetti e dei task personali.

Una delle richieste sempre più comuni è quella di integrare Business Central con altri software e portali. Oggi riportiamo l’esempio di un integrazione con il sito web di Trello.

Trello (https://trello.com/it) è uno strumento di base gratuito, formato da tre elementi chiave: la board, le list e le card.

  • Le board (possono essere private o pubbliche) sono il contenitore principale di tutti i task.
  • Le card, che contengono i vari task, sono organizzati all’interno di liste e rappresentano l’unità base.

L’obiettivo che ci siamo dati all’inizio di questo sviluppo è provare ad integrare Business Central con una bacheca creata su Trello per inviare verso il loro sito delle anagrafiche clienti (per esempio dei soggetti da contattare per campagne promozionali) e fornitori.

Per prima cosa abbiamo creato su Trello una bacheca con due list (Clienti\ Fornitori) seguendo la loro guida: https://trello.com/it/guide/trello-101.html

Sempre da Trello abbiamo poi preso alcune informazioni che ci serviranno per l’integrazione: la chiave API ed il Token: https://trello.com/app-key

Trello

A questo punto abbiamo consultato la documentazione sulle API di Trello che potete trovare a questo link: https://developer.atlassian.com/cloud/trello/rest/ ed abbiamo estratto da l’ultima informazione fondamentale: l’id della nostra board e list.

Per fare questo abbiamo creato una card di test ed abbiamo esportato il Json.

Le informazioni sono contenute nell’idBoard e l’idList.

A questo punto abbiamo tutte le informazioni per fare l’integrazione.

Ci spostiamo in Visual Studio Code, creiamo una page extension della customer card e un action che ci permette di inviare il cliente nella nostra bacheca su Trello

action(SENDTRELLO)
            {
                Caption = 'Send Customer To Trello';
               Visible = true;
               Image= Sendto;
               ApplicationArea = All;
                
                trigger OnAction()
                var
                    client: HttpClient;
                    Path: Text;
                    RequestContent: HttpContent;
                    ResponseMessage: HttpResponseMessage;
                    StatusCode: text;
                    AuthHeaderValue: HttpHeaders;
                    Content: HttpContent;
                    Result: Text;
                begin
  Path :='https://api.trello.com/1/cards?key=20fb8653332….&token=a1fca508d75689ba5f…&name=' + rec."No." + ' - ' + rec.Name + '&idList=5fe21834211dab1e01c005a2';
                    Client.SetBaseAddress(path);
                    Client.DefaultRequestHeaders.Add('User-Agent', 'Dynamics 365');

                    if Client.Post(path, RequestContent, ResponseMessage) then begin
                        if ResponseMessage.IsSuccessStatusCode then begin
                            StatusCode := '00';
                            AuthHeaderValue := ResponseMessage.Headers;
                            Content := ResponseMessage.Content;
                            Content.ReadAs(Result);
                        end else begin
                            AuthHeaderValue := ResponseMessage.Headers;
                            Content := ResponseMessage.Content;
                            Content.ReadAs(Result);
                            StatusCode := Format(ResponseMessage.HttpStatusCode);
                            Error(format(ResponseMessage.HttpStatusCode) + Result)
                        end;
                    end;
                end;
}

Pubblichiamo la page ext e ci troviamo la nostra azione sulla customer card

Clicchiamo sull’azione e sulla nostra bacheca ecco arrivare il cliente

Ripetendo la cosa per i fornitori (cambiando solo id della lista) raggiungiamo il nostro obiettivo.

Questo ovviamente è solo un esempio e un primo passo dell’integrazione e delle possibilità che offre Trello e delle potenzialità che Business Central ha per integrarsi con numerosi software disponibili su web.

 

Semplifica i processi, prendi decisioni più informate e accelera la crescita con Dynamics 365 Business Central, una soluzione di gestione aziendale completa progettata per le piccole e medie imprese.

Dynamics 365 Developer

 

Business Central

Business Central 2020 Wave2: Nuove funzionalità per ottimizzare il codice.

Il rilascio di Business Central 2020 Wave2 ad inizio ottobre ha portato con sé numerose migliorie “sotto al cofano”, tra queste alcune funzionalità che permettono allo sviluppatore di ottimizzare ulteriormente il proprio codice, riducendo così i tempi di esecuzione delle varie procedure.

Le nuove funzionalità introdotte sono:

  • Caricamento di record parziali
  • Tabelle temporanee
  • Proprietà QueryCategory.

La prima funzionalità è la possibilità di caricare un record parzialmente, ovvero selezionare preventivamente i soli campi che serviranno nella procedura seguente. Questo fa sì che il sistema vada a leggere solo pochi campi rispetto a tutti quelli presenti nella tabella, le differenze utilizzando questa funzione si noteranno soprattutto quando si caricano record con numerosi campi ad esempio caricando record riferiti a tabelle come la Sales Header.

Il caricamento parziale dei record si attiva tramite il metodo SetLoadFields indicando quali campi del record caricare.

La sintassi è la seguente:

local procedure tprocedure()
var
        SalesHeader: Record "Sales Header";
begin
        SalesHeader.SetLoadFields("VAT Registration No.");
        SalesHeader.FindFirst();
end;

In questo modo verrà caricato nel record solo il campo relativo alla partita iva senza caricare tutti gli altri campi presenti nella tabella.

Questo tipo di chiamata non deve essere utilizzata nel caso si effettuino inserimenti, cancellazioni o modifiche al record.

Un’altra utile funzionalità, richiesta da molti sono le tabelle temporanee, la gestione di record temporanei esiste da sempre in Business Central ma mancava la possibilità di dichiarare una tabella temporanea già nella struttura tramite l’abilitazione della proprietà TableType.

La proprietà va impostata in questo modo nella dichiarazione della tabella:

table 80074 MyTable
{
    DataClassification = ToBeClassified;
    TableType = Temporary;

Il grosso vantaggio generato da questa proprietà è dato dal fatto che lo schema di una tabella impostata in questo modo non viene mai sincronizzato con il database questo fa sì che sarà possibile eliminare campi e fare modifiche che di norma richiederebbero una forzatura della sincronizzazione dello schema della tabella e quindi proibite soprattutto nel SaaS.

L’ultima novità non è una funzionalità riguardante l’ottimizzazione del codice, riguarda invece una funzionalità che aiuta lo sviluppatore ad implementare le funzionalità richieste dall’utente.

Questa funzionalità è una nuova proprietà presente negli oggetti di tipo Query si chiama QueryCategory e permette l’inserimento al suo interno dei nomi delle pagine dove dovrà essere richiamata.

La proprietà va richiamata in questo modo:

query 93200 "Top 20 Customer for Sales Test"
{
    Caption = 'Top 20 Customer Sales Test';
    OrderBy = Descending(Sum_Sales_LCY);
    TopNumberOfRows = 20;
    QueryCategory = 'Customer List';

    elements
    {
        dataitem(Cust_Ledger_Entry; "Cust. Ledger Entry")
        {
            filter(Posting_Date; "Posting Date")
            {
            }
            column(Customer_No; "Customer No.")
            {
            }
            column(Sum_Sales_LCY; "Sales (LCY)")
            {
                Method = Sum;
            }
        }
    }
}

dichiarando nella Query le pagine dove dovrà essere richiamata, la query apparirà in automatico nella pagina indicata senza dover aggiungere altro codice nella pagina stessa:

questa è una piccola funzionalità che permette una migliore integrazione delle modifiche con lo standard offerto da Business Central allineando l’user experience a quella voluta da Microsoft.

Queste nuove funzionalità rilasciate da Microsoft per gli sviluppatori non sono fondamentali ma devono essere sempre considerate come opportunità da uno sviluppatore per rendere il proprio codice più veloce ed efficiente migliorando notevolmente l’user experience dell’utente finale.

Semplifica i processi, prendi decisioni più informate e accelera la crescita con Dynamics 365 Business Central, una soluzione di gestione aziendale completa progettata per le piccole e medie imprese.

 

Dynamics 365 Developer

 

Microsoft Dynamics 365 Business Central: i servizi di geolocalizzazione

Come implementare una mappa all’interno di una pagina, utilizzando le funzionalità standard di Business Central

Business Central può offrire numerosi spunti di personalizzazione già all’interno della Base Application, l’app basilare fornita da Microsoft che contiene tutte le funzionalità standard.
Un esempio può essere dato da una funzionalità che potrebbe passare inosservata tra le varie altre  ovvero la gestione dell’integrazione con i servizi di geolocalizzazione.

All’interno dell’anagrafica clienti, o fornitori (e anche in altri punti come ad esempio le risorse), dopo i vari dati dell’indirizzo nel gruppo “Indirizzo e contatto” è presente il tasto “Mostra su mappa

Cliccando sopra verranno richieste alcune informazioni su cosa si vuole vedere e procedendo si arriva all’apertura di una nuova scheda del browser con le indicazioni del percorso, oppure semplicemente con l’indirizzo dell’anagrafica visualizzato sulla mappa:

Il servizio utilizzato è quello di Bing, ma è possibile inserire il servizio di mappe preferito in quanto tutto è gestito tramite dal setup chiamato “Mappe in linea

A cui si accede alle varie pagine di setup dove è possibile inserire oltre a Bing altri setup di altri servizi.

Il funzionamento di tutto questo è molto semplice e Business Central utilizza la codeunit chiamata “Online map management” che contiene tutte le funzioni necessarie a rielaborare i setup immessi nella page indicata prima al fine di creare un indirizzo lanciabile tramite brower.

Grazie alla flessibilità data dagli eventi esposti dalla codeunit e il modo in cui sono state create le codeunit è possibile posizionare la funzionalità delle mappe su qualunque pagina di business central con pochi passaggi.

How to: i passaggi per l’implementazione

Il primo passaggio è la sottoscrizione di un evento al fine di “attivare” la funzionalità, per farlo basterà sottoscrivere questo evento impostando la variabile IsValid a true.

[EventSubscriber(ObjectType::Codeunit, Codeunit::"Online Map Management", 'OnAfterValidAddress', '', false, false)]
local procedure OnlineMapManagementOnAfterValidAddress(TableID: Integer; var IsValid: Boolean)
begin
end;

Il secondo passaggio è un secondo evento da sottoscrivere, questa volta per impostare l’indirizzo di “destinazione” o semplicemente l’indirizzo che verrà visualizzato nella mappa:

[EventSubscriber(ObjectType::Codeunit, Codeunit::"Online Map Management", 'OnAfterGetAddress', '', false, false)]
local procedure OnlineMapManagementOnAfterGetAddress(TableID: Integer; RecPosition: Text; var Parameters: array[12] of Text[100]; var RecordRef: RecordRef)
Begin
end;

Impostando l’array Parameters con le informazioni relative all’indirizzo desiderato:

Parameters[1] := Addr;
Parameters[2] := City;
Parameters[3] := County;
Parameters[4] := PostCode;
Parameters[5] := CountryCode;

A questo punto il tutto è già impostato per funzionare, basterà creare una action sulla page desiderata in modo che lanci la funzione MakeSelection della codeunit Online Map Managemente e il gioco è fatto.

OnlineMapManagement.ProcessMap(DocumentRecRef.Number, DocumentRecRef.GetPosition())

La funzione riceve in ingresso dei recordref e gli eventi esposti espongono la tabella che ha generato l’evento in questo modo è possibile creare un’unica funzione in grado di accettare qualsiasi tabella e quindi indirizzo all’interno del database senza dover duplicare ulteriormente il codice.

In questo modo è stato replicato esattamente quello che lo standard fa sulle pagine in cui espone la possibilità di visualizzare la mappa, ma è possibile andare oltre con pochi passaggi e tramite l’utilizzo di un servizio diverso da Bing ovvero HereWeGo.

L’indirizzo infatti è possibile visualizzarlo direttamente all’interno della pagina di Business Central sfruttando in modo differente la stessa struttura che viene utilizzata per l’esposizione dei report PowerBi.

How to: aggiungere le funzionalità

Prima di andare a creare la pagina bisogna aggiungere un paio di funzionalità a quanto è stato creato in precedenza.

La prima è la funzione di restituzione della url che verrà mostrata all’interno della pagina sfruttando direttamente la funzione presente all’interno della codeunit di gestione delle mappe. La url però non è direttamente visibile in quanto l’apertura della scheda del browser è all’interno della funzione stessa di creazione della url. Bisogna recuperarla tramite un piccolo escamotage dichiarando la codeunit in cui vengono sottoscritti gli eventi come “singleinstance” e dichiarando una variabile globale “weburl” e una seconda variabile booleana “isPagePart” (il cui motivo verrà spiegato poco più avanti).

A questo punto si crea la funzione che restituirà la url alla pagina:


    procedure GetMapUrl(Document: Variant): Text
    var
        OnlineMapSetup: Record "Online Map Setup";
        OnlineMapManagement: Codeunit "Online Map Management";
        Err001: Label 'Please setup a valid map setup';
    begin
        isPagePart := true;
        DatatypeManagement.GetRecordRef(Document, DocumentRecRef);
        if OnlineMapSetup.FindFirst() then
            OnlineMapManagement.ProcessMap(DocumentRecRef.Number, DocumentRecRef.GetPosition())
        else
            Error(Err001);

        Exit(WebUrl);
    end;

Come si può notare in questa funzione non viene assegnata da nessuna parte la variabile WebUrl, questo perché in realtà la url viene composta dalla procedura ProcessMap, che non avendo nessun valore di ritorno espone un evento che si andrà a sottoscrivere:

[EventSubscriber(ObjectType::Codeunit, Codeunit::"Online Map Management", 'OnAfterProcessWebMap', '', false, false)]
    local procedure MapManagementOnAfterProcessWebMap(url: Text[1024]; var IsHandled: Boolean)
    begin
        if not isPagePart then exit;
        WebUrl := url;
        IsHandled := true;
        isPagePart := false;
    end;

Da questo evento possiamo ricavare la url assegnandola alla variabile WebUrl e impostando la variabile isHandled a true evitiamo l’apertura della scheda del browser. Come si può notare viene controllata la variabile isPagePart (impostata a true nella funzione) questo serve a mantenere inalterata la funzionalità del tasto standard.
A questo punto si può creare la page part, riferita alla sourcetable della pagina in cui verrà visualizzata la mappa.
Al suo interno non si andrà a dichiarare alcun campo ma solo un usercontrol fatto in questo modo:

layout
    {
        area(Content)
        {
            group(Map)
            {
                ShowCaption = false;
                usercontrol(WebReportViewer; "Microsoft.Dynamics.Nav.Client.WebPageViewer")
                {
                    ApplicationArea = All;
                    trigger ControlAddInReady(callbackUrl: Text)
                    begin
                        CurrPage.WebReportViewer.Navigate(Url);
                    end;
                }
            }
        }
    }

Oltre allo usercontrol nel trigger “onaftergetrecord” andremo a richiamare la funzione creata prima:

trigger OnAfterGetRecord()
    var
        MapsCu: Codeunit "Maps Cu";
    begin
        Clear(MapsCu);
        Url := MapsCu.GetMapUrl(Rec);
    end;

A questo punto non resta che pubblicare il tutto ed ecco il risultato:

Con questi passaggi è possibile integrare la funzionalità di utilizzo della geolocalizzazione all’interno di una propria app senza dover scrivere del codice di gestione a riguardo e allo stesso tempo potrebbe fungere da base per ulteriori sviluppi più complessi tramite l’utilizzo delle API forniti dai vari gestori di servizi di geolocalizzazione, la flessibilità del setup infatti permette di utilizzare oltre a Bing, anche Google Maps, Openstreet Maps e non ultimo HereWeGo.

 

Semplifica i processi, prendi decisioni più informate e accelera la crescita con Dynamics 365 Business Central, una soluzione di gestione aziendale completa progettata per le piccole e medie imprese.

 

Dynamics 365 Developer

 

La nostra selezione di migliori extension del Marketplace VSCode, per sviluppare in codice AL

Tra le tante sfide che il passaggio da Dynamics NAV a Dynamics 365 Business Central ha presentato, quella che ha coinvolto gli sviluppatori, (oltre al cambio di linguaggio) è stato anche il cambio di front-end.

Per sviluppare in Business Central, infatti, gli sviluppatori hanno dovuto prendere confidenza con il linguaggio AL nuovo linguaggio di programmazione utilizzato per sviluppare in un database Dynamics 365 Business Cental in sostituzione di C/AL.

Il nuovo front end adottato è Visual Studio code, editor di codice sorgente sviluppato da Microsoft che può essere usato con vari linguaggi di programmazione.

Quello che ci siamo chiesti nel team developer Var Prime, in questi mesi (in realtà fin dai primi corsi in Microsoft) è stato: come possiamo sfruttare al massimo le potenzialità di questo strumento con il nuovo codice AL?

Da qui è nata la nostra “raccolta” di Extension (aggiornata ad aprile 2020) preferite trovate sul MarketPlace.

Le nostre extension consigliate

Per prima cosa abbiamo installato l’extension che ci permette di sviluppare in AL.

AZ AL DEV Tools/AL Code Outline

AZ AL DEV Tools - AL Code Outline

A questo punto ci siamo domandati: ma il vecchio e caro editor che mi permetteva di costruire una tabella senza scrivere l’intera struttura a mano non c’è più?

La risposta ufficiale è no ma grazie a Andrzej Zwierzchowski è nata AZ AL DEV Tools/AL Code Outline

La versione corrente dell’estensione è una raccolta di diversi strumenti di sviluppo.
L’extension è nata come un wizard per costruire oggetti in AL , ma nel tempo son state aggiunte tantissime funzionalità: dalla gestione dei commenti, alla visualizzazione ad albero degli oggetti, alla possibilità di vedere le immagini delle pageaction o di sfruttare delle codeaction per organizzare , modificare o inserire codice in maniera veloce.

Il punto di forza sicuramente è l’editor che permette la costruzione di una tabella o di altri oggetti simulando quanto conoscevamo già nel vecchio ambiente

Ve la consigliamo davvero perché è un tool molto comodo e che aiuta tantissimo nel velocizzare operazioni che spesso portano via tempo e sono ripetitive.

Potete scaricare l’estensione e trovare tutte le informazioni qui:
https://marketplace.visualstudio.com/items?itemName=andrzejzwierzchowski.al-code-outline 

 

L’AL Object Designer

AL Object Designer

Un altro strumento particolarmente utile è L’AL Object Designer di Marton Sagì

L’idea di base è quella di simulare l’object designer e quindi permette di vedere gli oggetti standard, il loro sorgente e gli eventi che mette a disposizione ogni singolo oggetto

Inoltre, si integra perfettamente con AZ AL DEV Tools/AL Code Outline, permettendo di richiamare il wizard direttamente dal suo menu.

Per tutte le informazioni e per scaricare questo utilissimo tool, potete visitare il marketplace
https://marketplace.visualstudio.com/items?itemName=martonsagi.al-object-designer

 

NAB AL Tools

NAB AL Tools

Tra le varie sfide che il cambiamento al linguaggio AL comporta una piuttosto onerosa per non dire piuttosto noiosa è la gestione dei file.xlf delle traduzioni delle app che si stanno creando.

Fortunatamente in nostro soccorso arriva un’estensione creata principalmente per la gestione di questa tipologia di file: suo nome è NAB AL Tools

Una volta installata sarà possibile aggiornare il file di traduzione rispetto al file.g con un semplice comando “NAB: Refresh XLF files from g.xlf”. Tutte le eventuali aggiunte vengono marcate con un prefisso specifico in modo da essere facilmente trovate e tradotte.

Il comando poi è in grado di trovare traduzioni simili e di tradurre in maniera semi automatica le caption dell’app.

Oltre alla gestione delle traduzioni sono contenute anche alcune funzionalità di gestione delle test codeunit e degli snippet aggiuntivi.

È possibile trovare maggiori informazioni nel git dell’extension: https://github.com/jwikman/nab-al-tools

O direttamente al link dello store: https://marketplace.visualstudio.com/items?itemName=nabsolutions.nab-al-tools

 

GitLens

GitLens

Un altro grosso cambiamento che ci ha portato questo nuovo linguaggio è il passaggio da gestione ad oggetto a gestione a file.

La gestione dei file contenuti in locale sull’app che si sta sviluppando potrebbe creare alla lunga dei problemi, specie se si vuole recuperare un oggetto allo stato che aveva giorni o mesi prima una determinata modifica.

Su VSCode può tornare utile l’addin GitLens.

Questo addin contiene alcune funzionalità utili a reperire le modifiche fatte in precedenza di qualunque parte dell’oggetto.

Non solo con un semplice click sarà possibile consultare le modifiche effettuate precedentemente senza dover entrare su altri siti ma tutto direttamente da VsCode.

Potete trovare questa estensione a questo indirizzo: https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

 

Waldo

Waldo

In una recensione delle migliori estensioni per Vs Code non può mancare infine quella di Waldo.

Le caratteristiche principali dell’estensione sono:

  • Esecuzione di oggetti nel client Windows e nel client Web

Sembrava scontato in C\AL ma ora non è così, l’esecuzione degli oggetti senza utility specifica, diventa un impresa macchinosa, vale a dire, essere in grado di eseguire un oggetto senza dover modificare e salvare launch.json . Il modo più semplice per trovare la funzionalità è nell’elenco comandi. Cerca “> crs: run” e ti darà tutte le opzioni utili per fare il run dell’oggetto.

  • Gestire automaticamente i nomi dei file (e le posizioni, se lo si desidera)
    Questa feature consente di far risparmiare tempo agli sviluppatori nella gestione di nomi e organizzazioni in cartelle,
    I due comandi principali sono :
    Rinomina
    Riorganizza

Basterà infatti scrivere CRS.OnSaveAlFileAction che eseguirà il Rename o il Reoganize al posto nostro in fase di salvataggio!

Ancora una volta possiamo dire che il grande Waldo ci viene incontro!

Di seguito il link dell’extension:
https://marketplace.visualstudio.com/items?itemName=waldo.crs-al-language-extension

 

Semplifica i processi, prendi decisioni più informate e accelera la crescita con Dynamics 365 Business Central, una soluzione di gestione aziendale completa progettata per le piccole e medie imprese.

&

Dynamics 365 Developer

Dynamics 365 Developer

Dynamics 365 Developer