Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

cursores en access o tal vez es mas sencillo

620 views
Skip to first unread message

christianmesa

unread,
Oct 9, 2008, 2:19:57 PM10/9/08
to
Mi problema es el siguiente:
Tengo dos tablas una llamada tareas y otra llamada avance_tareas, cada tarea
puede tener n avances... Ahora, necesito obtener por cada tarea solo los
ultimos tres avances, ejemplo:
tarea1----> avance1
tarea1----> avance2
tarea1----> avance3
tarea2----> avance1
tarea2----> avance2
tarea2----> avance3
Se que esa consulta se puede hacer con cursores, pero no se si access
trabaja con cursores o tal vez sea mas sencillo que eso.
Ojala alguien pueda ayudarme... se los agradeceria mucho
PD: uso access 2007

raipon

unread,
Oct 9, 2008, 3:08:43 PM10/9/08
to
Hola, una pregunta preliminar :

¿ Qué criterio -campo- hay que utilizar para establecer el órden que permita
seleccionar cuales son los tres últimos registros de la tabla avance_tareas
para cada tarea ?

Adios, un saludo.

Ramon Poch, raipon. Mi blog : www.sqlraipon.blogspot.com


Ju@nK [MVP 2006/8]

unread,
Oct 9, 2008, 3:36:36 PM10/9/08
to
En Access no hay cursores :-(, pero contesta a la pregunta de Raipon para
establecer el orden, según el orden podrías hacerlo algo así, el orden es Id

select * from (SELECT tbltareas.Id, tbltareas.strTarea, tbltareas.strAvance
FROM tbltareas
WHERE tbltareas.[Id]=DLast("Id","tblTareas","strtarea='" & [strtarea] & "'")
union
SELECT tbltareas.Id, tbltareas.strTarea, tbltareas.strAvance
FROM tbltareas
WHERE tbltareas.[Id]=DLast("Id","tblTareas","strtarea='" & [strtarea] & "'
and Id <" & dlast( "Id","tblTareas","strtarea='" & [strtarea] & "'" ) )
union
SELECT tbltareas.Id, tbltareas.strTarea, tbltareas.strAvance
FROM tbltareas
WHERE tbltareas.[Id]=DLast("Id","tblTareas","strtarea='" & [strtarea] & "'
and Id <" & dlast( "Id","tblTareas","strtarea='" & [strtarea] & "' and Id
<" & dlast( "Id","tblTareas","strtarea='" & [strtarea] & "'" )))) as
TresTareas
order by strTarea


--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/08
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**
"raipon" <raimo...@hotmail.com> escribió en el mensaje
news:eaHTwJkK...@TK2MSFTNGP04.phx.gbl...

christianmesa

unread,
Oct 9, 2008, 3:37:02 PM10/9/08
to
Gracias por la rapidez de respuesta...
los ultimos tres avances debe ser por fecha.... osea las ultimas tres
actualizaciones que se ingreso por cada tarea... espero explicarme.

desde ya gracias


"raipon" escribió:

christianmesa

unread,
Oct 9, 2008, 3:57:02 PM10/9/08
to
Uf... gracias por tu respuesta... pero tengo dudas, recuerda que son dos
tablas.
las tablas tienen mas o menos estos campos:

tabla tareas tabla avance_tareas
id id
titulo fecha_avance
ambito descripcion
prioridad

entonces necesito
tareas.titulo, tareas.ambito, tareas.prioridad, avance_tareas.fecha_avance,
avance_tareas.descripcion.

pero solo las tres ultimas fecha_avance por cada tarea... espero explicarme..

saludos

Ju@nK [MVP 2006/8]

unread,
Oct 9, 2008, 4:39:07 PM10/9/08
to
Create una consulta de selección con los datos que necesitas y en where
pones

...
WHERE avance_tareas.[fecha_avance] =
DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )

Así tendrás el último, para obtener los dos anteriores simplemente aumentas
las condiciones con
...
" and avance_tareas.[fecha_avance] < " &
DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )

uniendo las dos consultas

y para el tercero
...
" and avance_tareas.[fecha_avance] < " &
DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id & " and
avance_tareas.[fecha_avance] < " &
DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )))

uniendo la consulta a la anterior

--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/08
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**

"christianmesa" <christ...@discussions.microsoft.com> escribió en el
mensaje news:BF200C34-297D-4A5F...@microsoft.com...

christianmesa

unread,
Oct 9, 2008, 5:01:00 PM10/9/08
to
Gracias Juanka siento que vamos bien encaminados... uf por fin...
ahora al agregar la primera parte del where me dice que ingrese un valor
para avances_tarea.id... no entiendo por que

WHERE avance_tareas.[fecha_avance] =
> DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )

[avance_tareas].Id creo que eso no me lo toma...

saludos

"Ju@nK [MVP 2006/8]" escribió:

> Create una consulta de selección con los datos que necesitas y en where
> pones
>

> ....


> WHERE avance_tareas.[fecha_avance] =
> DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )
>
> Así tendrás el último, para obtener los dos anteriores simplemente aumentas
> las condiciones con

