miércoles, 11 de mayo de 2011

Excel Buffer

El Excel buffer es una tabla del estándar de Navision que se emplea para importar o exportar datos de una hoja excell. Lo que vamos a hacer es una especificación bastante básica de esta tabla y como se puede importar o exportar información. El único problema que tiene y me parece un poco grave es la concurrencia de diferentes usuarios a la vez .

Campos tabla
Para mí los principales campos de las tablas son:

Row No. Integer
xlRowID Text 10
Column No. Integer
xlColID Text 10
Cell Value as Text Text 250

“Row no.” es el campo donde se especifica la línea del Excel que vamos a procesar y en su on validate tiene código que actualiza el xlRowID que es la referencia que se utiliza en el excell.

“Column No.” Funciona exactamente igual que el Row no. Lo único que en su campo xLColID escribe la letra de la columna en vez del número de la misma.
“Cell Value as text” es el campo donde se guarda el contenido de la celda que queremos tratar y se guarda siempre como text.


Principales funciones

CreateBook: Crea un nuevo libro Excel y usa como parámetro ruta y nombre del fichero y nombre para la hoja que compone el documento.

OpenBook: Abre un documento de Excel y como parámetro se le introduce el documento Excel y la hoja que queremos abrir.

ReadSheet: lee las hojas que contiene el documento Excel y devuelve como parámetro el nombre de las mismas, se puede utilizar como parámetro de la función “ OpenBook”. Introduce direcatamente los registros leídos en la tabla ExcelBuffer.

CreateSheet: Crea la hoja del documento Excel y al igual que la “ReadSheet” se puede utilizar como parámetro de la función “CreateBook”.

SelectSheetsName: Saca una ventana de diálogo con cada una de las hojas que componen el libro Excel y asi seleccionar cual se quiere leer.

Para importar

Vamos a importar a una tabla de Navision la información de una hoja de Excel. En la tabla solo volcaremos la información que nos interese de esa tabla.
Lo primero que hay que hacer es volcar los datos a la tabla Excel buffer y de ahí leer esos datos y pasarlos a la tabla que nos interese. Una vez bloqueada la tabla Excel buffer ya podemos trabajar con ella.

CLEAR(rExcelBuffer);
rExcelBuffer.OpenBook(“rutafichero”,rExcelBuffer.SelectSheetsName(rutafichero));
rExcelBuffer.ReadSheet();

Una vez que lo tenemos importado todos los datos en la tabla Excel buffer vamos a leerlos y utilizar los que nos interesen para volcarlos en nuestra tabla.

//sacamos el último nº de fila y columna para determinar hasta donde tenemos que leer, en este caso hemos puesto todo lo que hay volcado.

IF rExcelBuffer.FINDLAST THEN BEGIN
vUltimaFila:=rExcelBuffer."Row No.";
vUltimaCol:=rExcelBuffer."Column No.";
END;

//Recorremos los registros desde donde nos interese hasta el final que hemos determinado anteriormente y en función de la columna que sea sabemos que es un campo u otro y lo asignamos a una variable que luego utilizaremos para cargar la tabla

FOR vIndice := 3 TO vUltimaFila DO BEGIN
rExcelBuffer.SETRANGE("Row No.",vIndice);
IF rExcelBuffer.FINDFIRST THEN REPEAT
CASE rExcelBuffer."Column No." OF
2:vNtraking:=DELCHR(rExcelBuffer."Cell Value as Text",'=','.');

rTabla.init;
rTabla.”Numero traking” := vNtraking;
rTabla.Insert;

//por úlitmo se cierra el bucle y elminamos los registros ya leidos y procesados
END;
CLEAR(rExcelBuffer);
rExcelBuffer.DELETEALL;

Para Exportar
Al igual que en la exportación lo primero es meter en la tabla excell buffer lo uqe nos interesa para luego exportarlo.

//lo que hacemos es recorrer una tabla de dos campos únicamente e insertar un registro por columna la primera sería 1,1 la segunda 1,2 la siguiente 2,1…N,2, con el bucle for le dicemiso que inserte una línea por columna y fuera actualiza el numero de línea

rExcel.DELETEALL;
vFila:=1;
IF FINDSET THEN REPEAT
rExcel.INIT;
rExcel.VALIDATE("Row No.",vFila);
FOR vIndex :=1 TO 2 DO BEGIN
rExcel.VALIDATE("Column No.",vIndex);
IF vIndex = 1 THEN
rExcel."Cell Value as Text":=FORMAT("Server Name");
IF vIndex = 2 THEN
rExcel."Cell Value as Text":=FORMAT("My Server");
IF rExcel.INSERT THEN;
END;
vFila+=1;
UNTIL NEXT = 0;

//Para mostrar esto en un Excel abrimos un libro creado y creamos la hoja y finalmente mostramos el documento abierto

rExcel.OpenBook('c:\a.xls',rExcel.SelectSheetsName('c:\a.xls'));
rExcel.CreateSheet('Hoja1','Hoja1',COMPANYNAME,USERID);
rExcel.GiveUserControl();
o también


rExcelB.CreateBook;
rExcelB.CreateSheet('NombreHoja','PurchDocs',COMPANYNAME(),USERID());
rExcelB.GiveUserControl();

4 comentarios:

  1. hola amigo que tal para importar de una hoja de excel a la tabla la variable de vNtracking para que sirvee? SALUDOS CORDIALES :)

    ResponderEliminar
    Respuestas
    1. Hola
      solamente es un ejemplo de asignación a una variable que he llamado vNtracking ,porque era un ejemplo que tenía hecho,del valor traido de la tabla excel buffer y luego en una tabla cualquiera le asigno al campo tracking(ejemplo también) el valor de esa variable. es solamente una manera de asignar a una variable un valor que luego se lleva a un campo de tabla. espero haberte sido de ayuda.

      un saludo.

      Eliminar
  2. Hola,

    ¿si quiero crear varias hojas en un mismo libro como tendría que hacerlo?

    ResponderEliminar
    Respuestas
    1. Hola David

      Este post te pude resultar muy util.

      http://www.mibuso.com/forum/viewtopic.php?t=61861

      Un saludo.

      Eliminar