Access crear secuencial según valor

Tengo una consulta llamada TConsultaR2000 en la cual he creado un campo llamado "COMPUESTO" que es la unión de dos campos. Mi pregunta es ¿Se podría crear un secuencial en la columna ID dependiendo del valor del campo COMPUESTO, es decir siempre empieza por 1 y mientras sea igual seguirá siendo 1 en el momento que cambie pasará a 2 y todos estos que sean iguales seguirán siendo 2 cuando vuelva a cambiar sería el 3 y así sucesivamente. Adjunto tabla que creo que está más claro

Respuesta
1

No sé sirva este ejemplo, lo hago con DAO y la tabla requiere el campo id.

Tabla

FUNCIÓN (puede hacerse en un procedimiento)

Solo es cambiar el nombre de la tabla y los campos.

Se me olvido decirle como llamar la función, si la graba en un módulo la puede llamar desde cualquier parte como:

crea_cons

Sin milongas no recomiendo utilizar Dlookup() y DLast(), esto funciona bien en tablas pequeñas, pero que tal si tuviéramos que actualizar 100.000 registros, si tienen que ejecutar 200.000 veces la consultas. Ahora para que crear una consulta y un formulario si lo podemos hacer directamente en sobre la tabla.

Aunque ya está respondida su pregunta, preparé este ejemplo en PostgreSQL, para demostrarle el porque Dlookup() y DLast() no tiene ninguna utilidad en otros sistemas más robustos y para aquellas personas que lo quieran hacer en PostgreSQL.

Creación de la tabla agrupa_nra2 e inserción de los datos

Consulta para obtener la numeración ordenada

Observe que hay términos que no existen en SQL Access, como:  with , row_number() , OVER, using . No obstante, la consulta se crea en Access como una consulta Específica de SQL, Paso a través y obtengo la información.

Resultado de la consulta (En PostgreSQL)

Observe que no fue necesario adicionar ningún campo y la columna compuesto está ordenada.

Asimismo, se nos informa que se procesaron 20 filas en 42 milisegundos, de tal forma que se puede ejecutar la consulta para 500.000 registros el resultado sigue siendo rápido, esto en Access con Dlookup() y DLast() terminaría con el mensaje "Access no responde".

Con lo expuesto los invito a que aprendan PostgreSQL para que lo conecten con Access mediante ODBC y multipliquen la potencia de Access y así tengan los datos más seguros, respuestas más rápidas de consultas e implementación multiusuario sin ningún problema. Aclaro que esta explicación es totalmente ilustrativa sin el ánimo de criticar a nadie.

1 respuesta más de otro experto

Respuesta
1

Es más sencillo. Si tengo la tabla Copia, que creo que es como la tuya

Con ella creo una consulta( en mi caso Consulta2)

( Se podría eludir el construirla, pero es más didáctico). Con la misma tabla construyo un formulario donde le añado un botón

Cuando pulso el botón

Aunque estén salteados, lo que tiene en cuenta es el valor del control Compuesto.

El código del botón es

Private Sub Comando5_Click()
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
If IsNull(DLookup("indice", "consulta2", "compuesto='" & Me.Compuesto & "'")) Then
Indice = Nz(DLast("indice", "consulta2")) + 1
Else
Indice = DLast("indice", "consulta2", "compuesto='" & Me.Compuesto & "'")
End Sub

Y que no te vengan con milongas.

Hola, estoy loco. El código me funciona bien, pero hay un problema que quizás debería haber avisado con antelación, la tabla tiene alrededor de 70 mil filas con lo que al ejecutar el código me da error de desbordamiento. ¿Puede ser la causa el tamaño de la tabla? Gracias nuevamente

Yo me fijé por la imagen que pusiste, por eso le puse lo de dim i as byte que sólo llega hasta 255. Tienes que ponerlo como

Dim i as long

Con eso basta

Si Access se bloqueara porque no puede procesar tan rápido como pasa de uno a otro registro tendrías que dividir el proceso por fases, por ejemplo

dim i as long

for i=1 to 10.000

....

next

for i=10001 to 20000

...

next

Etc.

Perdona pero ahora sí que estoy loco de verdad. Al final me he decantado por utilizar una tabla muy reducida de registros para no tener ese problema de desbordamiento. Mi idea es que cuando esa tabla numere la relacione con la grande. Me he creado para probar una base de datos exactamente igual que la que pones en tu ejemplo y me sale "Bloque If sin End If" me he quedado sorprendido porque en ningun momento estoy utilizando la opción If. ¿Me aprovecharía de tu amabilidad si te pudiera pasar la base de datos a ver si tú encuentras el motivo? Muchas gracias.

No problemo. Mi correo es [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas