Como manejar into cursor nombre_cursor

Mi nombre es Rocío. He hecho algunas consultas y al final las guardar en un cursor para poder manejar los datos de las consultas ya sea en formularios, reportes, etc.
Lo que sucede es que a la hora de ejecutar mi programa me manda el siguiente error:
Error del programa
"no se encuentra el alias nombre_cursor"
Es hasta que le digo "pasar por alto" cuando ya no me vuelve a mostrar el error.
Como manejo el into cursor nombre_cursor
o into table nombre_tabla

1 Respuesta

Respuesta
1
Tus selects deben verse algo así:
select * from tabla ... bla bla bla ... into cursor miCursor
Fijate que el nombre no va entre comillas ni tiene porque existir con anterioridad...para poner el cursor en uso, ejecuta
select miCursor
Tu cursor no se creara si el select no se ejecuta y se destruye automáticamente al cerrarse.
El select into table es diferente ya que te crea una estructura permanente en disco...el codigo seria...
select * from tabla ... bla bla bla ... into table miTablita
Como no especifique una ruta, la nueva tabla se creara en el directorio por defecto, si quieres crearla en un directorio particular, solo tienes que incluir la ruta en la sentencia:
select * from tabla ... bla bla bla ... into table c:\temp\miTablita
Suerte!
Hola, fíjate que si había seleccionado mi cursor pero lo tenía antes de asignar los datos de la consulta a una grilla, lo que hice fue cambiarla después de esta asignación y ya no me mando errores.
Aprovechando quisiera preguntarte lo siguiente:
Tengo que hacer algunas consultas pero solo las he podido hacer individualmente por ejemplo:
select campo1, count (campo1) from tabla where campo1=1 into cursor micursor
select campo1, count (campo1) from tabla where campo1=2 into cursor micursor;
select campo1, count (campo1) from tabla where campo1=3 into cursor micursor;
Y así sucesivamente, lo que me genera son tres consultas individuales obviamente. ¿Cómo le puedo hacer para que solamente me genere un solo cursor o tabla, con lo que he consultado
ejemplo:
TABLA micursor
count1 count2
8 3
7 2
Lo que yo he hecho es lo siguiente pero no me resulta, pues lo que genera son datos idénticos en las columnas
select campo1, count (campo1), count(campo1), count (campo1() from tabla where campo1=1 or campo1=2 or campo1=3 into cursor micursor;
Rocío, tienes varias alternativas para solucionar tu problema.
La primera (y muy sencilla) es incluir un GROUP en tu consulta.
select campo1, count (campo1) from tabla group by campo1 into cursor micursor
Esto te traerá los resultados en una sola tabla de esta manera:
Campo1, count
1 8
2 30
Si solo te interesa sacar los valores para cuando campo1 sea 1, 2 o 3, entonces puedes incluir un filtro en el WHERE.
select campo1, count (campo1) from tabla where inlist(campo1,1,2,3) group by campo1 into cursor micursor
Otra solución seria unir los cursores con UNIONs... pero te recomiendo la primera...
Suerte...
Hola, disculpa que no haya podido escribirte antes.
Las opciones que me das en esta última respuesta están muy bien, lo que sucede es que ya he hecho a sí mis consultas y me arroja los resultados verticalmente, esto es:
campo x campo1 count(campo1)
preg1 0 5
preg1 1 22
preg1 2 34
preg2 0 2
preg2 1 23
...
Yo requiero los datos verticalmente porque les voy a dar salida en un informe de la siguiente manera:
0 1 2 ...
_____________________________________
preg1 5 22 34 ...
preg2 3 7 12 ....
No se si me expliqué, pero haciéndolo como tu me dices no se como jalar los datos a mi informe y me los plasme verticalmente como en este último ejemplo, por tanto, yo solo he podido hacer estas siguientes consultas, el problema es que voy a manejar más de 100 preguntas (preg1, preg2,...), entonces te pregunto si hay la manera de simplificar estas consultas, cómo le podría hacer, además de que por cada consulta tengo antes que crear una tabla
semejante a la que creo en "into table ..." para adicionar ahí lo datos y pueda relacionarla con las demás tablas generadas en las otras consultas, ya que si quiero relacionar las tablas que creo con "into table" no me lo permite, también tengo el problema de que al meter el código en un botón cada de que hago click me pregunta que la tabla ya existe que si deseo sobreescribirla y al manejar el comando "ZAP" me pregunta que si quiero borrar el contenido, cómo podría hacerle para que no me pregunte esto.
Gracias.
select cct;
from concentrado_segundoaexel;
group by concentrado_segundoaexel.cct;
order by cct;
into table c:\prueba\esc
select escuela
zap
appen from c:\prueba\esc
select cct, count (pree11) as cero;
from concentrado_segundoaexel;
where pree11=0;
group by concentrado_segundoaexel.cct;
order by cct;
into table c:\prueba\cero
select copiacero
zap
appen from c:\prueba\cero
select cct, count (pree11) as uno;
from concentrado_segundoaexel;
where pree11=1;
group by concentrado_segundoaexel.cct;
order by cct;
into table c:\prueba\uno
select copiauno
zap
appen from c:\prueba\uno
select cct, count (pree11) as dos;
from concentrado_segundoaexel;
where pree11=2;
group by concentrado_segundoaexel.cct;
order by cct;
into table c:\prueba\dos
select copiados
zap
appen from c:\prueba\dos
Thisform.refresh
Si usas la instrucción set safety off fox no te preguntara para sobreescribir un archivo, de todas formas creo que es innecesario todo ese código... Si para cada pregunta solo vas a tener 0, 1 y 2 como columnas, el problema es sencillo... saca los resultados verticalmente
Pregunta valor conteo
preg1 0 5
Preg1 1 22
Preg1 2 34
preg2 0 2
Preg2 1 23
...
Y luego, digamos que tu tabla resultado se llama tabla, el campo de la pregunta pregunta, y valor es 0, 1 o 2, y el campo conteo. Trata con este select:
select cero.preg, cero.conteo as cero, uno.conteo as uno, dos.conteo as dos from tabla cero, tabla uno, tabla dos where cero.preg = uno.preg and uno.preg = dos.preg and cero.valor = 0 and uno.valor = 1 and dos.valor = 2 group by cero.preg, uno.preg, dos.preg into table c:\temp\tablita
Me dejas saber como resultó...
Suerte!
Hola, nuevamente te escribo, pues el select que me mandaste no lo entiendo muy bien, ya que usas tablas como cero(cero. Conteo), uno (uno. Conteo) etc en que momento las creaste o en lugar de este nombre de tabla va "tabla" que es el nombre de la tabla, y lo mismo para tabla cero, tabla uno y tabla dos.
No se si me doy a entender pero te comente que solo puedo sacar los datos verticalmente así:
select cct, pree11,count(pree11) as pre11cero;
from concentrado_segundoaexel;
group by concentrado_segundoaexel.cct,concentrado_segundoaexel.pree11;
order by cct;
Y esto es solo por pregunta ya que si manejo más de una pregunta me crea resultados idénticos, ejemplo:
select cct, pree11,count(pree11) as pre11conteo, pree12, count (pree12) as pre12conteo;
from concentrado_segundoaexel;
group by concentrado_segundoaexel.cct,concentrado_segundoaexel.pree11,concentrado_segundoaexel.pree12;
order by cct;
esto da salida como:
escuela PRE11 conteo PRE12 CONTEO
A 0 4 0 4
B 1 43 1 43
C 2 22 2 22
D 3 13 3 13
Como te iba diciendo si manejo más de una pregunta me pone las demás columnas con valores idénticos, información repetida. Mi información de mi tabla original esta distribuida así
escuela pre11 pre12 pre13
A 1 0 2
A 3 2 1
A 3 1 2
B 1 2 0
B 0 2 1
B 2 2 3
....
A partir de esta tabla yo tengo que generar mi reporte contando por escuela y por pregunta, cuantos 0,1,2 y 3 hay
y poner en mi reporte:
Escuela: A
VALOR 0 1 2 3
PRE11 0 1 0 2
PRE12 2 3 1 0
Cómo hacerle
Gracias.
Parece que estamos haciendo un periódico con tantos mensajes sobre la misma pregunta... a ver si esta vez te entiendo:
Tu tabla (llamada concentrado_segundoaexel) tiene la siguiente estructura:
Cct pre11 pre12 pre13
A 1 0 2
A 3 2 1
A 3 1 2
B 1 2 0
B 0 2 1
B 2 2 3
Digamos que solo tenemos esos datos para poder hacer los querys con resultados.
El select:
select b.cct, 'pre11' as tipo, pre11 as valor, count(*) ;
as conteo from concentrado_segundoaexel b;
group by b.cct, b.pre11 ;
union all ;
select b.cct, 'pre12' as tipo, pre12 as valor, count(*) ;
as conteo from concentrado_segundoaexel b;
group by b.cct, b.pre12 ;
union all ;
select b.cct, 'pre13' as tipo, pre13 as valor, count(*) ;
as conteo from concentrado_segundoaexel b;
group by b.cct, b.pre13 ;
into table c:\conteo
arroja el siguiente resultado, creando una tabla "conteo" con la siguiente estructura:
cct tipo valor conteo
A pre11 1 1
A pre11 3 2
B pre11 0 1
B pre11 1 1
B pre11 2 1
A pre12 0 1
A pre12 1 1
A pre12 2 1
B pre12 2 3
A pre13 1 1
A pre13 2 2
B pre13 0 1
B pre13 1 1
B pre13 3 1
Fíjate que hay saltos en los valores de las preguntas, por ej. como no se contestó a la pregunta 11 en la escuela A con el valor 0 o con el 2, estos dos no aparecen en los resultados.
El siuiente código "completa" los huecos:
lccct = ''
lctipo = ''
select conteo.cct, conteo.tipo from conteo group by cct, tipo into cursor cctxtipo
select cctxtipo
scan
lccct = cctxtipo.cct
lctipo = cctxtipo.tipo
for n = 0 to 3
select conteo
locate for conteo.cct = lccct and conteo.tipo = lctipo and conteo.valor = n
if !found()
insert into conteo (cct, tipo, valor, conteo) values (lccct, lctipo, n, 0)
else
loop
Endif
Endfor
select cctxtipo
Endscan
Ahora la tabla conteo tiene los siuientes campos:
Cct tipo valor conteo
A pre11 1 1
A pre11 3 2
B pre11 0 1
B pre11 1 1
B pre11 2 1
A pre12 0 1
A pre12 1 1
A pre12 2 1
B pre12 2 3
A pre13 1 1
A pre13 2 2
B pre13 0 1
B pre13 1 1
B pre13 3 1
A pre11 0 0
A pre11 2 0
A pre12 3 0
A pre13 0 0
A pre13 3 0
...
Como estos resultados estan desordenados hacemos un select para ordenarlos:
select * from conteo order by cct, tipo, valor into cursor conteos
Ahora el cursor es "conteos".
El siguiente Select produce los resultados que deseas:
select cero.cct, cero.tipo, cero.conteo as cero, uno.conteo as uno,;
dos.conteo as dos, tres.conteo as tres from conteos cero, ;
conteos uno, conteos dos, conteos tres where cero.cct = uno.cct and ;
cero.tipo = uno.tipo and ;
uno.tipo = dos.tipo and uno.cct = dos.cct and ;
dos.cct = tres.cct and dos.tipo = tres.tipo and ;
cero.valor = 0 and uno.valor = 1 ;
and dos.valor = 2 and tres.valor = 3 ;
group by cero.cct, cero.tipo, uno.cct, uno.tipo, ;
dos.cct, dos.tipo, tres.cct, tres.tipo ;
into cursor tablita
El cursor sobre el que debes basar el reporte se llama tablita, y cero, uno, dos y tres no son más que alias al mismo cursor para poder sacar las filas como columnas.
Suerte!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas