Autonumerar de acuerdo a campos repetidos

Tengo un problema con una consulta que no sé como encarar, la situación es esta:

Tengo una tabla donde se repiten algunos nombres de personas, algunos figuran 1 vez, otros 2, otros 3 veces y así... Me guío por la columna LEGAJO de la tabla CONTROLES.

Estoy tratando de generar una consulta que agregue una columna para autonumerar los casos por persona, o sea, en el primer control de una persona que figure 1, en el segundo control (si hay), que figure 2, en el tercer control (si hay) que figure 3, etc.

Ejemplo:

LEGAJO               CONTROL                       NUMERO DE CONTROL

400                       Detalle                             1

500                       Detalle                             1

500                       Detalle                             2

600                       Detalle                             1

700                       Detalle                             1

700                       Detalle                             2

700                       Detalle                             3

700                       Detalle                             4

800                       Detalle                             1

A ver si a alguien sabe como se hace esto!

1 Respuesta

Respuesta
2

Antes de intentar darte una respuesta, dos cuestiones:

1º/ La nueva columna (Número de control) ¿La quieres solo en una consulta o quieres almacenarla en la tabla?

2º/ La tabla CONTROLES imagino que tiene más campos ¿hay alguno autonumérico, o de fecha o de otro tipo con el que se pueda establecer un orden?

Hola Sveinbjorn

1 - La nueva columna la quiero en una tabla en realidad, pero si necesito hacer una nueva tabla mediante una consulta, se acepta igual.

2 - Si, puse CONTROLES para no generar info innecesaria, pero esta tabla que digo tiene otros campos. Para ser exacto: Nº (Número), OPERACION(Texto corto), LEGAJO(Número), BIMESTRE (Número), RELEVADO(Número), AL (Número) y AG (Número)... y quisiera agregarle una más que sea NUMERO DE CONTROL (Número).

Gracias!!

Te propongo 3 métodos distintos, para que elijas el que más te guste. Ahora bien, los tres métodos suponen que el campo "Nº" es único y secuencial, es decir, que en los datos que pones de ejemplo, el valor del campo Nº del legajo 500 que lleva el orden 1 será siempre inferior al que llevará el orden 2.

Método 1:

Crea una consulta sobre la tabla controles, con los campos (como mínimo) Nº y Legajo, y añades una nueva columna con esta expresión:

NControl: DCont("*";"CONTROLES";"Legajo=" & [Legajo] & " AND Nº<" & [Nº])+1

Guardas la consulta, y al ejecutarla, ya tienes "ordenados" los legajos con su número de control (NControl)

Para pasarlo a la tabla, crea una nueva consulta, cambia a vista SQL y pega esta SQL:

UPDATE CONTROLES INNER JOIN Consultav2 ON CONTROLES.Nº = Consultav2.Nº SET CONTROLES.NumControl = [Consultav2].[NControl];

Cuando la guardes y la ejecutes, se te actualizará la tabla con los mismos valores que los que te mostraba la consulta.

Método 2:

Añades un módulo nuevo a tu BD, y en él pegas esta función:

Public Function fncOrdenaLegajos(miLegajo As Long, miNum As Integer) As Integer
Dim rst As Recordset
Dim miSQL As String
miSQL = "SELECT * FROM CONTROLES WHERE Legajo=" & miLegajo & " ORDER BY [Nº]"
Set rst = CurrentDb.OpenRecordset(miSQL)
rst.MoveLast
rst.FindFirst "[Nº]=" & miNum
fncOrdenaLegajos = rst.AbsolutePosition + 1
rst.Close
Set rst = Nothing
End Function

Crea una consulta sobre la tabla controles, con los campos (como mínimo) Nº y Legajo, y añades una nueva columna con esta expresión:

NControl: fncOrdenalegajos([Legajo];[Nº])

Guardas la consulta, y al ejecutarla, ya tienes "ordenados" los legajos con su número de control (NControl)

Para pasarlo a la tabla, crea una nueva consulta, cambia a vista SQL y pega esta SQL:

UPDATE CONTROLES SET CONTROLES.NumControl = fncOrdenaLegajos([Legajo],[Nº]);

Cuando la guardes y la ejecutes, se te actualizará la tabla con los mismos valores que los que te mostraba la consulta.

Método 3:

En un módulo independiente pones este código (requiere tener la función del método 2):

Public Sub Ordena()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("CONTROLES")
Do Until rst.EOF
    rst.Edit
    rst("NumControl") = fncOrdenaLegajos(rst("Legajo"), rst("Nº"))
    rst.Update
    rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub

Con el cursor en cualquier linea entre en Public Sub y el End Sub, pulsas F5 y "voilá": tabla actualizada

Una variación sería ponerlo como código asociado aun botón de un formulario, en cuyo caso en vez de ponerlo en un módulo, lo pones en el evento asociado al botón de esta forma:

Private Sub ..._Click()
Dim rst As Recordset
Set rst = CurrentDb.OpenRecordset("CONTROLES")
Do Until rst.EOF
    rst.Edit
    rst("NumControl") = fncOrdenaLegajos(rst("Legajo"), rst("Nº"))
    rst.Update
    rst.MoveNext
Loop
rst.Close
Set rst = Nothing
End Sub

Un saludo


Vaya, te había preparado un ejemplo, pero me olvidé de adjuntarlo...

Aquí lo tienes: http://www.filebig.net/files/QewETPH49W 

Las consultas que acaban en v1 son las del método 2 y las que acaban en v2 las del método 1, porque los puse de menor a mayor "dificultad", je je

Genial!!! Muchísimas gracias Sveinbjorn! Funciona perfecto ya el primer método y fuiste muy rápido para responder... aparte de muy didáctico.

Te agradezco mucho!

NO hay de qué. Me alegro que te sirviera y aprendieras cosas nuevas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas