Crear ficheros de texto con BigText en Business Central
Bienvenidos bibliotecarios a una nueva entrada馃榿.
En la entrada de hoy veremos como crear ficheros de texto en Business Central.
Todos sabemos los problemas que pueden llegar a dar los ficheros en un entorno de SaaS, pero de esta manera podremos crear ficheros sin ning煤n tipo de problema, simplemente usando variables de texto de manera bastante intuitiva.
En mi opini贸n la mayor utilidad es crear un fichero de confirming, de esta forma nos ser谩 bastante sencillo.
Bien, sin m谩s rodeos vamos ha hacer un ejemplo muy sencillo para ver el funcionamiento馃榿.
Nuestro ejemplo consistir谩 en recorrer los clientes e introducir en un fichero los campos No. (1, Code[20], CP), Name (2, Text[100]), Balance (LCY) (59, Decimal) y Last Date Modified (54, Date)
- Crearemos un report con el que recorrer los clientes
report 50002 "BBC Customer Document"
{
UsageCategory = ReportsAndAnalysis;
ApplicationArea = All;
ProcessingOnly = true;
UseRequestPage = false;
Caption = 'Create Customers Document', Comment = 'ESP="Crear documento clientes"';
dataset
{
dataitem(Customer; Customer)
{
trigger OnAfterGetRecord()
begin
end;
}
}
}
- Crear variables necesarias
TempBlob: Codeunit 芦Temp Blob禄: Codeunit que necesitaremos al final del report para poder descargarlo.
Data: BigText: Variable BigText en la que iremos guardando los datos que queramos introducir en el fichero.
InStr: InStream: Variable InStream que necesitaremos al final del report para poder descargarlo.
OutStr: OutStream: Variable OutStream que necesitaremos al final del report para poder descargarlo.
ExternalFile: Text: Variable Text con la que daremos nombre al fichero.
OutTxt: Text: Variable Text en la que iremos guardando los datos antes de agregarlos al BigText.
CR, LF : Char: Variables de tipo Char con las que a帽adiremos los saltos del l铆nea. Es importante inicializarlas CR := 13 y LF := 10
trigger OnInitReport()
begin
ExternalFile := 'Documento Clientes.txt';
CR := 13;
LF := 10;
end;
var
TempBlob: Codeunit "Temp Blob";
Data: BigText;
InStr: InStream;
OutStr: OutStream;
ExternalFile: Text;
OutTxt: Text;
CR, LF : Char;
- Agregamos los datos a la variable OutText y esta variable la a帽adimos a nuestro BigText
trigger OnAfterGetRecord()
begin
Clear(OutTxt);
Customer.CalcFields("Balance (LCY)");
OutTxt := Customer."No." + ' ' + Customer.Name + ' ' + Format(Customer."Balance (LCY)") + ' ' + Format(Customer."Last Date Modified") + Format(CR) + Format(LF);
Data.AddText(OutTxt);
end;
Una vez que hemos rellenado nuestra variable con todos los datos es hora de descargar el fichero resultante. 馃槑
Para ello usaremos las variables anteriormente mencionadas en el trigger OnPostReport()
- Descarga del fichero
trigger OnPostReport()
begin
Clear(OutStr);
TempBLOB.CreateOutStream(OutStr, TextEncoding::Windows); //*Creamos OutStream con encoding de Windows
Data.Write(OutStr); //*Cargamos los datos recopilados en nuestro BigText en variable OutStream
TempBLOB.CreateInStream(InStr, TextEncoding::Windows); //*Leemos los datos con la variable InStream
if not DownloadFromStream(InStr, '', '', '', ExternalFile) then //*Descargamos el fichero
exit;
end;
Hecho esto veamos el resultado馃槑:
Adem谩s, si usamos Notepad++: https://notepad-plus-plus.org/downloads/
Tenemos la posibilidad de ver los espacios y saltos de l铆neas en nuestro fichero. Una funci贸n bastante 煤til a la hora de comprobar que todo esta correcto o para encontrar errores.
Visto esto, con un poco de imaginaci贸n podemos escalar de manera sencilla a crear ficheros m谩s complejos馃榿.
Por otra parte como coment茅 al principio del post, en mi opini贸n lo m谩s interesante de saber estas funcionalidades es al crear ficheros de confirming, por lo que veremos algunas funciones con las cuales podremos crearlos mucho m谩s f谩cil.
Veamos algunos ejemplos:
Cambiar longitud de una variable y rellenar con caracteres hasta completar longitud:
En este caso usaremos la funci贸n Text.PadStr(Text, Integer [, Text]) : Text : Cambia la longitud de una cadena a una longitud especificada. Si la cadena es m谩s corta que la longitud especificada, se agregan espacios de longitud al final de la cadena para que coincida con la longitud. Si la cadena es m谩s larga que la longitud especificada, se trunca. Si la longitud especificada es menor que 0, se genera una excepci贸n.
Documentaci贸n Microsoft -> https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/text/text-padstr-method
En nuestro ejemplo volveremos a crear el fichero pero esta vez mostraremos el nombre del cliente y rellenaremos hasta la longitud 200 con el caracter ‘@’.
trigger OnAfterGetRecord()
var
CustomerName: Text;
begin
CustomerName := PadStr(Customer.Name, 200, '@') + Format(CR) + Format(LF);
Data.AddText(CustomerName);
end;
Cambiar longitud de una variable y rellenar con caracteres hacia la derecha hasta completar longitud:
En este ejemplo mostraremos el nombre del cliente, junto con su saldo que tendr谩 una longitud de 150 caracteres, sin embargo el dato ir谩 en los caracteres finales y el resto de caracteres lo completaremos con ceros, ‘0’.
Volveremos a usar la funci贸n de PadStr(Text, Integer [, Text]) : Text) : Text, y adem谩s necesitaremos las siguientes:
Text.MaxStrLen(Text) : Integer: Obtiene la longitud m谩xima definida de una variable de cadena.
Documentaci贸n Microsoft -> https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/text/text-maxstrlen-string-method
Text.StrLen(Text) : Integer: Obtiene la longitud de una cadena.
Documentaci贸n Microsoft -> https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/text/text-strlen-method
Calcularemos cuantos caracteres se quedan libres en nuestra cadena, restando la longitud de la variable a la longitud total de la variable. Rellenaremos con el caracter deseado esos caracteres y por 煤ltimo a帽adiremos nuestra variable con el dato que deseamos mostrar.
trigger OnAfterGetRecord()
var
BalanceLCY: Text[150];
begin
Clear(OutTxt);
Clear(BalanceLCY);
Customer.CalcFields("Balance (LCY)");
if Customer."Balance (LCY)" <> 0 then begin
BalanceLCY := Format(Customer."Balance (LCY)");
BalanceLCY := PadStr('', MaxStrLen(BalanceLCY) - StrLen(BalanceLCY), '0') + BalanceLCY;
OutTxt := Customer.Name + ' - ' + BalanceLCY + Format(CR) + Format(LF);
Data.AddText(OutTxt);
end;
end;
Os dejo por aqu铆 el c贸digo completo en un mismo bloque:
report 50002 "BBC Customer Document"
{
UsageCategory = ReportsAndAnalysis;
ApplicationArea = All;
ProcessingOnly = true;
UseRequestPage = false;
Caption = 'Create Customers Document', Comment = 'ESP="Crear documento clientes"';
dataset
{
dataitem(Customer; Customer)
{
trigger OnAfterGetRecord()
var
BalanceLCY: Text[150];
begin
Clear(OutTxt);
Clear(BalanceLCY);
Customer.CalcFields("Balance (LCY)");
if Customer."Balance (LCY)" <> 0 then begin
BalanceLCY := Format(Customer."Balance (LCY)");
BalanceLCY := PadStr('', MaxStrLen(BalanceLCY) - StrLen(BalanceLCY), '0') + BalanceLCY;
OutTxt := Customer.Name + ' - ' + BalanceLCY + Format(CR) + Format(LF);
Data.AddText(OutTxt);
end;
end;
}
}
trigger OnInitReport()
begin
ExternalFile := 'Documento Clientes.txt';
CR := 13;
LF := 10;
end;
trigger OnPostReport()
begin
Clear(OutStr);
TempBLOB.CreateOutStream(OutStr, TextEncoding::Windows); //*Creamos OutStream con encoding de Windows
Data.Write(OutStr); //*Cargamos los datos recopilados en nuestro BigText en variable OutStream
TempBLOB.CreateInStream(InStr, TextEncoding::Windows); //*Leemos los datos con la variable InStream
if not DownloadFromStream(InStr, '', '', '', ExternalFile) then //*Descargamos el fichero
exit;
end;
var
TempBlob: Codeunit "Temp Blob";
Data: BigText;
InStr: InStream;
OutStr: OutStream;
ExternalFile: Text;
OutTxt: Text;
CR, LF : Char;
}
Espero que os haya sido de utilidad馃槣.
Si no te qued贸 algo claro, o tienes alg煤n tipo de duda pod茅is dejarla en los comentarios o escribirnos a info@labibliotecadebc.com.
隆Ahora te toca a ti!馃槑
隆Un saludo!馃榿
LA BIBLIOTECA DE BC