Cristina Nicolàs
Superadministrador
Cristina Nicolàs

Hola Jaume,

En este caso el problema es que la función que utilizas está marca como Interna. De ahí que te diga que no se puede utilizar en el desarrollo de extensiones.

Si tu desarrollo es para una instalación on-premise, puedes poner en el app.json el parámetro target:”internal” y asegurarte que el servicio tiene también esta opción seleccionada y entonces ya podrás utilizar estas opciones.

O puedes hacer el desarrollo distinto para no tener que utilizar funciones que están marcadas como internas.

Yo recientemente he hecho un desarrollo de extensión en el que tenía que leer un fichero plano desde el cliente web y desde el cloud. Empecé igual que tu, utilizando una variable de tipo File, y fui probando varias cosas hasta que di con la forma de hacerlo.

Y al final acabo utilizando una variable de tipo InStream

var
FileDialogTitleTxt: Label ‘Import Presto .bc3 file’, Comment = ‘ESP=Importar archivo Presto .bc3’;
PrestoFileExtensionTok: Label ‘Presto Files (*.bc3)|*.bc3’, Comment = ‘ESP=Archivos Presto (*.bc3)|*.bc3’;
FilePath: Text;
FileUploadErrorTxt: Label ‘The file could not be uploaded’, Comment = ‘ESP=No se ha podido cargar el archivo’;
UploadResult: Boolean;
PrestoInStream: InStream;
begin
UploadResult := UploadIntoStream(FileDialogTitleTxt, ”, PrestoFileExtensionTok, FilePath, PrestoInStream);

if not UploadResult then
Error(FileUploadErrorTxt);

BC3Buffer.LoadDataFromStream(PrestoInStream);

Con este primer código se le solicita al usuario que seleccione un fichero y éste se carga en la variable PrestoInStream.

Y después con esta función leo el InStream y voy insertando cada línea que leo en una tabla temporal que me he creado (BC3Buffer es una tabla que he creado yo):

procedure LoadDataFromStream(BC3InStream: InStream);
var
EncodingConverter: Codeunit “Encoding Converter”;
LineContent: Text;
CurrentLineNo: Integer;
begin
DeleteAll();
while not BC3InStream.EOS() do begin
BC3InStream.ReadText(LineContent);
LineContent := EncodingConverter.ChangeInImport(LineContent);

CurrentLineNo += 1;
Init();
“Line No.” := CurrentLineNo;
SetLineContent(LineContent);
Insert();
end;
end;

Lo de EncodingConverter.ChangeInImport es la típica función Ascii2Ansi y Ansi2Ascii, a las que les cambié el nombre en un momento dado porque nunca soy capaz de recordar cual es la que se utiliza al importar y cual al exportar.

Y la función SetLineContent es porque en mi tabla, en lugar de tener un campo de Texto de 250 donde guardar la lectura de cada línea, tengo un campo de tipo Blob. Lo he tenido que hacer así porque en el archivo que importo hay líneas de más de 250 caracteres.

Una vez lo tengo todo importado en tabla temporal, después recorro la tabla temporal para procesarla.

Otra opción que utilicé al principio es la de cargar los datos en una tabla del estándar llamada “CSV Buffer”, que ya implementa esta función LoadDataFromStream y que además ya hace un Split de las líneas leídas en función del caracter separador que le dices que tiene que utilizar.
Al final no me sirvió porqué también tengo en el fichero columnas más largas que los campos de CSV Buffer, y no quería que me las cortase.

Espero que te sirva la información.

Un saludo,
Cristina Nicolàs

#7872