Esta es la decimoséptima entrega de la serie sobre utilidades para Business Central. En esta ocasión presento dos funciones orientadas a la gestión de lotes y trazabilidad de artículos: una para obtener el siguiente número de lote según la serie configurada en el artículo, y otra para verificar si un artículo admite reservas.

¡Vamos manos a la obra! 🏷️


🏷️ Obtener el siguiente número de lote: GetNextLotNo

procedure GetNextLotNo(ItemNo: Code[20]): Code[50]
var
    Item: Record Item;
    NoSeries: Codeunit "No. Series";
    LotNo: Code[20];
begin
    Item.Get(ItemNo);
    if Item."Lot Nos." = '' then
        exit;

    LotNo := NoSeries.GetNextNo(Item."Lot Nos.");

    exit(LotNo);
end;

¿Qué hace esta función?

Dado un código de artículo, obtiene el siguiente número de lote disponible según la serie de números (No. Series) configurada en el campo Lot Nos. del artículo.

Paso a paso:

  1. Obtiene el artículo: Carga la ficha del artículo con Item.Get.
  2. Comprueba si tiene serie de lotes: Si el campo Lot Nos. está vacío, sale sin devolver nada.
  3. Genera el siguiente número: Llama al codeunit estándar No. Series para obtener el siguiente valor de la serie, que queda marcado como usado.

Ejemplo de uso:

var
    Utils: Codeunit Utils;
    NewLotNo: Code[50];
begin
    NewLotNo := Utils.GetNextLotNo('ART-001');
    // NewLotNo contiene el siguiente número de lote de la serie
end;

Esta función es especialmente útil en procesos de fabricación o recepción donde se necesita asignar automáticamente un número de lote nuevo sin depender de la interfaz de usuario.


✅ Verificar si un artículo puede ser reservado: CanReserveItem

procedure CanReserveItem(ItemNo: Code[20]): Boolean
var
    Item: Record Item;
begin
    if not Item.Get(ItemNo) then
        exit(false);

    if Item.Blocked then
        exit(false);

    if Item."Item Tracking Code" = '' then
        exit(false);

    exit(true);
end;

¿Qué hace esta función?

Devuelve true si un artículo puede ser reservado, comprobando tres condiciones básicas:

  1. Existe el artículo: Si no se encuentra, devuelve false.
  2. No está bloqueado: Un artículo bloqueado no puede ser objeto de transacciones.
  3. Tiene código de seguimiento: Si el campo Item Tracking Code está vacío, el artículo no tiene configurada la trazabilidad y por tanto no admite reservas por lote o número de serie.

Ejemplo de uso:

var
    Utils: Codeunit Utils;
begin
    if Utils.CanReserveItem('ART-001') then
        // proceder con la reserva
    else
        Error('El artículo no admite reservas.');
end;

💡 Beneficios y aplicaciones prácticas

Estas dos funciones son especialmente útiles en:

  • Procesos automáticos de recepción o fabricación que asignan lotes sin intervención del usuario.
  • Validaciones previas antes de intentar reservar stock con trazabilidad.
  • Integraciones con sistemas externos que necesitan conocer el siguiente lote antes de enviarlo.
  • Asistentes de configuración que guían al usuario en la creación de entradas de diario de artículo con lote.

Conclusión

En esta decimoséptima entrega de la serie Utils, presento dos funciones para trabajar con lotes de artículos: una que genera el siguiente número de lote a partir de la serie configurada en el artículo, y otra que verifica si el artículo admite reservas. Sencillas pero muy útiles en procesos de trazabilidad automatizados.

Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.

Si quieres ver el código completo, está en GitHub.

¡Nos vemos en la próxima!