El grupo al cual envías entradas es un grupo Usenet. Si envías mensajes a este grupo, cualquier usuario de Internet podrá ver tu dirección de correo electrónico
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
¿ 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 ?
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
> ¿ 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 ?
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.
> ¿ 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 ?
> 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
> > ¿ 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 ?
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 )))
> pero solo las tres ultimas fecha_avance por cada tarea... espero > explicarme..
> saludos
> "Ju@nK [MVP 2006/8]" escribió:
>> 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
>> > ¿ 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 ?
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
> 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 )))
> > pero solo las tres ultimas fecha_avance por cada tarea... espero > > explicarme..
> > saludos
> > "Ju@nK [MVP 2006/8]" escribió:
> >> 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
> >> > ¿ 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 ?
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...
> 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 )))
> > pero solo las tres ultimas fecha_avance por cada tarea... espero > > explicarme..
> > saludos
> > "Ju@nK [MVP 2006/8]" escribió:
> >> 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
> >> > ¿ 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 ?
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_)
> 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ó:
>> 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 ?
> 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
>> 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 )))
>> > pero solo las tres ultimas fecha_avance por cada tarea... espero >> > explicarme..
>> > saludos
>> > "Ju@nK [MVP 2006/8]" escribió:
>> >> 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
>> >> > ¿ 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 ?
> 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" <christianm...@discussions.microsoft.com> escribió en el > mensaje news:B0B2B477-060B-4BDF-A042-32745E4CAADA@microsoft.com... >> 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ó:
>>> 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 ?
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.
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.
> 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.