armar cursor de dos tablas

401 views
Skip to first unread message

Gerardo

unread,
Dec 16, 2011, 7:32:50 AM12/16/11
to Mundo Visual FoxPro
Hola colegas, ¿cómo puedo armar esto?

tengo 2 tablas
- articulos (nombre, codigo)
- precios (codigo, precio) cada articulo puede tener de 0 a n
precios

con un select SQL yo logro este resultado:

articulo precio
MOUSE OPTICO 12
MOUSE OPTICO 15
MOUSE OPTICO 17
TECLADO 21
TECLADO 25
TECLADO 29

PERO, como logro armar un cursor para que muestre los datos así:
MOUSE OPTICO 12 15 17
TECLADO 21 25 29

desde ya gracias, saludos,
Gerardo.

Fabricio

unread,
Dec 16, 2011, 6:06:57 PM12/16/11
to Mundo Visual FoxPro
Lo que necesitas hacer es una consulta de referencia cruzada, para
ello te recomiendo que utilices el cursor generado en SQL, y con VFP
crees la consulta en mención, esta te genera un archivo .QPR, puedes
ejecutarlo con DO, o bien modificalo y copia la instrucción en la
parte de tu código para general la tabla que deseas.

VFP tiene el asistente para este tipo de consultas, debes indicar la
tabla, los campos que formaran las columnas, los campos que formaran
las filas, etc.

Saludos

Fabricio

Pablo Daniel

unread,
Dec 20, 2011, 8:44:22 AM12/20/11
to Mundo Visual FoxPro
Hola:

Te dejo una solución muy poco elegante. En el siguiente código "cur1"
hace referencia al cursor en el formato que ya lo conseguiste con el
SELECT:

***** Creación de la estructura del cursor de visualización. *****
SELECT TOP 1 COUNT(cur1.precio) as columnas FROM cur1 GROUP BY nombre
ORDER BY columnas DESC INTO CURSOR c_aux
LOCAL nColumnas as Integer
nColumnas = c_aux.columnas
USE IN c_aux

LOCAL cCursor as String, i as Integer
cCursor = "CREATE CURSOR cursor_visualizacion (nombre c(20)"

FOR i = 1 TO nColumnas
cCursor = cCursor + ", precio" + ALLTRIM(STR(i)) + " n(5,2) default
0"
ENDFOR
cCursor = cCursor + ")"
&cCursor


***** Pasaje de datos del cursor original al cursor de visualización.
*****
SELECT cursor_visualizacion
APPEND BLANK
SELECT cur1
GO TOP
replace nombre WITH cur1.nombre IN cursor_visualizacion

LOCAL campoPrecio as String
i = 1

SCAN
IF (ALLTRIM(UPPER(cur1.nombre)) <>
ALLTRIM(UPPER(cursor_visualizacion.nombre)))
SELECT cursor_visualizacion
APPEND BLANK
replace nombre WITH cur1.nombre IN cursor_visualizacion
SELECT cur1
i = 1
ENDIF

campoPrecio = "precio" + ALLTRIM(STR(i))
replace (campoPrecio) WITH cur1.precio IN cursor_visualizacion
i = i+1
ENDSCAN

SELECT cursor_visualizacion
BROWSE


Espero que te sirva, aunque probablemente la solución que ya te dio
Fabricio sea más eficiente.

Éxitos.
---------------------------------------------------------------------------------------------------

Reply all
Reply to author
Forward
0 new messages