Ejercicio: Funciones personalizadas
Trabaja como desarrollador de sistemas empresariales para CRONUS International Ltd. Está aprendiendo a desarrollar personalizaciones para Business Central y a programar en AL para personalizar las soluciones para los clientes. Quiere personalizar la página Ficha cliente agregando una acción que ajusta el límite de crédito de un cliente en función del historial de ventas anterior del cliente o restablece el límite a cero si no se produjeron transacciones.
Se le han dado los siguientes requisitos:
El límite de crédito de un cliente no puede exceder el 50 por ciento de los ingresos totales por ventas del cliente en los últimos 12 meses.
El límite de crédito del cliente siempre debe redondearse a la decena de millar más cercana.
Si el límite de crédito se redondea durante el proceso, la aplicación debe enviar una notificación al usuario.
Si el nuevo límite de crédito no difiere del anterior, la aplicación debe enviar una notificación al usuario.
Si el cliente no tiene historial de ventas en los últimos 12 meses, el límite de crédito debe restablecerse a cero.
La función que establece el límite de crédito debe estar disponible para otros objetos.
La página Ficha cliente debe incluir una acción que llame a la función.
Si se llama a la función desde la acción de la página, y se aumentaría el límite de crédito, la función debe solicitar confirmación al usuario antes de actualizar el límite de crédito.
Tareas
Crear una nueva extensión.
Crear una extensión de tabla.
Crear una extensión de página.
Pasos
Inicie Visual Studio Code.
Cree un nuevo proyecto de extensión AL. Seleccione Ver > Paleta de comandos (Ctrl+Mayús+P).
Introduzca AL: Go! en el cuadro de búsqueda y luego seleccione el comando de la lista.
Acepte la ruta sugerida, pero cambie el nombre a CreditLimit (o escriba otra ruta).
Seleccione la plataforma de destino más reciente.
Seleccione Espacio aislado de nube de Microsoft como punto de conexión del desarrollo.
Descargue los símbolos de la aplicación. Seleccione Ver > Paleta de comandos (Ctrl+Mayús+P).
Introduzca AL: Descargar símbolos en el cuadro de búsqueda y, a continuación, seleccione el comando de la lista.
Si se le solicita, proporcione sus credenciales de la organización (cuenta de Microsoft 365/cuenta de Microsoft Entra ID).
Abra el archivo app.json y cambie la configuración nombre a Límite de crédito. Cambie la configuración del editor a Cronus International Ltd.
Cambie idRanges de 50400 a 50450.
Elimine el archivo HelloWorld.al.
Agregue una carpeta llamada src.
En la carpeta src, cree un archivo llamado Customer.TableExt.al.
Cree una nueva extensión de tabla en este archivo mediante el uso de fragmentos de código. Introduzca
ttableexty pulse la tecla Tab.Cambie el Id. a 50400 y el nombre a Customer.
Configure el parámetro Extends como Customer para extender la tabla Customer.
Agregue un procedimiento no local a la extensión de la tabla Customer y póngale el nombre UpdateCreditLimit.
Modifique la función
UpdateCreditLimitpara que reciba un parámetro llamado NewCreditLimit, de tipo Decimal, por referencia.Agregue otro procedimiento no local y póngale el nombre CalculateCreditLimit, que devuelve un valor de tipo Decimal.
En la carpeta src, cree un nuevo archivo llamado CustomerCard.PageExt.al.
Cree una nueva extensión de página en este archivo mediante el uso de fragmentos de código. Introduzca
tpageexty pulse la tecla Tab.Cambie el Id. a 50130 y el nombre a CustomerCard.
Configure el parámetro Extends como Customer Card.
Cree un procedimiento local y póngale el nombre CallUpdateCreditLimit.
Agregue una acción al grupo de acciones Función, en el contenedor de acciones ActionItems. En la sección Actions, introduzca
addAfter("F&unctions).Agregue una acción con el nombre UpdateCreditLimit en la sección addafter y configure las propiedades Caption y Tooltip como Update Credit Limit. Establezca la propiedad Image en CalculateCost.
En el desencadenador
OnAction, llame a la acciónCallUpdateCreditLimit.Modifique la función
CalculateCreditLimitde la extensión de tabla. Agregue una variable local con el nombre Customer del tipo Registrar cliente.Agregue código a la función
CalculateCreditLimitpara calcular el campo Sales (LCY) durante los últimos doce meses.Cust := Rec; Cust.SetRange("Date Filter",CalcDate('<-12M>',WorkDate()),WorkDate()); Cust.CalcFields("Sales (LCY)","Balance (LCY)"); exit(Round(Cust."Sales (LCY)" * 0.5));Uno de los requisitos es que el límite de crédito de un cliente no puede exceder el 50 por ciento de los ingresos totales por ventas del cliente en los últimos 12 meses.
Agregue código a la función
UpdateCreditLimitpara redondear el parámetro formal NewCreditLimit a la decena de millar más cercana, para validar el valor de NewCreditLimit en el campo Credit Limit (LCY) y para modificar el registro.NewCreditLimit := Round(NewCreditLimit, 10000); Rec.Validate("Credit Limit (LCY)", NewCreditLimit); Rec.Modify();Uno de los requisitos es que el límite de crédito del cliente siempre debe redondearse a la decena de millar más cercana.
Agregue tres etiquetas globales a la extensión de página con el siguiente texto:
Mensaje de confirmación
Información sobre el límite de crédito redondeado
Información sobre un límite de crédito actualizado
Nombre ConstValue AreYouSureQst ¿Está seguro de que desea establecer %1 como %2? CreditLimitRoundedTxt El límite de crédito se redondeó a %1 para cumplir con las directivas de la empresa. CreditLimitUpToDateTxt El límite de crédito está actualizado. Agregue dos variables decimales locales a la función
CallUpdateCreditLimity llámelas CreditLimitCalculated y CreditLimitActual, ambas del tipo Decimal.Agregue el siguiente código a la función
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 el nuevo límite de crédito no difiere del anterior, la aplicación debe enviar una notificación al usuario.
Ahora, la extensión de la tabla Customer tiene un aspecto similar al siguiente bloque 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; }Ahora, la extensión de la página CustomerCard tiene un aspecto similar al siguiente bloque 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; }Si el cliente no tiene historial de ventas en los últimos 12 meses, el límite de crédito debe restablecerse a cero.
Abra el archivo launch.json, en la carpeta .vscode. Establezca la configuración startupObjectId en 22 y la configuración startupObjectType en Page.
Publique su extensión en el espacio aislado. Seleccione Ver > Paleta de comandos (Ctrl+Mayús+P).
Introduzca AL: Publish en el cuadro de búsqueda (o presione la tecla F5) y, a continuación, seleccione el comando de la lista.
Compruebe que se inicia la aplicación Microsoft Dynamics 365 Business Central y que aparece la página Lista de clientes.
Abra una ficha cliente al azar. En la página Customer Card, busque la acción Update Credit Limit, en el menú de acciones, después de Funciones.
Pruebe la acción.