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
<< Anterior Página  de 2
Autor Mensaje
01loko
Colaborador
Colaborador


Agregado: 17/Agosto/2017
Lugar: Santander
Estado: Desconectado
Mensajes: 393
bullet Enviado: 02/Abril/2020 a las 14:54
vale, creo que lo habia entendido mal

probemos con esto:

Dim rcst As Recordset, db As Database
valor_max = DMax("id", "tabla4", "cliente=" & Me.cliente)
misql = "select * from tabla4 where cliente=" & Me.cliente

Set db = CurrentDb
Set rcst = db.OpenRecordset(misql)
With rcst
Do Until .EOF
    If !Id < valor_max Then
    .Edit
    ![id_sig] = ![Id] + 1
    .Update
    End If
    .MoveNext
Loop
End With
rcst.Close
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 17:03
Veamos...

Obtienes el valor_max del id para un cliente dado 
Tomando los ejemplos:
Para cliente 40, máximo 3
Para cliente 41, máximo 5
Para cliente 42, máximo 6
Para cliente 43, máximo 8

Abres una SQL filtrada al cliente dado (Imaginemos el cliente 40)
Lo recorres
Primera iteración
  si 1<3 entonces id_sig = 1 + 1 --> 2 (y lo guardas)
Segunda iteración
  si 2<3 entonces id_sig = 2 + 1--> 3 (y lo guardas)

A primera vista da resultados correctos... pero porque los Id's son correlativos. Si los ID del cliente 40 fueran 1, 4 y 7, el código devolvería 2 y 3 igualmente cuando deberian ser 4 y 7.

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 17:40
Tienes razon, si puedes revisar este otro intento:

Dim rcst As Recordset, db As Database

misql = "select * from tabla4 where cliente like '*'"

Set db = CurrentDb
Set rcst = db.OpenRecordset(misql)
With rcst
Do Until .EOF
valor_max = DMax("id", "tabla4", "cliente=" & rcst!cliente)
    If !Id < valor_max Then
    .Edit
    ![id_sig] = Nz(DLookup("id", "tabla4", "id >" & !Id & " and cliente =" & !cliente), "")
    .Update
    End If
    .MoveNext
Loop
End With
rcst.Close

Resultado:
Tabla4
Id cliente fecha id_sig
1 40 01/01/2020 2
2 40 02/01/2020 3
3 40 15/02/2020 9
4 41 04/01/2020 5
5 41 06/01/2020 10
6 42 06/01/2020
7 43 08/02/2020 8
8 43 16/02/2020
9 40 20/02/2020 11
10 41 21/02/2020 0
11 40 22/02/2020 0



estoy aprendiendo mas en este rato, que en varios meses de teclear, juer que nervios no quedar mal con Xavi.


Editado por 01loko - 02/Abril/2020 a las 17:42
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 18:22
Si bien obtienes el resultado correcto, cargas demasiado el sistema. Ten en cuenta que cada función de dominio es como una consulta en si misma. Hay que intentar no meter demasiadas en el código o la cosa se vuelve lenta.

Aclaración: yo he aportada una solución basada en una consulta; tu aportas una solución basada en rellenar un campo de la tabla. Yo no he asumido que ese campo existe y, por lo tanto, mi consulta siempre devuelve datos sin actualizar nada (salvo que me haya equivocado, que puede ser).
Mi solución se puede convertir en una consulta de actualización y se obtiene el resultado en la tabla.
De hecho, mi consulta se puede "ahorrar" la comprobación de fecha, dado que el iniciador del hilo ha dicho que son secuenciales en el tiempo.

Si lo que se pretende es actualizar un campo de la tabla mediante un recordset, yo optaría por aplicar la misma técnica: buscar el primer registro dónde se cumpla que sea el mismo cliente y que el Id sea superior al actual. Para asegurar, forzar ordenación.

Set rst = CurrentDb.OpenRecordset("SELECT * FROM Tabla1 ORDER BY Id")
Do Until rst.EOF
  rst.Edit
  rst!Id_Siguiente = DFirst("Id", "Tabla1", "Cliente = " & rst!Cliente &  " And Id > " & rst!Id)
  rst.Update
Loop
rst.Close
Set rst = Nothing

Un saludo
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 22:28
Bueno pues he hecho lo que me has explicado Xavi y ha funcionado de maravilla, en efecto está ordenado por Id y el campo Fecha no era necesario, en efecto 01Loko se trataba de rellenar una tabla por lo que he hecho una consulta de actualización y la instrucción ha quedado así:

DPrim("[Id]";"Tabla1";"[Cliente]='" & [Tabla1]![Cliente] & "'AND [Id]>" & [Tabla1]![Id])

La he puesto a correr sobre unos 900 mil registros y de momento lleva 5 min procesando... ya les contaré cuánto tiempo me ha tomado y procederemos a cerrar... Xavi sos un crack!
...en el mundo existen 10 clases de personas, las que conocen los binarios y las que no....
IP IP conectada
Jesusdvd
Asiduo
Asiduo
Avatar

Agregado: 12/Abril/2005
Lugar: Colombia
Estado: Desconectado
Mensajes: 273
bullet Enviado: 13/Abril/2020 a las 16:57
Hola, como lo mencioné arriba la consulta funciona a la perfección, en los 900 mil registros no he logrado culminarla debido a que han pasado más de 6 horas sin resultado, he segmentado en varias tablas de menor tamaño y he logrado que funcione aunque toma mucho tiempo. Pero perfecto! Muchas gracias a todos.

Se puede cerrar el hilo
...en el mundo existen 10 clases de personas, las que conocen los binarios y las que no....
IP IP conectada
Foro de Access y VBA > Access y VBA > Access y VBA
<< Anterior Página  de 2
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