Bienvenido/a a la séptima entrega de esta serie dedicada a utilidades para Business Central. En esta ocasión, voy a mostrar cómo trabajar con números de lote en las líneas de venta. El procedimiento que explicaré, GeFilterLotFromSalesLine
, te permitirá recuperar los números de lote asociados a una línea de venta de manera precisa y estructurada, gestionando tanto las entradas de reserva como las especificaciones de seguimiento.
¡Vamos manos a la obra! 😝
Procedimiento GeFilterLotFromSalesLine
El propósito de este procedimiento es tomar un registro de la tabla Sales Line
y devolver un texto que contenga todos los números de lote asociados, separados por un delimitador (|
). Esta funcionalidad es esencial en escenarios donde los lotes son críticos para el control de inventario o trazabilidad. Aquí tienes el código:
procedure GeFilterLotFromSalesLine(SalesLine: record "Sales Line") ReturnValue: Text
var
ReservationEntry: Record "Reservation Entry";
TrackingSpecification: Record "Tracking Specification";
begin
Clear(ReturnValue);
if SalesLine."Line No." = 0 then
exit;
ReservationEntry.SetCurrentKey("Source ID", "Source Ref. No.", "Source Type", "Source Subtype", "Source Batch Name", "Source Prod. Order Line", "Reservation Status", "Shipment Date", "Expected Receipt Date");
ReservationEntry.SetRange("Source ID", SalesLine."Document No.");
ReservationEntry.SetRange("Source Ref. No.", SalesLine."Line No.");
ReservationEntry.SetRange("Source Type", Database::"Sales Line");
ReservationEntry.SetRange("Source Subtype", SalesLine."Document Type");
if ReservationEntry.FindSet() then
repeat
if ReturnValue <> '' then
ReturnValue += '|';
ReturnValue += ReservationEntry."Lot No.";
until ReservationEntry.Next() = 0;
TrackingSpecification.SetCurrentKey("Source ID", "Source Type", "Source Subtype",
"Source Batch Name", "Source Prod. Order Line", "Source Ref. No.");
TrackingSpecification.SetRange("Source ID", SalesLine."Document No.");
TrackingSpecification.SetRange("Source Type", Database::"Sales Line");
TrackingSpecification.SetRange("Source Subtype", SalesLine."Document Type");
TrackingSpecification.SetRange("Source Ref. No.", SalesLine."Line No.");
if TrackingSpecification.FindSet() then
repeat
if ReturnValue <> '' then
ReturnValue += '|';
ReturnValue += TrackingSpecification."Lot No.";
until TrackingSpecification.Next() = 0;
end;
Explicación del procedimiento
El procedimiento GeFilterLotFromSalesLine
utiliza las tablas Reservation Entry
y Tracking Specification
para obtener los números de lote asociados a una línea de venta. La lógica se divide en varias etapas, que explico a continuación:
1. Limpieza inicial
Se utiliza la función Clear(ReturnValue)
para asegurarse de que la variable de retorno esté vacía antes de comenzar el procesamiento. Además, si el campo "Line No."
del registro Sales Line
es igual a 0
, el procedimiento se detiene con un exit
. Esto garantiza que no se procese información inválida.
2. Filtrado en la tabla Reservation Entry
La tabla Reservation Entry
contiene información sobre las reservas de inventario, incluidas las referencias a números de lote.
- Se establece una clave específica con
SetCurrentKey
, seleccionando los campos más relevantes para filtrar los datos. - Luego, se configuran los rangos de filtrado con
SetRange
, limitando los resultados a los registros que coinciden con el documento y la línea de venta proporcionados. - Si existen registros coincidentes (
FindSet
), se recorren los resultados. En cada iteración, se verifica si la variableReturnValue
ya contiene datos. Si es así, se añade el delimitador|
antes de agregar el nuevo número de lote (ReservationEntry."Lot No."
).
3. Filtrado en la tabla Tracking Specification
De manera similar, se utiliza la tabla Tracking Specification
, que almacena datos relacionados con el seguimiento de artículos.
- Se establece una clave y se aplican los rangos de filtrado basados en el documento, el tipo y la línea de venta.
- Si hay registros coincidentes, se recorren para agregar los números de lote encontrados a la variable de retorno, nuevamente utilizando
|
como delimitador entre ellos.
4. Retorno del resultado
Al final del procedimiento, la variable ReturnValue
contiene todos los números de lote separados por |
. Si no se encuentra ningún lote, la variable queda vacía.
Aplicaciones prácticas del procedimiento
Este procedimiento es extremadamente útil en escenarios de control de inventario y trazabilidad, especialmente en sectores como el alimentario, farmacéutico o de fabricación, donde la gestión de lotes es crucial. Algunas aplicaciones prácticas incluyen:
- Generación de informes de trazabilidad: Puedes utilizar este procedimiento para obtener los números de lote asociados a una venta y luego incluirlos en un informe de seguimiento.
- Validación en procesos de envío: Antes de enviar productos, es posible validar que los lotes incluidos coincidan con los previstos en la orden de venta.
- Integraciones con sistemas externos: Este procedimiento puede ser útil al enviar información de lotes a sistemas ERP complementarios o soluciones de logística.
- Optimización de devoluciones y reclamos: Al recuperar rápidamente los números de lote asociados a una línea de venta, puedes agilizar la resolución de problemas relacionados con devoluciones o calidad.
Beneficios del procedimiento
- Eficiencia: Permite extraer información de manera estructurada sin necesidad de escribir consultas complejas cada vez.
- Reutilización: Al encapsular la lógica en un procedimiento, puedes usarlo en múltiples contextos dentro de tu aplicación.
- Trazabilidad mejorada: Facilita la gestión de lotes, que es esencial en procesos donde se requiere un seguimiento exhaustivo del inventario.
- Flexibilidad: El uso de delimitadores como
|
permite que los datos se puedan procesar fácilmente en otros sistemas o informes.
Conclusión
En esta séptima entrega, te he mostrado cómo recuperar números de lote asociados a líneas de venta utilizando las tablas Reservation Entry
y Tracking Specification
. Este procedimiento es una herramienta valiosa para mejorar la trazabilidad y la gestión de inventario en proyectos de Business Central.
Gracias por seguir esta serie. Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.
Si quieres ver el código completo, está en GitHub.
Espero que esta utilidad te sea de gran ayuda en tu día a día como desarrollador. Si tienes dudas o comentarios, estaré encantado de escucharlos. ¡Nos vemos en la próxima entrega!