Exercício – Funções personalizadas
Você é um desenvolvedor de sistemas comerciais para a CRONUS International Ltd. Você está aprendendo a desenvolver personalizações para o Business Central e como programar em AL para personalizar soluções para clientes. Você deseja personalizar a página Cartão de cliente adicionando uma ação que ajusta o limite de crédito de um cliente com base no histórico de vendas anterior do cliente ou redefine o limite como zero se nenhuma transação tiver ocorrido.
Você recebeu os seguintes requisitos:
O limite de crédito de um cliente não pode exceder 50% da receita total de venda para o cliente nos últimos 12 meses.
O limite de crédito do cliente deve ser sempre arredondado para o 10.000 mais próximo.
Se o limite de crédito for arredondado durante o processo, o aplicativo deverá enviar notificação ao usuário.
Se o novo limite de crédito não for diferente do antigo, o aplicativo deverá enviar notificação ao usuário.
Se o cliente não tiver histórico de vendas nos últimos 12 meses, o limite de crédito deverá ser redefinido como zero.
A função que define o limite de crédito deve estar disponível para outros objetos.
A página Cartão de cliente deve incluir uma ação que chame a função.
Se a função for chamada por meio da ação de página e o limite de crédito for aumentado, a função deverá pedir confirmação ao usuário antes de atualizar o limite de crédito.
Tarefas
Crie uma nova Extensão.
Crie uma extensão de tabela.
Crie uma extensão de página.
Etapas
Inicie o Visual Studio Code.
Crie um novo projeto da Extensão AL. Selecione Exibir > Paleta de Comandos... (Ctrl+Shift+P).
Insira AL: Go! na caixa de pesquisa e selecione o comando na lista.
Aceite o caminho sugerido, mas altere o nome para CreditLimit (ou insira outro caminho).
Selecione a plataforma de destino mais recente.
Selecione Área restrita da nuvem da Microsoft como o ponto de extremidade de desenvolvimento.
Baixe os símbolos do aplicativo. Selecione Exibir > Paleta de Comandos... (Ctrl+Shift+P).
Insira AL: Download symbols na caixa de pesquisa e selecione o comando na lista.
Se solicitado, forneça suas credenciais organizacionais (conta do Microsoft 365/conta do Microsoft Entra ID).
Abra o arquivo app.json e mude a configuração do Nome para Limite de crédito. Altere a configuração Editor para Cronus International Ltd.
Altere idRanges de 50400 para 50450.
Remova o arquivo HelloWorld.al.
Adicione uma pasta chamada: src
Na pasta src, crie um arquivo chamado Customer.TableExt.al.
Crie uma nova extensão de tabela no arquivo usando trechos de código. Insira
ttableexte pressione a tecla Tab.Altere a ID para 50400 e o name para Customer.
Defina o parâmetro Extends como Customer para estender a tabela Customer.
Adicione um procedimento não local à extensão da tabela Cliente e nomeie-o como UpdateCreditLimit.
Modifique a função
UpdateCreditLimitpara que ela receba um parâmetro denominado NewCreditLimit, do tipo Decimal, por referência.Adicione outro procedimento não local e nomeie-o como CalculateCreditLimit, que retorna um valor do tipo Decimal.
Crie um novo arquivo na pasta src com o nome: CustomerCard.PageExt.al.
Crie uma nova extensão de página no arquivo usando trechos de código. Insira
tpageexte pressione a tecla Tab.Altere a ID para 50130 e o name para CustomerCard.
Defina o parâmetro Extends para Customer Card.
Crie um procedimento local e nomeie-o CallUpdateCreditLimit.
Adicione uma ação ao grupo Ação de função do contêiner de ação ActionItems. Na seção Actions, insira
addAfter("F&unctions).Adicione uma ação com o nome UpdateCreditLimit na seção addafter e defina as propriedades Caption e Tooltip como Update Credit Limit. Defina a propriedade Image como CalculateCost.
No gatilho
OnAction, chame a açãoCallUpdateCreditLimit.Modifique a função
CalculateCreditLimitda extensão da tabela. Adicione uma variável local com o nome Customer do tipo Record Customer.Adicione o código à função
CalculateCreditLimitque calcula o campo Sales (LCY) dos últimos 12 meses.Cust := Rec; Cust.SetRange("Date Filter",CalcDate('<-12M>',WorkDate()),WorkDate()); Cust.CalcFields("Sales (LCY)","Balance (LCY)"); exit(Round(Cust."Sales (LCY)" * 0.5));Um dos requisitos é: o limite de crédito de um cliente não pode exceder 50% da receita total de venda para o cliente nos últimos 12 meses.
Adicione o código à função
UpdateCreditLimitpara arredondar o parâmetro formal NewCreditLimit para os 10.000 mais próximos, para validar o valor de NewCreditLimit no campo Credit Limit (LCY) e para modificar o registro.NewCreditLimit := Round(NewCreditLimit, 10000); Rec.Validate("Credit Limit (LCY)", NewCreditLimit); Rec.Modify();Um dos requisitos é: o limite de crédito do cliente deve ser sempre arredondado para o 10.000 mais próximo.
Adicione três rótulos globais à extensão de página com o seguinte texto:
Mensagem de configuração
Informações sobre o limite de crédito arredondado
Informações sobre um limite de crédito atualizado
Nome ConstValue AreYouSureQst Tem certeza de que deseja definir %1 como %2? CreditLimitRoundedTxt O limite de crédito foi arredondado para %1 para estar em conformidade com as políticas da empresa. CreditLimitUpToDateTxt O limite de crédito está atualizado. Adicione duas variáveis decimais locais à função
CallUpdateCreditLimite chame-as CreditLimitCalculated e CreditLimitActual, ambas do tipo Decimal.Adicione o seguinte código à função
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 o novo limite de crédito não for diferente do antigo, o aplicativo deverá enviar notificação ao usuário.
A extensão da tabela Cliente agora é semelhante ao seguinte bloco de código:
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; }A extensão de página CustomerCard agora é semelhante ao seguinte bloco de código:
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 o cliente não tiver histórico de vendas nos últimos 12 meses, o limite de crédito deverá ser redefinido como zero.
Abra o arquivo launch.json na pasta .vscode. Defina a configuração startupObjectId como 22 e a configuração startupObjectType como Page.
Publique sua extensão na área restrita. Selecione Exibir > Paleta de Comandos... (Ctrl+Shift+P).
Insira AL: Publish na caixa de pesquisa (ou pressione a tecla F5) e selecione o comando na lista.
Verifique se o aplicativo Microsoft Dynamics 365 Business Central é iniciado e se a página Lista de Clientes é exibida.
Abra um cartão de cliente aleatório. Na página Customer Card, localize a ação Update Credit Limit, no menu de ações, após Funções.
Teste a ação.