Exportar todas las tablas a JSON


([N1] tcvsi) #1

Hola a todos, estoy intentando hacer un proceso que exporte el contenido de todas las tablas a JSON aprovechando la exportación que utiliza velneo desde alguna de sus rejillas. El tema es que quiero hacerlo por un único proceso que recorra todas las tablas y por cada una lance una exportación. Mis conocimientos de JS son limitados, aunque poco a poco intento incrementarlos.

HE hecho un proceso que recorre todas las tablas e incluso excluye las tablas de memoria. pero no me aclaro en como tengo que cargar la lista(aunque utilizo la funcion load de vregisterlist), en como seleccionar un indice y en que parametros pasarle a la función de exportación. Casi nada.

Pego el código por si alguien quiere darme algo de luz. No pido que me escribáis la solución, pero si decirme como utilizar las funciones precisas. O algún ejemplo similar para que pueda fijarme.

Gracias

#include “56arj7p5.vcd/js/database/velneoExportarJSONbatch.js” //

// PROCESO: Se leen todas las tablas de la aplicación incluídas las heredadas
	indice = 0;
	ok = false;
    proyectoPrincipal = theApp.mainProjectInfo();
	theApp.mainProjectInfo
    if (proyectoPrincipal) {
        for (indice; indice < proyectoPrincipal.allTableCount(); indice += 1) {

            // Leer la información de la tabla y el idRef
            tablaInfo = proyectoPrincipal.allTableInfo(indice);
            tabla = tablaInfo.idRef();
			memoria = tablaInfo.isInMemory();				
			if (memoria === false){					
				// Exportación a JSON
				var lista = new VRegisterList(theRoot);
				<strong>var ok = lista.load("ID",[]);</strong>
				if (ok === true){
				<strong>var json = listaExportarJSON(lista, tabla, [tabla], heApp.globalVarToString("1.0"));</strong>
					}								
			}


        }		
    };

([N1] desarrollo) #2

Buenas!

Quizá una solución a esto que planteas pueda ser el nuevo API REST que sirve Velneo desde la 7.19…
No solo sirve el contenido de las tablas que especifiques como accesibles, sino también datos que pueden provenir de búsquedas y procesos. Y tiene una sintaxis muy potente y sencilla que te sirve todo en JSON.

Para los que, como yo, queremos saber lo imprescindible de JS es una estupenda solución.

Saludos,

César


([N1] tcvsi) #3

Agradezco tu idea. Tan solo que si no me equivoco el API REST necesita de vModApache, además que viene en el vERP. Demasiado para mi nivel.

Saludos


([N1] wikan) #4

Buenas Tomás

Así leyendo veo que te falta indicarle a la lista, qué tabla tiene que cargar. En la última línea te falta una t en theApp pero es lo de menos.

