Esta es la decimoctava entrega de la serie sobre utilidades para Business Central. En esta ocasión presento un conjunto variado de funciones: generación de códigos QR y Code128, búsqueda del contacto vinculado a un cliente, eliminación masiva de datos de empresa y validaciones de mayúsculas y minúsculas.

¡Vamos manos a la obra! 🛠️


📦 Generar código QR: GenerateQRCodeToText

procedure GenerateQRCodeToText(BarcodeText: Text) QRCode: Text
var
    BarcodeSymbology2D: Enum "Barcode Symbology 2D";
    BarcodeFontProvider2D: Interface "Barcode Font Provider 2D";
begin
    //la fuente en el informe tiene que ser IDAutomation2D
    Clear(QRCode);
    Clear(BarcodeFontProvider2D);

    BarcodeFontProvider2D := Enum::"Barcode Font Provider 2D"::IDAutomation2D;
    BarcodeSymbology2D := Enum::"Barcode Symbology 2D"::"QR-Code";
    QRCode := BarcodeFontProvider2D.EncodeFont(BarcodeText, BarcodeSymbology2D);
end;

¿Qué hace?

Genera el texto codificado en formato QR-Code usando el proveedor de fuentes IDAutomation2D estándar de Business Central. El texto resultante debe mostrarse en el informe con la fuente IDAutomation2D para que se renderice como un código QR visual.

Ideal para facturas, albaranes o etiquetas que deben incluir un código QR con información del documento.


📦 Generar código Code128: GenerateCode128ToText

procedure GenerateCode128ToText(BarcodeText: Text) Code128: Text
var
    BarcodeSymbology: Enum "Barcode Symbology";
    BarcodeFontProvider: Interface "Barcode Font Provider";
begin
    //la fuente en el informe tiene que ser IDAutomation2D
    Clear(Code128);
    Clear(BarcodeFontProvider);

    BarcodeFontProvider := Enum::"Barcode Font Provider"::IDAutomation1D;
    BarcodeSymbology := Enum::"Barcode Symbology"::Code128;
    Code128 := BarcodeFontProvider.EncodeFont(BarcodeText, BarcodeSymbology);
end;

¿Qué hace?

Igual que la anterior pero para código de barras unidimensional Code128, usando el proveedor IDAutomation1D. El texto resultante debe mostrarse en el informe con la fuente correspondiente para renderizarlo como código de barras.


👤 Buscar contacto desde cliente: SearchContactFromClient

procedure SearchContactFromClient(CustomerNo: Code[20]; var Contact: Record Contact) ReturnValue: Boolean
var
    Customer: Record Customer;
    ContactBusinessRelation: Record "Contact Business Relation";
    CustContUpdate: Codeunit "CustCont-Update";
begin
    Clear(ReturnValue);
    if not Customer.Get(CustomerNo) then
        exit;

    ContactBusinessRelation.SetCurrentKey("Link to Table", "No.");
    ContactBusinessRelation.SetRange("Link to Table", ContactBusinessRelation."Link to Table"::Customer);
    ContactBusinessRelation.SetRange("No.", Customer."No.");
    if not ContactBusinessRelation.FindFirst() then begin
        Clear(CustContUpdate);
        CustContUpdate.InsertNewContact(Customer, false);
        if not ContactBusinessRelation.FindFirst() then
            exit;
    end;

    Contact.Reset();
    Contact.SetRange("Company No.", ContactBusinessRelation."Contact No.");
    if Contact.IsEmpty() then begin
        Contact.SetRange("Company No.");
        Contact.SetRange("No.", ContactBusinessRelation."Contact No.");
    end;

    if not Contact.FindFirst() then
        exit;

    ReturnValue := true;
end;

¿Qué hace?

Dado un número de cliente, busca el contacto vinculado a través de la tabla Contact Business Relation. Si el cliente no tiene contacto asociado, lo crea automáticamente mediante CustContUpdate.InsertNewContact.

Devuelve true si se encontró (o creó) el contacto, y rellena el parámetro Contact por referencia.


🗑️ Eliminar todos los datos de la empresa: DeleteAllDataCompany

procedure DeleteAllDataCompany()
var
    AllObj: Record AllObj;
begin
    AllObj.Reset();
    AllObj.SetRange("Object Type", AllObj."Object Type"::Table);
    AllObj.SetFilter("Object ID", '<2000000000');
    this.ProcessDialogOpen(AllObj.Count());
    if AllObj.FindSet() then
        repeat
            this.ProcessDialogUpdate();

            if this.DeleteAllTable(AllObj."Object ID") then;
        until AllObj.Next() = 0;
    this.ProcessDialogClose();
end;

[TryFunction]
local procedure DeleteAllTable(TableId: Integer)
var
    RecordRef: RecordRef;
begin
    Clear(RecordRef);
    RecordRef.Open(TableId);
    RecordRef.DeleteAll();
end;

¿Qué hace?

Recorre todas las tablas de la empresa (excluyendo tablas del sistema con ID mayor o igual a 2.000.000.000) y elimina todos sus registros. Usa [TryFunction] en la función interna para que los errores en tablas individuales no interrumpan el proceso completo.

Muestra un diálogo de progreso durante la ejecución usando las funciones de diálogo de Utils.

⚠️ Advertencia: Esta función es destructiva e irreversible. Úsala únicamente en entornos de desarrollo o sandbox, nunca en producción.


🔡 Validar mayúsculas y minúsculas: IsUpperCase / IsLowerCase

procedure IsUpperCase(InputText: Text): Boolean
begin
    if InputText = '' then
        exit(false);

    exit(InputText = UpperCase(InputText));
end;

procedure IsLowerCase(InputText: Text): Boolean
begin
    if InputText = '' then
        exit(false);

    exit(InputText = LowerCase(InputText));
end;

¿Qué hacen?

Dos funciones simétricas y simples:

  • IsUpperCase: Devuelve true si el texto está completamente en mayúsculas.
  • IsLowerCase: Devuelve true si el texto está completamente en minúsculas.

En ambos casos, un texto vacío devuelve false. Útiles para validaciones de entrada de datos o para determinar el formato de un código recibido desde un sistema externo.


💡 Aplicaciones prácticas

  • Incluir códigos QR o Code128 en informes de BC SaaS sin depender de fuentes externas.
  • Obtener el contacto vinculado a un cliente para envíos de correo o integraciones CRM.
  • Limpiar completamente una empresa de test o sandbox antes de cargar datos nuevos.
  • Validar que los códigos introducidos por el usuario siguen el formato esperado (todo mayúsculas, todo minúsculas).

Conclusión

En esta decimoctava entrega de la serie Utils, presento un grupo variado de funciones de uso cotidiano: generación de códigos QR y Code128, búsqueda de contactos vinculados a clientes, limpieza masiva de datos y validaciones de formato de texto. Pequeñas herramientas que ahorran tiempo en el día a día del desarrollo en Business Central.

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!