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.
// 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>
}
}
}
};
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.
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"));
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?
// 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 < 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"));
}
}
}
};
*/
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 < numCampos; numCampo++)
{
if (tablaInfo.fieldBufferLen(numCampo) > 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 < numCampos; numCampo++ )
{
if (campos.indexOf(tablaInfo.fieldId(numCampo)) > -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 < numRegistros; numRegistro++ )
{
var registro = listaParam.readAt(numRegistro);
var registroJSON = {};
for (var numCampo = 0; numCampo < 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;
};