Temas activadosTemas activados  Lista de Usuarios del ForoLista de Usuarios  CalendarioCalendario  Búsqueda en el ForoBúsqueda  AyudaAyuda
  RegistrarRegistrar  ConectarConectar
Página anterior             ** NORMAS DEL FORO **            Página siguiente
Access y VBA
 Foro de Access y VBA > Access y VBA > Access y VBA
Icono de mensaje Tema: Id Siguiente(Tema Cerrado Tema Cerrado) Enviar mensaje Enviar mensaje
Página  de 2 Siguiente >>
Autor Mensaje
Jesusdvd
Asiduo
Asiduo
Avatar

Agregado: 12/Abril/2005
Lugar: Colombia
Estado: Desconectado
Mensajes: 273
bullet Tema: Id Siguiente
    Enviado: 01/Abril/2020 a las 17:02
Hola a todos

Tengo el siguiente asunto:

Id    Cliente       Fecha
1       40        01/01/2020
2       40        02/02/2020
3       40        15/02/2020
4       41        04/01/2020
5       41        06/01/2020
6       42        06/01/2020
7       43        08/02/2020
8       43        16/02/2020

Para cada cliente necesito traer el siguiente Id (si existe) de manera que al final debería obtener:

Id    Cliente       Fecha       IdSiguiente
1       40        01/01/2020        2
2       40        02/02/2020        3
3       40        15/02/2020       
4       41        04/01/2020        5
5       41        06/01/2020       
6       42        06/01/2020
7       43        08/02/2020        8
8       43        16/02/2020

Actualmente lo hago con dos consultas una para el Id inicial y otra con todos los Ids Posteriores, el tema es que la base contiene más de un millón de registros y repetir el proceso con una macro que para cada Id busque en la otra base el siguiente Id (filtrado por los mayores que el Id evaluado) es demasiado demorada...

Agradezco inmensamente cualquier ayuda que me puedan brindar.
...en el mundo existen 10 clases de personas, las que conocen los binarios y las que no....
IP IP conectada
01loko
Colaborador
Colaborador


Agregado: 17/Agosto/2017
Lugar: Santander
Estado: Desconectado
Mensajes: 393
bullet Enviado: 01/Abril/2020 a las 17:24
como idea:

Si haces una consulta filtrando por cliente ultimo registro no te daria el id ultimo?
Ejemplo
Select * tabla_clientes where cliente=40 top1

Ojito: creo que esta bien escrita la consulta

otra posibilidad:

id_max=dmax("id", "Tabla_cliente", "cliente=40")




Editado por 01loko - 01/Abril/2020 a las 17:28
Recordar de que soy nuevo y estoy aprendiendo.
IP IP conectada
xavi
Administrador
Administrador
Avatar
Terrassa-BCN

Agregado: 10/Mayo/2005
Lugar: Catalunya ||||
Estado: Desconectado
Mensajes: 12080
bullet Enviado: 01/Abril/2020 a las 18:03
Hola,

Añade un campo calculado a tu consulta dónde se utilice una función agregada de dominio: DPrim (DFirst) con el criterio adecuado (mismo cliente, fecha posterior)


SELECT Tabla1.Id, Tabla1.Cliente, Tabla1.Fecha, DFirst("[Id]","Tabla1","[Cliente]='" & [Tabla1]![Cliente] & "' AND [Fecha] > #" & Format([Tabla1]![Fecha],"mm/dd/yyyy") & "#") AS Expr1
FROM Tabla1;

Notas:
- El "desorden" en la tabla, podría darte resultados incorrectos. Ejemplo: si tus registros 2 y 3 estuvieran intercambiados:
1       40        01/01/2020
2       40        15/02/2020
3       40        02/02/2020

Al pasar por el registro 1 el primero que encontraría del mismo ID para una fecha superior seria el 2 (15/02)
Al pasar por el registro 2 no encontraría ninguno
Al pasar por el registro 3 volvería a encontrar el registro 2

- He asumido que Cliente es un Texto
- El nombre de la tabla es Tabla1. Adáptalo.
- Recuerda formatear las fechas. Si tu office está en ingles, deberás cambiar aaaa por yyyy

En cualquier caso, si hay muchos registros, esta consulta puede ser pesada.

Un saludo 
Xavi, un minyó de Terrassa

Mi web
IP IP conectada
Mihura
Administrador
Administrador
Avatar

Agregado: 06/Mayo/2005
Lugar: En la dehesa
Estado: Desconectado
Mensajes: 9724
bullet Enviado: 01/Abril/2020 a las 18:07
Editado:  borro el mensaje porque está claro que no me he enterado de que es lo que se preguntaba ...  Ouch

Editado por Mihura - 01/Abril/2020 a las 18:25
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
IP IP conectada
01loko
Colaborador
Colaborador


Agregado: 17/Agosto/2017
Lugar: Santander
Estado: Desconectado
Mensajes: 393
bullet Enviado: 01/Abril/2020 a las 18:18
me gustaria saber si la solucion que he propuesto es factible y si no lo es me expliquen porque


gracias


Editado por 01loko - 01/Abril/2020 a las 18:19
Recordar de que soy nuevo y estoy aprendiendo.
IP IP conectada
xavi
Administrador
Administrador
Avatar
Terrassa-BCN

