Esercizio - Funzioni personalizzate
Si ricopre il ruolo di sviluppatore di sistemi aziendali per CRONUS International Ltd. Si sta apprendendo come sviluppare personalizzazioni per Business Central e come programmare in AL per personalizzare le soluzioni per i clienti. Si desidera personalizzare la pagina Scheda cliente aggiungendo un'azione che adegui il limite di credito del cliente in base allo storico delle vendite precedenti del cliente stesso oppure lo azzeri se non vi sono state transazioni.
Sono stati indicati i seguenti requisiti:
Il limite di credito di un cliente non può superare il 50% dei ricavi totali delle vendite per il cliente negli ultimi 12 mesi.
Il limite di credito del cliente deve essere sempre arrotondato alle 10.000 unità.
Se il limite di credito viene arrotondato durante il processo, l'applicazione deve inviare una notifica all'utente.
Se il nuovo limite di credito non differisce dal precedente, l'applicazione deve inviare una notifica all'utente.
Se il cliente non ha uno storico delle vendite negli ultimi 12 mesi, il limite di credito deve essere azzerato.
La funzione che imposta il limite di credito deve essere disponibile per altri oggetti.
La pagina Scheda cliente deve includere un'azione che chiama la funzione.
Se la funzione viene chiamata dall'azione della pagina e il limite di credito viene aumentato, la funzione deve chiedere conferma all'utente prima di aggiornare il limite di credito.
Attività
Creazione di una nuova estensione.
Creazione di un'estensione di tabella.
Creazione di un'estensione di pagina.
Passaggi
Avviare Visual Studio Code.
Creare un nuovo progetto di estensione AL. Selezionare Visualizza > Riquadro comandi... (CTRL+MAIUSC+P).
Immettere AL: Go! nella casella di ricerca, quindi selezionare il comando dall'elenco.
Accettare il percorso suggerito, ma modificarne il nome in CreditLimit (o inserire un altro percorso).
Selezionare la piattaforma di destinazione più recente.
Selezionare Microsoft cloud sandbox come endpoint di sviluppo.
Scaricare i simboli dell'applicazione. Selezionare Visualizza > Riquadro comandi... (CTRL+MAIUSC+P).
Immettere AL: Download symbols nella casella di ricerca e quindi selezionare il comando dall'elenco.
Se richiesto, fornire le credenziali dell'organizzazione (account Microsoft 365 o account Microsoft Entra ID).
Aprire il file app.json e modificare l'impostazione nome in Limite credito. Modificare l'impostazione editore in Cronus International Ltd.
Modificare idRanges da 50400 a 50450.
Rimuovere il file HelloWorld.al.
Aggiungere una cartella denominata src
Nella cartella src creare un file denominato Customer.TableExt.al.
Creare una nuova estensione di tabella in questo file usando frammenti di codice. Immettere
ttableext, quindi premere TAB.Modificare l'ID in 50400 e il nome in Customer.
Impostare il parametro Extends su Customer per estendere la tabella Customer.
Aggiungere una procedura non locale all'estensione di tabella Customer e assegnare alla stessa il nome UpdateCreditLimit.
Modificare la funzione
UpdateCreditLimitin modo che riceva un parametro denominato NewCreditLimit, di tipo Decimal, per riferimento.Aggiungere un'altra procedura non locale denominata CalculateCreditLimit, che restituisce un valore di tipo Decimal.
Creare un nuovo file nella cartella src denominato CustomerCard.PageExt.al.
Creare una nuova estensione di pagina in questo file usando frammenti di codice. Immettere
tpageext, quindi premere TAB.Modificare l'ID in 50130 e il nome in CustomerCard.
Impostare il parametro Extends su Customer Card.
Creare una procedura locale denominata CallUpdateCreditLimit.
Aggiungere un'azione al gruppo di azioni Funzione del contenitore di azioni ActionItems. Nella sezione Actions immettere
addAfter("F&unctions).Aggiungere un'azione con nome UpdateCreditLimit nella sezione addafter, quindi impostare la proprietà Caption e le proprietà Tooltip su Update Credit Limit. Impostare la proprietà Image su CalculateCost.
Nel trigger
OnActionchiamare l'azioneCallUpdateCreditLimit.Modificare la funzione
CalculateCreditLimitdell'estensione della tabella. Aggiungere una variabile locale con nome Customer di tipo Record Customer.Aggiungere codice alla funzione
CalculateCreditLimitper calcolare il campo Sales (LCY) per gli ultimi 12 mesi.Cust := Rec; Cust.SetRange("Date Filter",CalcDate('<-12M>',WorkDate()),WorkDate()); Cust.CalcFields("Sales (LCY)","Balance (LCY)"); exit(Round(Cust."Sales (LCY)" * 0.5));Uno dei requisiti è che il limite di credito di un cliente non può superare il 50% dei ricavi totali delle vendite per il cliente negli ultimi 12 mesi.
Aggiungere codice alla funzione
UpdateCreditLimitper arrotondare il parametro formale NewCreditLimit alle 10.000 unità, per convalidare il valore di NewCreditLimit nel campo Credit Limit (LCY) e per modificare il record.NewCreditLimit := Round(NewCreditLimit, 10000); Rec.Validate("Credit Limit (LCY)", NewCreditLimit); Rec.Modify();Uno dei requisiti è che il limite di credito del cliente deve essere sempre arrotondato alle 10.000 unità.
Aggiungere tre etichette globali all'estensione della pagina con il testo seguente:
Messaggio di conferma
Informazioni sul limite di credito arrotondato
Informazioni su un limite di credito aggiornato
Nome ConstValue AreYouSureQst Impostare %1 su %2? CreditLimitRoundedTxt Il limite di credito è stato arrotondato a %1 per rispettare i criteri aziendali. CreditLimitUpToDateTxt Il limite di credito è aggiornato. Aggiungere due variabili decimali alla funzione
CallUpdateCreditLimite denominarle CreditLimitCalculated e CreditLimitActual, entrambe di tipo Decimal.Aggiungere il codice seguente alla funzione
CallUpdateCreditLimit:CreditLimitCalculated := Rec.CalculateCreditLimit(); if CreditLimitCalculated = Rec."Credit Limit (LCY)" then begin Message(CreditLimitUpToDateTxt); exit; end; if GuiAllowed() then if not Confirm(AreYouSureQst, false, FieldCaption("Credit Limit (LCY)"),CreditLimitCalculated) then exit; CreditLimitActual := CreditLimitCalculated; Rec.UpdateCreditLimit(CreditLimitActual); if CreditLimitActual <> CreditLimitCalculated then Message(CreditLimitROundedTxt, CreditLimitActual);Se il nuovo limite di credito non differisce dal precedente, l'applicazione deve inviare una notifica all'utente.
L'estensione della tabella Customer ora è simile al seguente blocco di codice:
tableextension 50400 Customer extends Customer { procedure UpdateCreditLimit(var NewCreditLimit: Decimal) begin NewCreditLimit := Round(NewCreditLimit, 10000); Rec.Validate("Credit Limit (LCY)", NewCreditLimit); Rec.Modify(); end; procedure CalculateCreditLimit(): Decimal var Customer: Record Customer; begin Customer := Rec; Customer.SetRange("Date Filter", CalcDate('<-12M>', WorkDate()), WorkDate()); Customer.CalcFields("Sales (LCY)", "Balance (LCY)"); exit(Round(Customer."Sales (LCY)" * 0.5)); end; }L'estensione della pagina CustomerCard ora è simile al seguente blocco di codice:
pageextension 50400 CustomerCard extends "Customer Card" { layout { // Add changes to page layout here } actions { // Add changes to page actions here addafter("F&unctions") { action(UpdateCreditLimit) { ApplicationArea = All; Caption = 'Update Credit Limit'; Image = CalculateCost; ToolTip = 'Update Credit Limit'; trigger OnAction() begin CallUpdateCreditLimit(); end; } } } var AreYouSureQst: Label 'Are you sure that you want to set the %1 to %2?', Comment = '%1 is Credit Limit caption and %2 is the new Credit Limit value.' ; CreditLimitRoundedTxt: Label 'The credit limit was rounded to %1 to comply with company policies.', Comment = '%1 is new Credit Limit value'; CreditLimitUpToDateTxt: Label 'The credit limit is up to date.'; local procedure CallUpdateCreditLimit() var CreditLimitCalculated, CreditLimitActual : Decimal; begin CreditLimitCalculated := Rec.CalculateCreditLimit(); if CreditLimitCalculated = Rec."Credit Limit (LCY)" then begin Message(CreditLimitUpToDateTxt); exit; end; if GuiAllowed() then if not Confirm(AreYouSureQst, false, Rec.FieldCaption("Credit Limit (LCY)"), CreditLimitCalculated) then exit; CreditLimitActual := CreditLimitCalculated; Rec.UpdateCreditLimit(CreditLimitActual); if CreditLimitActual <> CreditLimitCalculated then Message(CreditLimitROundedTxt, CreditLimitActual); end; }Se il cliente non ha uno storico delle vendite negli ultimi 12 mesi, il limite di credito deve essere azzerato.
Aprire il file launch.json nella cartella .vscode. Impostare startupObjectId su 22 e startupObjectType su Page.
Pubblicare l'estensione nella sandbox. Selezionare Visualizza > Riquadro comandi... (CTRL+MAIUSC+P).
Immettere AL: Publish nella casella di ricerca (o premere F5) e selezionare il comando dall'elenco.
Verificare che l'applicazione Microsoft Dynamics 365 Business Central si avvii con la pagina Lista clienti visualizzata.
Aprire una scheda cliente casuale. Nella pagina Customer Card trovare l'azione Update Credit Limit nel menu delle azioni, dopo Funzioni.
Testare l'azione.