Etiquetado: 

  • Este debate tiene 4 respuestas, 3 mensajes y ha sido actualizado por última vez el hace 8 meses, 4 semanas por AvatarCristina Nicolàs.
Viendo 5 entradas - de la 1 a la 5 (de un total de 5)

Respuestas del foro


  • Avatar
    Jaume Escribà
    Participante
    Jaume 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

     

    #7868
    Avatar
    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
    Avatar
    Jaume Escribà
    Participante
    Jaume Escribà

    Gracias, me funciona correctamente utilizando la tabla “CSV Buffer”.

    #7874
    Avatar
    igutierrezm
    Participante
    igutierrezm

    Que 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

     

     

     

    #14516
    Avatar
    Cristina Nicolàs
    Superadministrador
    Cristina Nicolàs

    Hola,

    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às

    #14547
Viendo 5 entradas - de la 1 a la 5 (de un total de 5)

Debe iniciar sesión para responder a este tema.