Agregado: 10/Mayo/2005
Lugar: Catalunya ||||
Estado: Desconectado
Mensajes: 12080
bullet Enviado: 01/Abril/2020 a las 19:34
Hola,

La primera SQL está mal escrita (sería SELECT TOP 1 * FROM Tabla WHERE idclientes = 40) y devolvería el primer registro de la tabla para el cliente. De esa forma, para el cliente 40 siempre devolvería 1.
Además deberias meter el criterio de la fecha para encontrar el adecuado.
Al final lo que estás consiguiendo es emular el funcionamiento de DFirst.

La segunda opción devuelve el máximo de ID para el cliente. EN ese caso, para el cliente 40, los tres registros devolverian 3. Incluso el propio registro 3.

¿Se entiende? (es que ando un poco espeso...)

Xavi, un minyó de Terrassa

Mi web
IP IP conectada
Jesusdvd
Asiduo
Asiduo
Avatar

Agregado: 12/Abril/2005
Lugar: Colombia
Estado: Desconectado
Mensajes: 273
bullet Enviado: 02/Abril/2020 a las 00:07
Bueno pues de entrada ha funcionado, pero en algunos casos ocurre lo siguiente que no sé si simplificaría el asunto:(He cuidado mucho el orden y es estrictamente por Id, luego por fecha)

1       40        01/01/2020
2       40        01/01/2020
3       40        02/02/2020

En el caso del 1 y 2 ambos ocurren dentro de la misma fecha, así que lo que esperaría es:

1       40        01/01/2020 2
2       40        01/01/2020 3
3       40        02/02/2020

Aclaro que cuando incluí los registros se incluyó con fecha y hora de creación Columnas diferentes), la columna de hora no la he mostrado aquí para fines de simplicidad, podría incluirlo en el campo fecha si llegase a a ser necesario.
...en el mundo existen 10 clases de personas, las que conocen los binarios y las que no....
IP IP conectada
xavi
Administrador
Administrador
Avatar
Terrassa-BCN

Agregado: 10/Mayo/2005
Lugar: Catalunya ||||
Estado: Desconectado
Mensajes: 12080
bullet Enviado: 02/Abril/2020 a las 00:38
Si lo he entendido bieb, modifica los criterios para que la fecha se igual o superior (ahora solo es superior) y el Id sea superior al actual (esa condición es nueva)

SELECT Tabla1.Id, Tabla1.Cliente, Tabla1.Fecha, DFirst("[Id]","Tabla1","[Cliente]='" & [Tabla1]![Cliente] & "' AND [Fecha] >= #" & Format([Tabla1]![Fecha],"mm/dd/yyyy") & "# AND [Id]>" & [Tabla1]![Id]) AS Expr1
FROM Tabla1;

Si el campo fecha contiene la hora, podrías probar a utilizar la SQL del primer mensaje pero incluyendo la hora en el format:

SELECT Tabla1.Id, Tabla1.Cliente, Tabla1.Fecha, DFirst("[Id]","Tabla1","[Cliente]='" & [Tabla1]![Cliente] & "' AND [Fecha] > #" & Format([Tabla1]![Fecha],"mm/dd/yyyy hh:nn:ss") & "#") AS Expr1
FROM Tabla1;


Un saludo
Xavi, un minyó de Terrassa

Mi web
IP IP conectada
01loko
Colaborador
Colaborador


Agregado: 17/Agosto/2017
Lugar: Santander
Estado: Desconectado
Mensajes: 393
bullet Enviado: 02/Abril/2020 a las 07:21
no se si lo estoy haciendo mal, pero a mi  dmax da exactamente lo que el quiere

dmax("id","tabla4","cliente=40") = 3

dmax("id","tabla4","cliente=41") =5

dmax("id","tabla4","cliente=42") =6

dmax("id","tabla4","cliente=43") =8

Recordar de que soy nuevo y estoy aprendiendo.
IP IP conectada
xavi
Administrador
Administrador
Avatar
Terrassa-BCN

Agregado: 10/Mayo/2005
Lugar: Catalunya ||||
Estado: Desconectado
Mensajes: 12080
bullet Enviado: 02/Abril/2020 a las 08:45
Hola,

Miramos los datos del primer post y, para el cliente 40, que tiene 3 registros ¿cuales son los valores esperados?
Pues para el registro de Id = 1, se espera 2
Para el registro de Id = 2, se espera 3
Para el registro de Id = 3, no se espera nada

Con tu solución siempre se obtiene 3

Con DMax se devuelve el valor máximo; con DFirst (y las condiciones adecuadas) se obtiene el siguiente, que es lo que parece querer Jesus.

Un saludo

Xavi, un minyó de Terrassa

Mi web
IP IP conectada
Foro de Access y VBA > Access y VBA > Access y VBA
Página  de 2 Siguiente >>
Enviar mensaje
Versión para imprimir Versión para imprimir

Seleccione Foro
no puedes enviar nuevos Temas al Foro
no puedes responder a los Temas de este Foro
no puedes borrar los mensajes en este Foro
no puedes editar los mensajes de este Foro
no puedes crear encuesta en este Foro
no puedes votar en encuesta en este Foro

Bulletin Board Software by Web Wiz Forums version 8.06
Copyright ©2001-2006 Web Wiz Guide
NORMAS DEL FORO