Exercício – Funções personalizadas

Concluído

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

  1. Inicie o Visual Studio Code.

  2. Crie um novo projeto da Extensão AL. Selecione Exibir > Paleta de Comandos... (Ctrl+Shift+P).

  3. Insira AL: Go! na caixa de pesquisa e selecione o comando na lista.

  4. Aceite o caminho sugerido, mas altere o nome para CreditLimit (ou insira outro caminho).

  5. Selecione a plataforma de destino mais recente.

  6. Selecione Área restrita da nuvem da Microsoft como o ponto de extremidade de desenvolvimento.

  7. Baixe os símbolos do aplicativo. Selecione Exibir > Paleta de Comandos... (Ctrl+Shift+P).

  8. Insira AL: Download symbols na caixa de pesquisa e selecione o comando na lista.

  9. Se solicitado, forneça suas credenciais organizacionais (conta do Microsoft 365/conta do Microsoft Entra ID).

  10. 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.

  11. Altere idRanges de 50400 para 50450.

  12. Remova o arquivo HelloWorld.al.

  13. Adicione uma pasta chamada: src

  14. Na pasta src, crie um arquivo chamado Customer.TableExt.al.

  15. Crie uma nova extensão de tabela no arquivo usando trechos de código. Insira ttableext e pressione a tecla Tab.

  16. Altere a ID para 50400 e o name para Customer.

  17. Defina o parâmetro Extends como Customer para estender a tabela Customer.

  18. Adicione um procedimento não local à extensão da tabela Cliente e nomeie-o como UpdateCreditLimit.

  19. Modifique a função UpdateCreditLimit para que ela receba um parâmetro denominado NewCreditLimit, do tipo Decimal, por referência.

  20. Adicione outro procedimento não local e nomeie-o como CalculateCreditLimit, que retorna um valor do tipo Decimal.

  21. Crie um novo arquivo na pasta src com o nome: CustomerCard.PageExt.al.

  22. Crie uma nova extensão de página no arquivo usando trechos de código. Insira tpageext e pressione a tecla Tab.

  23. Altere a ID para 50130 e o name para CustomerCard.

  24. Defina o parâmetro Extends para Customer Card.

  25. Crie um procedimento local e nomeie-o CallUpdateCreditLimit.

  26. 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).

  27. 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.

  28. No gatilho OnAction, chame a ação CallUpdateCreditLimit.

  29. Modifique a função CalculateCreditLimit da extensão da tabela. Adicione uma variável local com o nome Customer do tipo Record Customer.

  30. Adicione o código à função CalculateCreditLimit que 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.

  31. Adicione o código à função UpdateCreditLimit para 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.

  32. 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.
  33. Adicione duas variáveis decimais locais à função CallUpdateCreditLimit e chame-as CreditLimitCalculated e CreditLimitActual, ambas do tipo Decimal.

  34. 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.

  35. 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;
    }
    
  36. 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.

  37. Abra o arquivo launch.json na pasta .vscode. Defina a configuração startupObjectId como 22 e a configuração startupObjectType como Page.

  38. Publique sua extensão na área restrita. Selecione Exibir > Paleta de Comandos... (Ctrl+Shift+P).

  39. Insira AL: Publish na caixa de pesquisa (ou pressione a tecla F5) e selecione o comando na lista.

  40. Verifique se o aplicativo Microsoft Dynamics 365 Business Central é iniciado e se a página Lista de Clientes é exibida.

  41. 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.

  42. Teste a ação.