Etiquetado: Extensiones VS Code
- Este debate tiene 4 respuestas, 3 mensajes y ha sido actualizado por última vez el hace 12 meses por
Cristina Nicolàs.
Respuestas del foro
-
Jaume EscribàParticipanteJaume EscribàTrabajando con extensiones con BC, he creado un proceso para importar datos desde un fichero plano.
Tengo la variable
var
Fichero: File;Al usar la variable con diferentes métodos como por ejemplo
while (Fichero.Read(Texte) <> 0) do begin
me da este error
The type or method ‘Read’ cannot be used for ‘Extension’ development.
Lo curioso es que si uso el inteligent, me propone los métodos que después da error.
Es un error del sistema o no se puede utilizar y debo utilizar otro tipo de variables
Gracias
15 enero 2019 a las 10:23 #7868
Cristina NicolàsSuperadministradorCristina NicolàsHola 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às15 enero 2019 a las 10:56 #7872
Jaume EscribàParticipante15 enero 2019 a las 13:57 #7874
igutierrezmParticipanteigutierrezmQue tal, tomé el ejemplo que se indica y lo pusé en un botón. Dentro de VS Code se resaltan algunos errores, este es el código completo:
pageextension 50101 ReadText extends «Posted Sales Invoice»
{
actions
{
addbefore(«&Electronic Document»)
{
group(«Addenda»)
{
CaptionML = ENU = ‘Addenda’, ESP = ‘Addenda’;
action(«Agregar addenda al XML»)
{
CaptionML = ENU = ‘Add addenda to XML’, ESP = ‘Agregar addenda al XML’;
image = CreateXMLFile;
Promoted = true;
PromotedCategory = Category5;
PromotedIsBig = true;
PromotedOnly = false;
}
}
}
}
var
FileDialogTitleText:Label ‘Import Presto .bc3 file’, Comment = ‘ESP=Importar archivo Presto .bc3′;
PrestoFileExtensionTok:Label’Presto Files(*.bc3)|*.bc3’, Comment = ‘ESP=ArchivosPresto (*.bc3)|*.bc3’;
FilePath:Text;
FileUploadErrorText:Label ‘The file could not be uploaded’, Comment = ‘ESP=No se ha podido cargar el archivo’;
UploadResult:Boolean;
PrestoInStream:InStream;
begin
UploadResult:=UploadIntoStream(FileDialogTitleText,>?, PrestoFileExtensionTok, FilePath, PrestoInStream);if not UploadResult then
Error(FileUploadErrorText);BC3Buffer.LoadDataFromStream(PrestoInStream);
procedure LoadDataFromStream(BC3InStream:InStream);
var
EncodingConverter:Codeunit ?;
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;
etLineContent(LineContent);
Insert();
end;
end;
}Distinguí los errores con cursiva y en negritas, las líneas donde presento dudas
25 enero 2020 a las 05:07 #14516
Cristina NicolàsSuperadministradorCristina NicolàsHola,
el begin te da error porque no puede ir ahí. Falta la declaración de un procedimiento o un trigger.
Y el «Line No.» te da error porque estás utilizando la tabla «Sales Invoice Header» (por el hecho de estar en la página «Posted Sales Invoice») y esta tabla no tiene ningún campo llamado «Line No.».Un saludo,
Cristina Nicolàs30 enero 2020 a las 10:17 #14547
Debe iniciar sesión para responder a este tema.