> ....


> " and avance_tareas.[fecha_avance] < " &
> DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )
>
> uniendo las dos consultas
>
> y para el tercero

> ....

christianmesa

unread,
Oct 9, 2008, 5:13:01 PM10/9/08
to
Perdon era solo error de nombre de tabla...
pero tengo otro error...
cuando agrego el segundo criterio osea

" and avance_tareas.[fecha_avance] < " &
DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )
me dice que que falta un operador y me marca fecha_avance...

saludos


"Ju@nK [MVP 2006/8]" escribió:

> Create una consulta de selección con los datos que necesitas y en where
> pones
>

> ....


> WHERE avance_tareas.[fecha_avance] =
> DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )
>
> Así tendrás el último, para obtener los dos anteriores simplemente aumentas
> las condiciones con

> ....


> " and avance_tareas.[fecha_avance] < " &
> DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id )
>
> uniendo las dos consultas
>
> y para el tercero

> ....

Martín

unread,
Oct 9, 2008, 5:35:34 PM10/9/08
to
sino lo que podés hacer es algo como:

select top 3
from..
where...
order by fecha
union
select top 3..
...
..
etc..
ahí te daría las últimas 3 fechas de cada tarea o las primeras 3
(dependiendo si ponés asc o desc_)

saludos,
Martín


"christianmesa" <christ...@discussions.microsoft.com> escribió en el

mensaje news:B0B2B477-060B-4BDF...@microsoft.com...

Ju@nK [MVP 2006/8]

unread,
Oct 10, 2008, 2:22:50 AM10/10/08
to
Tratandose de fechas, puede que tengas que poner el # antes y despues de la
fecha, ej.:

" and avance_tareas.[fecha_avance] < #" &
DLast("fecha_avance","avance_tareas","Id=" & [avance_tareas].Id ) & "#"


--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/08
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**
"christianmesa" <christ...@discussions.microsoft.com> escribió en el

mensaje news:E72BD727-0B90-4F11...@microsoft.com...

Ju@nK [MVP 2006/8]

unread,
Oct 10, 2008, 2:24:12 AM10/10/08
to
No, el top te devolverá las 3 últimas o primeras tareas en general, no de
cada tarea

--
--
**
Salu2/Regards
Ju@nK [MVP Access] 2006/08
[DCE2003 ***] + VSTO [DCE2005 **]
http://juank.mvps.org http://www.juank.es
Correos personales o preguntas particulares en mi grupo
http://groups.google.es/group/juank?hl=es
www.juank.tk
¿Que es un MVP?, entérate en http://mvp.support.microsoft.com
**

"Martín" <ghazaria...@gmail.com> escribió en el mensaje
news:eMJH0bl...@TK2MSFTNGP03.phx.gbl...

raipon

unread,
Oct 10, 2008, 4:04:26 AM10/10/08
to
Hola, he de confesar que este tipo de hilos me gustan. Tanto por el interés
y complejidad de la pregunta como por la calidad de las respuestas dadas
hasta ahora.
Mi granito de arena :

Select tareas.titulo, tareas.ambito, tareas.prioridad,
avance_tareas.fecha_avance, avance_tareas.descripcion
From tareas Inner Join Avance_Tareas
On tareas.id = Avance_Tareas.id
Where
(Select Count(*) From avance_tareas As T
Where T.id = tareas.Id
And T.fecha_avance >= Avance_Tareas.fecha_avance) <= 3;

... puesto que me parece interesante el tema, en los próximos dias publicaré
algo en mi blog al respecto (devolver n registros en una consulta agrupada).

P.D. Tal y como está el diseño de las tablas, si hay valores repetidos (de
fecha) para un mismo id, la consulta no devolverá correctamente los
resultados, pero esto se puede solucionar si en la subconsulta podemos
incorporar un campo clave de la tabla Avance_Tareas.

Adios, un saludo.

Ramon Poch, raipon. Mi Bloc : www.sqlraipon.blogspot.com


christianmesa

unread,
Oct 10, 2008, 9:55:02 AM10/10/08
to
Estimado Raipon:
Tu respuesta es absolutamente acertada... muchas gracias ya que estuve
varios dias tratando de resolverlo... incluso pense en cursores, jajajaja
pero definitivamente era mas sencillo... una vez mas muchas gracias.

PD: Caso resuelto :-)


"raipon" escribió:

> Hola, he de confesar que este tipo de hilos me gustan. Tanto por el interés
> y complejidad de la pregunta como por la calidad de las respuestas dadas
> hasta ahora.
> Mi granito de arena :
>
> Select tareas.titulo, tareas.ambito, tareas.prioridad,
> avance_tareas.fecha_avance, avance_tareas.descripcion
> From tareas Inner Join Avance_Tareas
> On tareas.id = Avance_Tareas.id
> Where
> (Select Count(*) From avance_tareas As T
> Where T.id = tareas.Id
> And T.fecha_avance >= Avance_Tareas.fecha_avance) <= 3;
>

> .... puesto que me parece interesante el tema, en los próximos dias publicaré

0 new messages