Limitar largo de string en exportacion


([N1] Spicer) #1

Amigos,

Estoy enredadísimo con una idiotez, pero me tiene tan picado que no logro dar con la solución.
Tengo una rejilla en la cual despliego un campo afanumérico #Descripción. Como al exportar a Excel (usando el script de abajo) queda muy largo, necesito restringirlo a 50 caracteres.

Pues bien, probé poniendo en la rejilla, contenido #left(#Descripcion,50) y en la pantalla se ve bien pero al exportar queda en 0
Quiero entonces hacer alguna modificación en el string pero no sé cómo ni dónde (no me manejo mucho en vJavaScript)

Por favor ayuda!

Mil gracias


// --------------------------------------------------------------------------------
// Exportar contenido de una rejilla a Excel
// ------------------------------------------------
var exportarExcel = function (rejilla)
{

var scriptVB;

// Solo se exporta si es una rejilla
var rejillaInfo = rejilla.objectInfo();
if (rejillaInfo.type() == VObjectInfo.TypeGrid)
{	
	// Preparar la senda del fichero y borrarlo si ya existe en disco
	importClass("VFile");
	
	var sendaFicheroExcel = ("c:/temp/" + rejillaInfo.name() + ".xls").split("/").join("\\");
	var ficheroExcel = new VFile(sendaFicheroExcel);
	if (ficheroExcel.exists)
	{
		ficheroExcel.remove();
	};
	
	
	// Leer las columnas de la rejilla
	var numColumnas = rejillaInfo.subObjectCount(VObjectInfo.TypeGridCol);
	var contenidoColumnas = [];
	var iconoCuerpoColumnas = [];
	var formatoLocalColumnas = [];
	
	for (var numColumna = 0; numColumna < numColumnas; numColumna++)
	{
		var columna = rejillaInfo.subObjectInfo( VObjectInfo.TypeGridCol, numColumna );

		// Preparar títulos de cabecera de las columnas
		//scriptVB += 'objSheet.Cells(1,' + ( numColumna + 1 ) + ').Value =' + '"' + columna.name() + '"' + '\r\n';
		scriptVB += columna.name() + '|';

		// Almacenar el contenido y el formato local de las columnas
		contenidoColumnas.push(columna.propertyData(9));
		iconoCuerpoColumnas.push(columna.propertyData(10));
		formatoLocalColumnas.push(columna.propertyData(21));
	};
	
	scriptVB += '\r\n';
		
	// Recorrer los registros obteniendo los datos de las columnas
	var numRegistros = theRegisterListIn.size();
	var fila = 1;
	for (var numRegistro = 0; numRegistro < numRegistros; numRegistro++)
	{
		// Preparamos el número de fila
		fila += 1;
		
		// Preparamos el registro para procesar sus columnas
		var registro = theRegisterListIn.readAt(numRegistro);
		for (numColumna = 0; numColumna < numColumnas; numColumna++)
		{
			// Voy a usar sólo los primeros 50 caracteres y además saco los :,| etc para que al pasarlo a Excel no se maree
			
			
			// Preparar el dato de la fila, columna
			var dato = "";
			if (formatoLocalColumnas[numColumna] == true)
			{
				dato = registro.fieldToDouble(contenidoColumnas[numColumna]);
				dato = dato.toLocaleString();
			}
			else 
			{
				if (iconoCuerpoColumnas[numColumna] == "")
				{
					dato = registro.fieldToString(contenidoColumnas[numColumna]);
				}
				else
				{
					dato = registro.fieldToString(contenidoColumnas[numColumna]+".NAME");
					
				};
				
				dato = dato.replace(/"/g, "'");
			};
			
			// Añadir el contenido de la columna al fichero
			// scriptVB += 'objSheet.Cells(' + fila + ',' + (numColumna + 1) + ').Value =' + '"' + dato + '"' + '\r\n';
			scriptVB += dato + '|';
		};
		
			scriptVB += '\r\n';
	};	
	
	// Completar el scriptVB para que se muestre la Excel generada
	// scriptVB += 'wss.sendkeys "%{tab 1}"' + '\r\n';
	
	// Guardar fichero scrtipVB
	importClass("VTextFile");

	var ficheroScrtipVB = new VTextFile("c:/temp/InformeProveedores.txt");
	 
	// Se abre el fichero en modo escritura, crea si no existe o limpia si existe
	if ( ficheroScrtipVB.open(VFile.OpenModeWriteOnly | VFile.OpenModeTruncate))
	{
		// Se guarda el script generado
		ficheroScrtipVB.write(scriptVB);
			 
		// Se cierra el fichero
		ficheroScrtipVB.close();
	};
	
	// Devuelve la senda del fichero Excel a generar
	return sendaFicheroExcel;
};

};


([N4] Infortic) #2

Prueba a crear un campo tipo fórmula alfabética llamado descripción corta con fórmula left(#Descripcion,50), y pones ese campo como Contenido de la columna de la rejilla.

Debería de funcionar.

El tema es que no evalúa las fórmulas al exportar, por eso al poner una fórmula como contenido de la rejilla te lo exporta a 0, sin embardo de la forma que te indico lo que exporta es un campo ya calculado.


([N1] wikan) #3

La documentación del script indica que no puedes usar fórmulas directas, solo campos en la rejilla para poder recoger el valor (por lo menos en la versión actual)

Haz lo que estás haciendo, pero en un campo fórmula de la tabla y este lo pones en la rejilla.

Si modificas el script perderás el reusarlo en otra rejilla.

Si lo que quieres es limitar el contenido, en el script la instrucción que recoje el dato de la celda es esta
columna.propertyData(9)
Límita lo que devuelve a 50 y lo tienes reusable a cualquier sitio.


([N1] Spicer) #4

Estimado,

Mil gracias por la respuesta. El punto es… ¿cómo limito a 50? Quiero invocar alguna función de cadenas, pero no logro entender dónde.

Gracias de nuevo


([N4] Infortic) #5

Hola Spicer

Si no quieres tocar el js

Creas un campo en la tabla:

ID: #DESC_CUT
TIPO: Fórmula alfabética
FORMULA: left(#DESCRIPCION, 50)

Y pones ese campo en la rejilla en lugar de el campo DESCRIPCION

Si quieres tocar el js, puedes usar cualquier función js, googleando las encuentras rápido, para trocear cadenas creo que es la función substring:

cadena.substring(inicio,fin);

En el caso del js que te ocupa, así a bote pronto, sin probarlo pienso que será algo así:

if (iconoCuerpoColumnas[numColumna] == “”)
{
dato = registro.fieldToString(contenidoColumnas[numColumna]).substring(0,49);
}

Como te digo, no lo he probado, pero por ahí van los tiros