Documente Academic
Documente Profesional
Documente Cultură
Un requerimiento habitual cuando trabajamos con datos, independientemente de su origen, es poder agregar "al vuelo" columnas adicionales al resultado. Esto es muy sencillo si slo se necesita una columna en blanco, basta con definirla directamente en la consulta utilizando la funcin SPACE(), de esta forma:
Vladimir Andropovitch 3
1111.65 654.32
Si necesitamos concatenar las columnas del nombre para crear un "nombre completo", entonces, podemos hacer algo como esto:
SELECT (ALLTRIM( cfirst ) + " " + ALLTRIM( clast )) AS fullname FROM sample
Aunque, en la prctica esto no es tan intuitivo como se puede ver a simple vista. La cuestin aqu es que cuando creamos una "columna computada" (que es lo que yo hago aqu) VFP crea la definicin para esa columna basado en la longitud de las columnas existentes en la concatenacin. Entonces, si ambos campos "cfirst" y "clast" se definen como c(20), el resultado se define con un campo que tenga c(41). En otras palabras, los 20 caracteres para el primer campo, uno para el espacio y 20 caracteres para cada campo. Esto est bien, aunque puede ser una prdida de espacio; pero no provocar prdida de datos y si deseamos en realidad acortarlos, podemos simplemente utilizar la funcin PADR() para forzar el ancho de un valor especfico:
SELECT PADR( ALLTRIM( cfirst ) + " " + ALLTRIM( clast ), 30) AS fullname FROM sample
Sin embargo, si adems estamos convirtiendo tipos de datos (de nmeros a caracteres, por ejemplo), entonces tendremos un problema potencia debido a que en este caso VFP no conoce de qu largo pudieran ser los datos. Todo lo que puede hacer es basarse en la definicin del tamao del primer elemento encontrado. Entonces, la consulta siguiente:
SELECT CAST( ALLTRIM( cFirst ) + " " + ALLTRIM( cLast ), AS CHAR(30)) AS fullName FROM sample
y la segunda:
Asumiendo que tenemos 100 registros en la primera tabla y 1000 registros en la segunda, podramos generar un resultado que contenga 100,000 registros. Suena como un error, verdad? Entonces, cmo puede esto ayudarnos a crear una columna para datos enteros? Bueno, si creamos un cursor llamado "dummy" (ficticio) que tiene una nica columna (definida como un entero). Entonces, aadimos un registro vaco al cursor e incluimos "dummy" en la lista FROM de la consulta sin especificar una condicin de unin, forzamos que todas las columnas del cursor ficticio sean agregadas incondicionalmente al conjunto resultante con una columna extra, para valores enteros, que se llama con el nombre que le hayamos dado en el cursor ficticio. De esta forma:
CREATE CURSOR dummy ( newint I ) INSERT INTO dummy VALUES (0) SELECT * FROM sample, dummy
El mismo truco puede ser utilizado para agregar al conjunto resultante, campos MEMO, GENERAL o incluso cualquier columna, para cualquier tipo de datos. Sin embargo, utilizando VFP 9.0 no tendremos ms necesidad de emplear este truco, gracias, una vez ms a la funcin CAST(). Al utilizar esta funcin podemos simplemente decirle a VFP que cree el tipo de columna que necesitamos:
SELECT * FROM sample INTO CURSOR temp USE DBF( "temp" ) AGAIN IN 0 ALIAS cur_readwrite SELECT cur_readwrite USE IN temp
La versin 7.0 de VFP introdujo la clasula READWRITE al lenguaje, la que dice a VFP que cree directamente un cursor tipo lectura-escritura:
Y ahora lo utilizo siempre que sea posible. Sin embargo, como recordaba hace unos das, es importante conocer los viejos trucos ya que tenemos alguna aplicacin funcionando en FoxPro 2.6 para un cliente y la va ms sencilla para controlar el problema era utilizar un cursor del tipo lectura-escritura, por supuesto, en FoxPro 2.6 no lo poda hacer ... excepto utilizando el truco mostrado antes.