Exportar todos los registros de todas las tablas


([N1] Spicer) #1

Amigos,

Nuevamente requiero su ayuda: he estado todo el día intentando hacer un script que exporte todos los registros de todas las tablas en CSV delimitado por “|” a un excel con el nombre de la tabla y así obtener una “plantilla” de la base de datos que sea fácil de leer por los usuarios.

He utilizado el tutorial vImp-ExpJS como ejemplo, todavía no consigo ni siquiera acceder a la lista de datos de una tabla.
No logro enlazar el proceso que lee todas y cada una de las tablas del proyecto con la función SetTable() para usar los métodos de la clase VRegisterList

Por favor su ayuda, estoy sumamente perdido y necesito esto pronto.


var theMainProject = theApp.mainProjectInfo();
var list = new VRegisterList(theRoot);

if ( theMainProject )
{

for( var nIndex=0; nIndex < theMainProject.allTableCount(); nIndex++ )
{
	
	if ( tableInfo )
		{
	
			var tableName = theMainProject.allTableInfo( nIndex ).name();
			var list.SetTable(tableName);
			
			// Montamos la cabecera
		for( var  field = 0; field < list.fieldCount(); field++ )
	{
		file += tableInfo.fieldId( field ).toLowerCase() ;
		if ( tableInfo.fieldCount() - 1 > field )
			file += "|";
	}
	// Añadimos fin de línea
	file += "\n";

	// Recorremos la lista montando el fichero
	for( var reg=0; reg < list.listSize(); reg++ )
	{
		var register = list.readAt( reg );
		
		if (register.isOK() )
		{
			
			for( var  field= 0; field < tableInfo.fieldCount(); field++ )
			{
				file += register.fieldToString( field );
				if ( field < table.fieldCount() - 1 )
					file += "|";
			}
			// Añadimos fin de línea
			if ( reg < list.listSize() - 1 )
				file += "\n";
		}
	}
	return file;
	}
}

}



([N1] wikan) #2

var tableName = theMainProject.allTableInfo( nIndex ).name();

usa .idRef()

Necesitas la dirección entera de la tabla, no el nombre


([N1] Spicer) #3

Estimado Wikan,

Hice lo que me sugieres, quedando así:


if ( theMainProject )
{

for( var nIndex=0; nIndex < theMainProject.allTableCount(); nIndex++ )
{
	
	var tableInfo = theMainProject.allTableInfo( nIndex ).IdRef();
	
			
	if ( tableInfo )
		{
	
											
			// Montamos la cabecera
		for( var  field = 0; field < list.fieldCount(); field++ )
	{
		file += tableInfo.fieldId( field ).toLowerCase() ;
		if ( tableInfo.fieldCount() - 1 > field )
			file += "|";
	}
	// Añadimos fin de línea
	file += "\n";

Sin embargo no funciona, recibo un error (foto adjunta).
En el fondo, no consigo enlazar la tabla con el TheRegisterList

Mil gracias



([N1] wikan) #4

Pero has desmontado todo.
No veo ningún setTable

Vete montandolo por partes:

  1. Obtén todas las tablas
  2. Carga una lista con todos los registros de cada tabla
  3. Crea una función que te devuelva el registro formateado, para guardar en un fichero por ejemplo.
  4. Guarda el resultado en un fichero.

([N1] Spicer) #5

Manuel,

El paso 2 es el que no logro hacer. Fijate que al hacer list.SetTable(tableInfo.IdRef) me devuelve vacío, y si le pongo IdRef() me da un error. Tengo entendido que IdRef es una función, no una propiedad… a menos que sean dos objetos distintos que se llaman igual.

Como sea, lo que no consigo es, a partir del objeto vTableInfo de una tabla, obtener una lista con sus registros. Luego de eso ya podría continuar

var list = new VRegisterList(theRoot);

for( var nIndex=0; nIndex < theMainProject.allTableCount(); nIndex++ )
{

	// Objeto vTableInfo de la tabla
	var tableInfo = theMainProject.allTableInfo( nIndex );

var AsigOk = list.setTable(tableInfo.Idref);


([N1] Spicer) #6

Bueno, parece que ya voy por el buen camino. El detalle es que la instrucción debe ser…

var Ref = tableInfo.idRef();

Es decir, es tableInfo.idRef() y no al revés (tableInfo.IdRef())

Les cuento cómo me va

Saludos


([N1] wikan) #7

Con el idRef de la tabla,
haz un:
`var list = new VRegisterList(theRoot);
list.setTable(idRef);
list.load(“ID”,[]); ->> revisa esto que lo estoy escribiendo de memoria

-> a partir de aquí, recorre cada registro y formatea la línea