Continuando con mi serie de utilidades para Microsoft Dynamics 365 Business Central, en esta cuarta entrega abordaré la conversión de datos a formato Base64. Esta funcionalidad resulta útil para transmitir datos binarios a través de canales que solo soportan texto, especialmente en integraciones con aplicaciones externas. En este artículo, explicaré cómo convertir imágenes y documentos en Base64 utilizando procedimientos específicos en Business Central.
¡Vamos manos a la obra! 😀
💡 Convertir Texto Base64 a una Imagen Temporal
procedure ConvertImageTextBase64ToTempBlob(ImageTextBase64: Text) TempBlob: Codeunit "Temp Blob"
var
Base64Convert: Codeunit "Base64 Convert";
OutStream: OutStream;
begin
if ImageTextBase64 = '' then
exit;
Clear(TempBlob);
Clear(Base64Convert);
Clear(OutStream);
TempBlob.CreateOutStream(OutStream);
Base64Convert.FromBase64(ImageTextBase64, OutStream);
end;
El primer procedimiento, ConvertImageTextBase64ToTempBlob
, permite tomar un texto en formato Base64 y convertirlo en un blob temporal, un tipo de almacenamiento que permite almacenar datos binarios en Business Central. El procedimiento recibe un parámetro, ImageTextBase64
, que es el texto en formato Base64 de la imagen. Lo primero que hace el procedimiento es verificar si el texto está vacío; si es así, sale de inmediato, evitando operaciones innecesarias. Luego, utiliza el objeto TempBlob
para limpiar y preparar el almacenamiento temporal. Se crea un flujo de salida (OutStream
) en el blob temporal, y a continuación, con Base64Convert.FromBase64
, se decodifica el texto en Base64 y se almacena directamente en el flujo de salida. Este enfoque permite trabajar con imágenes codificadas en Base64 de manera eficiente, haciendo que sea sencillo integrarlas en sistemas que esperan estos datos en formato binario.
📜 Convertir un Conjunto de Medios a Base64
procedure ConvertMediaSetToBase64(MediaId: Text) ReturnValue: Text
var
TenantMedia: Record "Tenant Media";
Base64Convert: Codeunit "Base64 Convert";
InStream: InStream;
begin
ReturnValue := '';
Clear(InStream);
TenantMedia.Reset();
if TenantMedia.Get(MediaId) then begin
TenantMedia.CalcFields(Content);
TenantMedia.Content.CreateInStream(InStream);
ReturnValue := Base64Convert.ToBase64(InStream);
end;
end;
El procedimiento ConvertMediaSetToBase64
convierte un archivo multimedia existente en Business Central en una cadena de texto en formato Base64. Recibe un MediaId
, que es el identificador del archivo almacenado en el registro Tenant Media
. Primero, el procedimiento limpia cualquier flujo de entrada previo y restablece el registro Tenant Media
. Si se encuentra el archivo con el MediaId
especificado, el procedimiento calcula el campo Content
, que contiene el archivo en sí, y crea un flujo de entrada (InStream
) del contenido del archivo. Usando Base64Convert.ToBase64
, convierte el flujo de entrada en una cadena Base64 que es retornada como resultado. Esto es especialmente útil para aplicaciones en las que necesito enviar imágenes o documentos almacenados en Business Central a otras aplicaciones o sistemas que esperan recibir el contenido en un formato Base64 legible.
📝 Convertir Documentos a Base64
procedure ConvertDocumentToBase64(RecVariant: Variant; ReportSelectionUsage: Enum "Report Selection Usage") ReturnValue: Text;
var
ReportSelections: Record "Report Selections";
TempBlob: Codeunit "Temp Blob";
Base64Convert: Codeunit "Base64 Convert";
RecordRef: RecordRef;
InStream: InStream;
OutStream: OutStream;
begin
Clear(Base64Convert);
Clear(InStream);
Clear(OutStream);
Clear(TempBlob);
Clear(RecordRef);
RecordRef.GetTable(RecVariant);
ReportSelections.Reset();
ReportSelections.SetRange(Usage, ReportSelectionUsage);
ReportSelections.FindFirst();
ReportSelections.TestField("Report ID");
TempBlob.CreateOutStream(OutStream, TextEncoding::UTF8);
REPORT.SaveAs(ReportSelections."Report ID", '', SearchReportFormat(ReportSelections."Report ID"), OutStream, RecordRef);
TempBlob.CreateInStream(InStream, TextEncoding::UTF8);
ReturnValue := Base64Convert.ToBase64(InStream);
end;
Este procedimiento, ConvertDocumentToBase64
, se encarga de convertir un informe en Business Central a Base64. Para hacerlo, recibe dos parámetros: RecVariant
, que representa la tabla de registros del documento, y ReportSelectionUsage
, que indica el tipo de informe seleccionado. En primer lugar, el procedimiento limpia todas las variables y luego obtiene el registro del informe usando RecordRef.GetTable
. A continuación, se reinicia la selección de informes (ReportSelections
), que se filtra según el tipo de uso (ReportSelectionUsage
) y se identifica el primer informe configurado con FindFirst
. Si se encuentra el informe, se utiliza la función REPORT.SaveAs
para guardarlo en un blob temporal (TempBlob
) en el formato adecuado, que se obtiene de la función SearchReportFormat
. Finalmente, el procedimiento convierte el flujo de entrada (InStream
) del blob temporal a Base64 y devuelve este texto. Este proceso es muy útil cuando se necesita enviar informes desde Business Central a sistemas externos en un formato legible y estandarizado como Base64.
🔍 Buscar el Formato de Informe
procedure SearchReportFormat(ReportID: Integer) ReturnValue: ReportFormat
var
ReportLayoutList: Record "Report Layout List";
DefaultReportLayoutList: Record "Report Layout List";
IsDefaultLayout: Boolean;
ValueMimeType: Text;
Pos: Integer;
begin
ReturnValue := ReturnValue::Pdf;
ReportLayoutList.Reset();
ReportLayoutList.SetRange("Report ID", ReportID);
if ReportLayoutList.FindSet() then
repeat
if DefaultReportLayoutList."Report ID" <> ReportLayoutList."Report ID" then
GetDefaultReportLayoutSelection(ReportLayoutList."Report ID", DefaultReportLayoutList);
IsDefaultLayout := (DefaultReportLayoutList."Report ID" = ReportLayoutList."Report ID") and (DefaultReportLayoutList.Name = ReportLayoutList.Name) and (DefaultReportLayoutList."Application ID" = ReportLayoutList."Application ID");
if IsDefaultLayout then begin
case ReportLayoutList."Layout Format" of
ReportLayoutList."Layout Format"::Excel:
ReturnValue := ReturnValue::Excel;
ReportLayoutList."Layout Format"::RDLC:
ReturnValue := ReturnValue::Pdf;
ReportLayoutList."Layout Format"::Word:
ReturnValue := ReturnValue::Word;
else begin
ValueMimeType := ReportLayoutList."MIME Type";
Pos := StrPos(ValueMimeType, '/');
ValueMimeType := CopyStr(ValueMimeType, Pos, StrLen(ValueMimeType));
case ValueMimeType of
'docx':
ReturnValue := ReturnValue::Word;
'xlsx':
ReturnValue := ReturnValue::Excel;
end;
end;
end;
exit;
end;
until ReportLayoutList.Next() = 0;
end;
La función SearchReportFormat
encuentra el formato de layout del informe que corresponde a un ReportID
específico. El procedimiento busca en Report Layout List
y determina si el formato predeterminado es PDF, Excel o Word según los ajustes y preferencias configuradas en el sistema. Al identificar el layout, selecciona el formato de salida correcto, lo que es crucial para guardar el informe en un formato adecuado y compatible con el procedimiento de conversión a Base64.
🔄 Obtener la Selección de Layout Predeterminado
local procedure GetDefaultReportLayoutSelection(ReportId: Integer; var DefaultReportLayoutList: Record "Report Layout List"): Boolean
var
ReportMetadata: Record "Report Metadata";
TenantReportLayoutSelection: Record "Tenant Report Layout Selection";
EmptyGuid: Guid;
begin
TenantReportLayoutSelection.Init();
DefaultReportLayoutList.Init();
if TenantReportLayoutSelection.Get(ReportId, CompanyName(), EmptyGuid) then begin
DefaultReportLayoutList.SetRange("Name", TenantReportLayoutSelection."Layout Name");
DefaultReportLayoutList.SetRange("Application ID", TenantReportLayoutSelection."App ID");
DefaultReportLayoutList.SetRange("Report ID", ReportId);
if DefaultReportLayoutList.FindFirst() then
exit(true);
end else
if ReportMetadata.Get(ReportId) then begin
DefaultReportLayoutList.SetRange("Name", ReportMetadata."DefaultLayoutName");
DefaultReportLayoutList.SetFilter("Application ID", '<>%1', EmptyGuid);
DefaultReportLayoutList.SetRange("Report ID", ReportId);
if DefaultReportLayoutList.FindFirst() then
exit(true);
end;
exit(false);
end;
La función GetDefaultReportLayoutSelection
localiza el layout predeterminado para
el informe especificado por ReportId
. Esta función busca en Tenant Report Layout Selection
y Report Metadata
para identificar el layout configurado por defecto. Luego, filtra en DefaultReportLayoutList
el layout correspondiente. Esto asegura que el informe se guarde en el layout correcto, cumpliendo con las configuraciones definidas por el usuario en Business Central y facilitando una conversión eficiente y precisa del informe en formatos externos.
Beneficios y Aplicaciones Prácticas
Este conjunto de procedimientos es ideal para cualquier empresa que necesite intercambiar documentos e imágenes en un formato estandarizado y legible, como Base64. Al convertir imágenes y documentos, se simplifica su transmisión y almacenamiento en plataformas externas, mejorando la interoperabilidad del sistema. Este proceso es particularmente útil para integraciones de documentos y medios con sistemas externos que requieren datos en formato Base64.
Conclusión
En esta cuarta entrega de mi serie de utilidades para Business Central, la conversión de imágenes y documentos a Base64 se revela como una habilidad clave para desarrolladores que trabajan con integraciones de datos. Estos procedimientos ofrecen una solución clara y eficiente para procesar archivos en este formato, facilitando la comunicación entre sistemas.
Para seguir todos los posts de esta serie, puedes encontrarlos bajo la etiqueta #UtilsBc.
¡Gracias por seguir esta serie y feliz codificación! 😊