En el mundo de la gestión empresarial, tener control y visibilidad sobre las tarifas de venta es crucial para mantener la competitividad y eficiencia operativa. Microsoft Dynamics 365 Business Central proporciona una plataforma robusta para la gestión de múltiples aspectos del negocio, incluyendo la fijación de precios. Sin embargo, de manera predeterminada, Business Central no ofrece la capacidad de filtrar tarifas de venta por almacén, lo cual puede ser una limitación significativa para empresas con múltiples ubicaciones.
Filtrar tarifas de venta por almacén permite a las empresas aplicar precios específicos basados en la ubicación del inventario, asegurando que los costos reflejen adecuadamente las condiciones locales, como costos de almacenamiento, transporte y demanda regional. Sin este filtro, las empresas pueden enfrentarse a desafíos en la precisión de la fijación de precios, lo que puede llevar a márgenes de ganancia inconsistentes y a una insatisfacción del cliente debido a precios no competitivos.
Para abordar esta necesidad, se ha desarrollado una solución en AL que añade esta funcionalidad de filtrado por almacén. Este desarrollo no solo mejora la precisión de la gestión de precios, sino que también optimiza la eficiencia operativa al reducir el esfuerzo manual necesario para gestionar y actualizar tarifas en múltiples ubicaciones.
¡Vamos manos a la obra! 😊
Extiende la tabla de líneas de precios como un profesional
tableextension 60052 "Price List Line" extends "Price List Line"
{
fields
{
field(60000; "Location Code"; Code[20])
{
Caption = 'Location Code', Comment = 'ESP="Cód. almacén"';
DataClassification = CustomerContent;
TableRelation = Location;
}
}
}
En esta sección, se extiende la tabla “Price List Line” para incluir un nuevo campo denominado “Location Code”. Este campo permitirá filtrar las tarifas según el almacén correspondiente. La extensión de tablas en AL permite agregar nuevos campos a las tablas existentes sin modificar directamente la tabla base. Esto es crucial para mantener la integridad y las actualizaciones futuras del sistema. El campo “Location Code” se define como un código de hasta 20 caracteres, adecuado para almacenar códigos de ubicación de almacenes.
Añade un filtro de almacén a tu página de tarifas
pageextension 60031 "Price List Lines" extends "Price List Lines"
{
layout
{
addafter("Variant Code")
{
field("Location Code"; Rec."Location Code")
{
ToolTip = 'Specifies the value of the field', comment = 'ESP="Especifica el valor del campo"';
ApplicationArea = All;
}
}
}
}
Aquí, se extiende la página “Price List Lines” para agregar el campo “Location Code” al diseño. Esto facilita la entrada y visualización del filtro de almacén directamente en la interfaz de la página. Al extender una página, se puede personalizar el diseño de la interfaz de usuario para incluir nuevos campos que son relevantes para el negocio.
Mejora tu hoja de precios con un filtro por almacén
tableextension 60053 "Price Worksheet Line" extends "Price Worksheet Line"
{
fields
{
field(60000; "Location Code"; Code[20])
{
Caption = 'Location Code', Comment = 'ESP="Cód. almacén"';
DataClassification = CustomerContent;
TableRelation = Location;
}
}
}
Similar a la primera extensión, aquí se extiende la tabla “Price Worksheet Line” para incluir el campo “Location Code”, asegurando que también se pueda filtrar en el contexto de las hojas de precios. Las hojas de precios son cruciales para la planificación y gestión de precios a nivel detallado. Al incluir un campo de filtro de ubicación, se permite una mayor granularidad y precisión en la gestión de precios, alineando los precios de los productos con las ubicaciones específicas de los almacenes.
Incorpora el filtro a la página de tu hoja de precios
pageextension 60032 "Price Worksheet" extends "Price Worksheet"
{
layout
{
addafter("Variant Code")
{
field("Location Code"; Rec."Location Code")
{
ToolTip = 'Specifies the value of the field', comment = 'ESP="Especifica el valor del campo"';
ApplicationArea = All;
}
}
}
}
En esta extensión, se agrega el campo “Location Code” a la página “Price Worksheet”, permitiendo manejar el filtro de almacén en las hojas de precios. La personalización de la página de la hoja de precios facilita la entrada y revisión de los filtros aplicados, mejorando la experiencia del usuario y asegurando que los datos sean fácilmente accesibles y editables.
Eventos para validar filtros como un experto
Ajustando Filtros de Activos
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Price List Management", OnAfterSetAssetFilters, '', false, false)]
local procedure C7017_OnAfterSetAssetFilters(PriceListLine: Record "Price List Line"; var DuplicatePriceListLine: Record "Price List Line")
begin
//Precios de venta: es para que no de problemas al comprobar lineas en la lista de precios de venta
DuplicatePriceListLine.SetRange("Location Code", PriceListLine."Location Code");
end;
Este procedimiento se suscribe al evento OnAfterSetAssetFilters
en la codeunit Price List Management
. Su propósito es asegurar que el campo “Location Code” en DuplicatePriceListLine
se configure al mismo valor que en PriceListLine
. Esto es esencial para evitar problemas al verificar las líneas en la lista de precios de venta.
Filtrando con Base en el Almacén
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Price Calculation Buffer Mgt.", OnAfterSetFilters, '', false, false)]
local procedure C7800_OnAfterSetFilters(var PriceListLine: Record "Price List Line"; AmountType: Enum "Price Amount Type"; var PriceCalculationBuffer: Record "Price Calculation Buffer"; ShowAll: Boolean)
begin
//Precios de venta: es para que filtre por el campo nuevo del almacén
if PriceCalculationBuffer."Location Code" = '' then
PriceListLine.SetFilter("Location Code", '%1', '')
else
PriceListLine.SetFilter("Location Code", '%1|%2', PriceCalculationBuffer."Location Code", '');
end;
Suscrito al evento OnAfterSetFilters
en la codeunit Price Calculation Buffer Mgt.
, este procedimiento ajusta los filtros de PriceListLine
basándose en el campo “Location Code” de PriceCalculationBuffer
. Si el “Location Code” está vacío, se filtran las líneas para incluir sólo las entradas con un “Location Code” vacío. De lo contrario, se incluyen tanto el código específico como las entradas con código vacío. Esto garantiza que el filtrado se realice correctamente según la nueva columna de almacén.
Validando Líneas de Venta
[EventSubscriber(ObjectType::Table, database::"Sales Line", OnAfterValidateEvent, "Location Code", false, false)]
local procedure T37_OnAfterValidateEvent_LocationCode(var Rec: Record "Sales Line"; var xRec: Record "Sales Line"; CurrFieldNo: Integer)
begin
//Precios de venta: es para que vuelva a comprobar los precios y los descuentos al validar el almacén
Rec.UpdateUnitPriceByField(0);
end;
Este procedimiento se suscribe al evento OnAfterValidateEvent
para el campo “Location Code” en la tabla Sales Line
. Después de validar el “Location Code”, se asegura de que los precios unitarios y descuentos se recalculen en base al nuevo valor del almacén. Esto es crucial para mantener la precisión de precios y descuentos después de cualquier cambio en el almacén.
Beneficios y Aplicaciones Prácticas:
Implementar este filtrado específico en Business Central ofrece varias ventajas:
- Precisión en la fijación de precios: Permite aplicar tarifas específicas según la ubicación del almacén, lo que asegura precios más precisos y relevantes.
- Eficiencia en la gestión: Facilita la administración y actualización de tarifas de manera centralizada, reduciendo el esfuerzo manual y el riesgo de errores.
- Flexibilidad: Esta solución puede ser adaptada y expandida para incluir otros filtros adicionales según las necesidades del negocio.
Conclusión:
Implementar un filtrado de tarifas de venta por almacén en Business Central es una mejora significativa para la gestión de precios. Este desarrollo en AL permite una mayor precisión y eficiencia en las operaciones diarias, asegurando que cada almacén maneje las tarifas correctas.
Si quieres ver el código completo, está en GitHub.
Espero que este post te haya sido útil y que puedas implementar esta funcionalidad en tus proyectos. ¡Hasta la próxima!