Página 1
XXIII Javascript.
Exportar datos de todas las tablas.
En este capítulo vamos a ver la forma de incluir código javascript en nuestros programas Velneo. Hay momentos en que la programación sólo con las herramientas de Velneo se queda corta y puede ser necesario el uso de javascript.
No se trata de un curso de javascript sino de ver la forma de incorporarlo a Velneo.
Vimos en capítulos anteriores la exportación/importación del contenido de las tablas a ficheros de texto. Con la programación nativa en Velneo deberemos hacer un programa para cada tabla.
En este capítulo vamos a diseñar un programa que nos permitirá la exportación de los datos de cualquier tabla del proyecto o de los proyectos heredados.
Básicamente su funcionamiento consiste en una rejilla que nos muestra todas las tablas. Al seleccionar una de ellas nos pide confirmación y realiza la exportación.
Página 2 Podemos trabajar sobre un proyecto ya creado pero en este caso empezaremos creando un proyecto de aplicación y otro de datos:
Es fundamental que todos los proyectos implicados tengan un alias.
En el proyecto de datos añadiremos a las tablas que haya, una más, a la que le vamos a llamar TABLAS y cuya descripción es:
Página 3 Como podemos ver sólo tiene un código, un campo con el nombre de la tabla y otro para guardar el nombre del proyecto y la tabla de la forma ALIAS/NOMBRETABLA tal y como puede verse en la primera ilustración.
En mi caso y para pruebas e incluido un par más de tablas. Tú puedes hacer lo mismo o heredar algún proyecto.
En dichas tablas he colocado campos texto, numéricos y de fecha que son los que en principio exportaremos con el programa. Los campos objeto, imagen etc no los abordaremos.
En nuestro proyecto de aplicación colocaremos los elementos siguientes:
Página 4 Lo primero crearemos una búsqueda:
Luego el formulario TABLA_EXPORTAR:
Más tarde volveremos sobre él para añadir un manejador de evento en el botón aceptar.
Creamos a continuación la rejilla sobre la tabla TABLAS:
Página 5 En formulario de modificación ponemos el formulario creado anteriormente.
Pasamos ahora, a crear el formulario EXPORTAR que contendrá una vista de datos.
Página 6 Creamos ahora una acción que PROVISIONALMENTE colocaremos en el menú de la aplicación para comprobar que vemos el formulario EXPORTAR:
Más tarde esta acción la cambiaremos de sitio.
Bueno. Llegados a este punto vamos a crear un proceso en javascript que va a hacer dos cosas. Primero localizar en que proyecto se encuentra la tabla TABLAS y después grabar en ella los nombres de todas las tablas de nuestro proyecto.
Para ello vamos a la ventana de inspectores y en la solapa Scripts creamos un nuevo fichero
Usando F2 le damos el nombre
Pulsa 2 veces sobre el nombre y escribe dentro del fichero el código siguiente:
Página 7 //Localizamos donde se halla la tabla TABLAS
var proyecto = theApp.mainProjectInfo();
var alias_proyectoTablas="";
var resultado = proyectos_info( proyecto );
//REPETIMOS el proceso anterior buscando las tablas de todos // los proyectos y grabamos su alias/nombre y nombre en TABLAS var proyectoencurso;
proyecto = theApp.mainProjectInfo();
var reg = new VRegister( theRoot );
reg.setTable(alias_proyectoTablas+"/TABLAS");
var resultado = proyectos_info_otravez( proyecto );
function proyectos_info( proyecto ) {
// Se analiza si el proyecto tiene otros proyectos heredados var num_pry_heredados = proyecto.legacyProjectCount();
// Por cada proyecto heredado se ejecuta la función de forma reentrante // hasta procesar todos los proyectos
for ( var x=0; x<num_pry_heredados; x++ )
{
var proyecto_heredado = proyecto.legacyProjectInfo( x );
proyectoencurso=proyecto_heredado;
localizar_tablas(proyecto_heredado);
resultado = proyectos_info( proyecto_heredado );
}
}
function localizar_tablas( miproyecto ) {
for( var nIndex=0; nIndex < miproyecto.tableCount(); nIndex++ ) {
var infortabla = miproyecto.allTableInfo( nIndex );
if(infortabla.id()=="TABLAS"){
alias_proyectoTablas=proyectoencurso.alias();
}
} }
function proyectos_info_otravez( proyecto ) {
var num_pry_heredados = proyecto.legacyProjectCount();
for ( var x=0; x<num_pry_heredados; x++ )
{
var proyecto_heredado = proyecto.legacyProjectInfo( x );
proyectoencurso=proyecto_heredado;
localizar_todas_lastablas(proyecto_heredado);
resultado = proyectos_info_otravez( proyecto_heredado );
}
}
function localizar_todas_lastablas( miproyecto ) {
//obtenemos las tablas
for( var nIndex=0; nIndex < miproyecto.tableCount(); nIndex++ ) {
var infortabla = miproyecto.allTableInfo( nIndex );
if ( theRoot.beginTrans( "Alta " + nIndex ) )
{
var infortabla = miproyecto.allTableInfo( nIndex );
nombre=infortabla.id();
aliast=miproyecto.alias()+"/"+nombre;
reg.setField( "NAME", nombre );
reg.setField( "NOMBRE_COMPLETO", aliast );
reg.addRegister();
theRegisterListOut.append( reg );
theRoot.commitTrans();
}
} }
Página 8 Como siempre el código se puede depurar un poco más, pero este funciona.
Nos quedará algo así (no pongo en la imagen todo el código):
Creamos ahora un proceso indicando que será en javascript y le asignamos nuestro fichero en las propiedades:
Ahora creamos un nuevo proceso llamado EXPORTAR con el siguiente contenido:
Página 9 Quitamos del menú principal la acción VER_TABLAS y la sustituimos por la siguiente:
Si ahora ejecutamos nuestro programa deberíamos obtener una rejilla con las tablas de nuestro proyecto y los heredados. En mi caso tras heredar alguna caja para probar queda esto:
Página 10 Al pulsar dos veces sobre una fila obtendremos:
Solo nos queda incorporar un manejador de evento en Javascript en el formulario TABLA_EXPORTAR que se dispare al pulsar el botón Aceptar y pase los registros de la tabla seleccionada a un fichero de texto.
Vamos allá:
Página 11 El código será el siguiente:
importClass( "VFile" );
importClass( "VTextFile" );
//Accedemos al root del formulario en curso var formulario = theRoot.dataView();
var formu=theRoot.objectInfo();
// Accedemos al control del nombre de la tabla.
// Se resuelve con el identificador del control
mitabla = formulario.control("ED_NAME_COMPLETO");
nombretabla=mitabla.text;
//alert(nombretabla);
// Asociamos el contenido de la tabla a un VRegister var reg = new VRegisterList( theRoot );
reg.setTable(nombretabla);
reg.load("ID",[]);
//obtenemos el numero de registros y de campos numreg = reg.size();
var infortabla=reg.tableInfo();
numcampos=infortabla.fieldCount();
msg=nombretabla+" registros= "+numreg+" : \n"+numcampos+"\n";
//alert(msg);
// Se declara el objeto fichero var nf=nombretabla.replace("/","_");
var fi = new VTextFile("e:\\"+nf+".txt" );
// Se abre el fichero de escritura (si no existe se crea y si existe se limpia) if ( fi.open( VFile.OpenModeWriteOnly | VFile.OpenModeTruncate) ) {
//alert("abierto");
var linea;
for( var i=0; i < numreg; i++ ) {
var reg1 =reg.readAt( i );
linea="";
for( var c=0; c < numcampos; c++ )
{
msg=msg+infortabla.fieldName(c)+"="+reg1.fieldToString(c)+"\n";
linea=linea+reg1.fieldToString(c)+"|";
}
var l=linea.length;
l=l-1;
linea=linea.substring(0,l);
fi.write(linea+"\n");
}
//alert(msg);
fi.close();
alert("fichero generado con: "+numreg+" registros");
} else {
// Si no ha sido posible abrir el fichero se muestra error
alert( "No se pudo abrir el ficher " + fi.fileName() + ", error " + fi.error(), "Error" );
}
theRoot.dataView().accept();
En este caso le he dicho que cree el fichero en el disco E: (línea en rojo).
Sólo queda conectar el botón ACEPTAR con el manejador.
Página 12 Guardamos el proyecto y ejecutamos
En mi caso si escojo la tabla TABLAS obtengo:
El fichero creado visto con el WordPad es:
Página 13 Mi TABLA1 con el contenido
Queda así.