var lista = new VRegisterList(theRoot);
lista.setTable(tabla ); // Te falta esto
var ok = lista.load("ID"”,[]);
if (ok === true){
var json = listaExportarJSON(lista, tabla, [tabla], theApp.globalVarToString("1.0"));

([N1] tcvsi) #5

Al final he imprmentado el siguiente JS para exportar todas las tablas a JSON. PArece que funciona, pero es increiblemente lento. Cuando llega a la tabla de codigos postales se queda clavado. No quiero pensar que pasaría si llega a una tabla con decenas de miles de registros.
Os adjunto el codigo. Como vereis he añadido que el indice que se procesa es el primero que se encuentra, porque no todas las tablas tienen indice ID.

¿Siempre es así de lento o se puede optimizar? ¿Hago algo mal?

#include “56arj7p5.vcd/js/database/velneoExportarJSONbatch.js”

// PROCESO: Se leen todas las tablas de la aplicación incluídas las heredadas
	numTabla = 0;
	ok = false;
    proyectoPrincipal = theApp.mainProjectInfo();
	theApp.mainProjectInfo
    if (proyectoPrincipal) {
        for (numTabla; numTabla &lt; proyectoPrincipal.allTableCount(); numTabla += 1) {

            // Leer la información de la tabla y el idRef
            tablaInfo = proyectoPrincipal.allTableInfo(numTabla);				
            tabla = tablaInfo.idRef();
			indiceRef = tablaInfo.indexId(0); // recojo el primer indice 				
			memoria = tablaInfo.isInMemory();
			
			// Proceso las tablas en disco. Excluyo las tablas en memoria
			if (memoria === false){					
				// Exportación a JSON
				var lista = new VRegisterList(theRoot);
				lista.setTable(tabla);
				var ok = lista.load(indiceRef,[]);
				
				if (ok === true){				
					var json = listaExportarJSON(lista, indiceRef, [], theApp.constant("aplicacion_app/APP_VERSION"));
					}
							
			}
        }		
    };

([N1] wikan) #6

Habría que ver el código de la función listaExportarJSON


([N1] tcvsi) #7

Es el mismo que velneo aporta

importClass(“VFile”);
importClass(“VTextFile”);

/*


  • Exportar una lista de registros a formato JSON

*/
function listaExportarJSON(listaParam, indiceIdParam, indicePartesParam, versionParam, camposParam)
{
// ------------------------------------------
// Preparamos las variables de trabajo
// ------------------------------------------
var tablaInfo = listaParam.tableInfo();
var tablaIdRef = tablaInfo.idRef();
var numCampos = tablaInfo.fieldCount();
var numRegistros = listaParam.size();
var ficheroJSON = [];
var datosJSON = [];
var camposExportar = [];

// ------------------------------
// Generar cabecera JSON
// ------------------------------
ficheroJSON.push({ "tablaIdRef"   : tablaIdRef,
				   "indiceId"     : indiceIdParam,
				   "indicePartes" : indicePartesParam,
				   "version"      : versionParam,
				   "numRegistros" : numRegistros });

// -------------------------------------------
// Seleccionamos los campos a exportar
// -------------------------------------------
if (camposParam === undefined) {
	for (var numCampo = 0; numCampo &lt; numCampos; numCampo++)
	{
		if (tablaInfo.fieldBufferLen(numCampo) &gt; 0) {
			camposExportar.push({campoId: tablaInfo.fieldId(numCampo), campoTipo: tablaInfo.fieldType(numCampo), campoTipoObjeto: tablaInfo.fieldObjectType(numCampo)});
		};
    };
} else {
    campos = camposParam.toUpperCase().split(",");
	for (var numCampo = 0; numCampo &lt; numCampos; numCampo++ )
	{
        if (campos.indexOf(tablaInfo.fieldId(numCampo)) &gt; -1) {
            camposExportar.push({campoId: tablaInfo.fieldId(numCampo), campoTipo: tablaInfo.fieldType(numCampo), campoTipoObjeto: tablaInfo.fieldObjectType(numCampo)});
        };
    };
};

// -----------------------------------------------------------------
// Se recorren los registros de la lista generando el JSON
// -----------------------------------------------------------------
numCampos = camposExportar.length;
for (var numRegistro = 0; numRegistro &lt; numRegistros; numRegistro++ )
{
    var registro = listaParam.readAt(numRegistro);
    var registroJSON = {};
	for (var numCampo = 0; numCampo &lt; numCampos; numCampo++ )
	{
        registroJSON[camposExportar[numCampo].campoId] = mapearCampo(camposExportar[numCampo].campoId, camposExportar[numCampo].campoTipo, camposExportar[numCampo].campoTipoObjeto, registro);
    };
    datosJSON.push(registroJSON);
};

// -------------------------------------------
// Preparar objeto JSON con los datos
// -------------------------------------------
ficheroJSON.push({ "datos" : datosJSON });

// ----------------------------
// Exportar JSON a disco
// ----------------------------
var resultadoJSONString = JSON.stringify(ficheroJSON, null, "\t");
var senda = theApp.clientCachePath() + tablaInfo.id() + "_" + versionParam.replace(".","_") + ".json";
var fichero = new VTextFile(senda);
 
// Se abre el fichero en modo escritura. Crea si no existe o limpia si existe
if (fichero.open(VFile.OpenModeWriteOnly | VFile.OpenModeTruncate))
{
	// Grabar contenido JSON
	fichero.setCodec("UTF-8");
	fichero.write(resultadoJSONString); 

	// Se cierra el fichero
	fichero.close();
	
	// Mensaje de confirmación de exportación correcta
	//alert("Se han exportado correctamente " + numRegistros + " registro(s) de la tabla " + tablaInfo.name());
} else
{
	// Si no ha sido posible abrir el fichero se muestra error
	//alert( "No se pudo abrir el ficher " + fichero.fileName() + ", error " + fichero.error(), "Error" );
};

// Retornar el JSON
return(resultadoJSONString);

};

// ------------------
// Mapear campos
// ------------------
function mapearCampo(campoId, campoTipo, campoTipoObjeto, registro)
{
// Se lee el valor del campo en función del tipo
var valor = “”;
switch (campoTipo)
{
case VTableInfo.FieldTypeAlpha256:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.FieldTypeAlpha128:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.FieldTypeAlpha64:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.FieldTypeAlpha40:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.FieldTypeAlphaLatin1:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.FieldTypeAlphaUtf16:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.FieldTypeNumeric:
valor = registro.fieldToDouble(campoId);
break;
case VTableInfo.FieldTypeDate:
valor = registro.fieldToString(campoId).split("/").reverse().join("-");
break;
case VTableInfo.FieldTypeTime:
valor = registro.fieldToTime(campoId);
break;
case VTableInfo.FieldTypeDateTime:
valor = registro.fieldToDateTime(campoId);
break;
case VTableInfo.FieldTypeBool:
valor = registro.fieldToBool(campoId);
break;
case VTableInfo.FieldTypeObject:
switch (campoTipoObjeto)
{
case VTableInfo.ObjectTypeText:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.ObjectTypeRichText:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.ObjectTypeFormula:
valor = registro.fieldToString(campoId);
break;
case VTableInfo.ObjectTypePicture:
valor = “”;
break;
};
break;
case VTableInfo.FieldTypeVirtualBind:
valor = registro.fieldToString(campoId);
break;
default:
valor = registro.fieldToString(campoId);
break;
};

// Devolver el valor del campo
return(valor);

};


([N1] wikan) #8

Solo me queda decirte que le hagas un debug para ver donde está la lentitud. ¿El servidor es en cloud?


([N1] tcvsi) #9

Si, lo ejecuto en cloud. Quizas ejecutarlo en 3º o 4º plano, no lo he meditado aún, así que igual digo una tontería


([N1] wikan) #10

Tienes que ejecutarlo en 1º plano para poner tener los ficheros.

Depurarlo para ver donde se pierde tiempo.