Exercice : fonctions personnalisées
Vous êtes développeur de systèmes métier pour CRONUS International Ltd. Vous découvrez comment développer des personnalisations pour Business Central et programmer en AL pour personnaliser des solutions client. Vous souhaitez personnaliser la page Fiche client en ajoutant une action qui ajuste le crédit autorisé d’un client en fonction de l’historique des ventes précédentes du client ou réinitialise la limite à zéro si aucune transaction n’a eu lieu.
Vous avez reçu les exigences suivantes :
Le crédit autorisé d’un client ne peut pas dépasser 50 % du chiffre d’affaires total du client au cours des 12 derniers mois.
Le crédit autorisé du client doit toujours être arrondi au 10 000 le plus proche.
Si le crédit autorisé est arrondi au cours du processus, l’application doit envoyer une notification à l’utilisateur.
Si le nouveau crédit autorisé ne diffère pas de l’ancien, l’application doit envoyer une notification à l’utilisateur.
Si le client n’a aucun historique des ventes au cours des 12 derniers mois, le crédit autorisé doit être remis à zéro.
La fonction qui définit le crédit autorisé doit être disponible pour d’autres objets.
La page Fiche client doit inclure une action qui appelle la fonction.
Si la fonction est appelée à partir de l’action de la page et que le crédit autorisé serait augmenté, la fonction doit demander à l’utilisateur une confirmation avant de mettre à jour le crédit autorisé.
Tâches
Créez une extension.
Créez une extension de table.
Créez une extension de page.
Étapes
Démarrez Visual Studio Code.
Créez un projet d’extension AL. Sélectionnez Afficher > Palette de commandes... (Ctrl+Shift+P).
Saisissez AL: Go! dans la zone de recherche, puis sélectionnez la commande dans la liste.
Acceptez le chemin d’accès suggéré mais redéfinissez le nom sur CreditLimit (ou saisissez un autre chemin d’accès).
Sélectionnez la plateforme cible la plus récente.
Sélectionnez Bac à sable cloud Microsoft comme point de terminaison de développement.
Téléchargez les symboles d’application. Sélectionnez Afficher > Palette de commandes... (Ctrl+Shift+P).
Saisissez AL: Download symbols dans la zone de recherche, puis sélectionnez la commande dans la liste.
Si vous y êtes invité, fournissez vos informations d’identification professionnelles (compte Microsoft 365/compte Microsoft Entra ID).
Ouvrez le fichier app.json et redéfinissez le paramètre name sur Crédit autorisé. Redéfinissez le paramètre publisher sur Cronus International Ltd.
Redéfinissez le paramètre idRanges en remplaçant 50400 par 50450.
Supprimez le fichier HelloWorld.al.
Ajoutez un dossier nommé src.
Dans le dossier src, créez un fichier nommé Customer.TableExt.al.
Créez une extension de table dans ce fichier à l’aide d’extraits de code. Saisissez
ttableext, puis appuyez sur la touche de tabulation.Redéfinissez le paramètre ID sur 50400 et le paramètre name sur Customer.
Définissez le paramètre Extends sur Customer pour étendre la table Customer.
Ajoutez une procédure non locale à l’extension de table Customer et nommez-la UpdateCreditLimit.
Modifiez la fonction
UpdateCreditLimitafin qu’elle reçoive un paramètre nommé NewCreditLimit, de type Décimal, par référence.Ajoutez une autre procédure non locale et nommez-la CalculateCreditLimit, ce qui renvoie une valeur de type Décimal.
Dans le dossier src, créez un fichier nommé CustomerCard.PageExt.al.
Créez une extension de page dans ce fichier à l’aide d’extraits de code. Saisissez
tpageext, puis appuyez sur la touche de tabulation.Redéfinissez le paramètre ID sur 50130 et le paramètre name sur CustomerCard.
Définissez le paramètre Extends sur Customer Card.
Créez une procédure locale et nommez-la CallUpdateCreditLimit.
Ajoutez une action au groupe d’actions Fonction du conteneur d’action ActionItems. Dans la section Actions, saisissez
addAfter("F&unctions).Ajoutez une action nommée UpdateCreditLimit dans la section addafter, puis définissez les propriétés Caption et Tooltip sur Update Credit Limit. Définissez la propriété Image sur CalculateCost.
Dans le déclencheur
OnAction, appelez l’actionCallUpdateCreditLimit.Modifier la fonction
CalculateCreditLimitde l’extension de table. Ajoutez une variable locale nommée Customer de type Enregistrer le client.Ajoutez du code à la fonction
CalculateCreditLimitqui calcule le champ Sales (LCY) pour les 12 derniers mois.Cust := Rec; Cust.SetRange("Date Filter",CalcDate('<-12M>',WorkDate()),WorkDate()); Cust.CalcFields("Sales (LCY)","Balance (LCY)"); exit(Round(Cust."Sales (LCY)" * 0.5));Voici l’une des exigences : le crédit autorisé d’un client ne peut pas dépasser 50 % du produit des ventes total du client au cours des 12 derniers mois.
Ajoutez du code à la fonction
UpdateCreditLimitpour arrondir le paramètre formel NewCreditLimit au 10 000 le plus proche, afin de valider la valeur de NewCreditLimit dans le champ Credit Limit (LCY) et modifier l’enregistrement.NewCreditLimit := Round(NewCreditLimit, 10000); Rec.Validate("Credit Limit (LCY)", NewCreditLimit); Rec.Modify();Voici l’une des exigences : le crédit autorisé du client doit toujours être arrondi au 10 000 le plus proche.
Ajoutez trois libellés globaux à l’extension de page avec le texte suivant :
Message de confirmation
Informations sur le crédit autorisé arrondi
Informations sur un crédit autorisé à jour
Nom ConstValue AreYouSureQst Voulez-vous vraiment définir le %1 sur %2 ? CreditLimitRoundedTxt Le crédit autorisé a été arrondi à %1 pour se conformer aux stratégies d’entreprise. CreditLimitUpToDateTxt Le crédit autorisé est à jour. Ajoutez deux variables décimales locales à la fonction
CallUpdateCreditLimitet appelez-les CreditLimitCalculated et CreditLimitActual, toutes deux de type Décimal.Ajoutez le code suivant à la fonction
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);Si le nouveau crédit autorisé ne diffère pas de l’ancien, l’application doit envoyer une notification à l’utilisateur.
L’extension de table Customer devrait désormais ressembler au bloc de code suivant :
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’extension de page CustomerCard devrait désormais ressembler au bloc de code suivant :
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; }Si le client n’a aucun historique des ventes au cours des 12 derniers mois, le crédit autorisé doit être remis à zéro.
Ouvrez le fichier launch.json dans le dossier .vscode. Définissez le paramètre startupObjectId sur 22 et le paramètre startupObjectType sur Page.
Publiez votre extension dans le bac à sable. Sélectionnez Afficher > Palette de commandes... (Ctrl+Shift+P).
Saisissez AL: Publish dans la zone de recherche (ou appuyez sur la touche F5), puis sélectionnez la commande dans la liste.
Vérifiez que l’application Microsoft Dynamics 365 Business Central démarre et que la page Liste des clients s’affiche.
Ouvrez une fiche client aléatoire. sur la page Customer Card, recherchez l’action Update Credit Limit dans le menu Actions, après Fonctions.
Testez l’action.