![]() |
Temas activados Lista de Usuarios Calendario Búsqueda |
| |
** NORMAS DEL FORO **
| Access y VBA | |
| |
|
| Página de 2 Siguiente >> |
| Autor | Mensaje |
|
Jesusdvd
Asiduo
Agregado: 12/Abril/2005 Lugar: Colombia Estado: Desconectado Mensajes: 273 |
Tema: Id SiguienteEnviado: 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 conectada |
|
|
01loko
Colaborador
Agregado: 17/Agosto/2017 Lugar: Santander Estado: Desconectado Mensajes: 393 |
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 conectada |
|
|
xavi
Administrador
Terrassa-BCN Agregado: 10/Mayo/2005 Lugar: Catalunya |||| Estado: Desconectado Mensajes: 12080 |
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
|
|
IP conectada |
|
|
Mihura
Administrador
Agregado: 06/Mayo/2005 Lugar: En la dehesa Estado: Desconectado Mensajes: 9724 |
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 ...
![]() Editado por Mihura - 01/Abril/2020 a las 18:25 |
|
IP conectada |
|
|
01loko
Colaborador
Agregado: 17/Agosto/2017 Lugar: Santander Estado: Desconectado Mensajes: 393 |
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 conectada |
|
|
xavi
Administrador
Terrassa-BCN Agregado: 10/Mayo/2005 Lugar: Catalunya |||| Estado: Desconectado Mensajes: 12080 |
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...) |
|
IP conectada |
|
|
Jesusdvd
Asiduo
Agregado: 12/Abril/2005 Lugar: Colombia Estado: Desconectado Mensajes: 273 |
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 conectada |
|
|
xavi
Administrador
Terrassa-BCN Agregado: 10/Mayo/2005 Lugar: Catalunya |||| Estado: Desconectado Mensajes: 12080 |
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
|
|
IP conectada |
|
|
01loko
Colaborador
Agregado: 17/Agosto/2017 Lugar: Santander Estado: Desconectado Mensajes: 393 |
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 |
|
|
Recordar de que soy nuevo y estoy aprendiendo.
|
|
IP conectada |
|
|
xavi
Administrador
Terrassa-BCN Agregado: 10/Mayo/2005 Lugar: Catalunya |||| Estado: Desconectado Mensajes: 12080 |
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 |
|
IP conectada |
|
| Página de 2 Siguiente >> | |
|
||
Seleccione Foro |
Tú no puedes enviar nuevos Temas al Foro Tú no puedes responder a los Temas de este Foro Tú no puedes borrar los mensajes en este Foro Tú no puedes editar los mensajes de este Foro Tú no puedes crear encuesta en este Foro Tú no puedes votar en encuesta en este Foro |
|