none
Enumerar Filas de una columna de tabla con base a columna de otra tabla de la misma base RRS feed

  • Pregunta

  • Mi pergunta radica en lo siguiente:
    Tengo dos tablas en access 2007, y quiero enumerar las filas de una de las tablas de la siguiente manera

    la Tabla1 tiene n filas (para el ejemplo 4)


                     Tabla1
    Nombre             Numusuario
      juan                          1
     pedro                         2
      jose                          3
    andres                        4

    La Tabla2 tiene muchos campos (para el ejemplo 10)

                  Tabla2 
      id                numusuario
    001                        NULL
    002                        NULL
    003                        NULL 
    004                        NULL
    005                        NULL 
    006                        NULL  
    007                        NULL    
    008                        NULL     
    009                        NULL   
    0010                      NULL

    La idea es tomar el numero de campos de la Tabla1 y asignar uno a uno a la columna numusuario de la tabla 2.
    Es decir, la Tabla1 tiene 4 campos y la cosa es actualizar la Tabla2 de la siguiente forma en un consecutivo:

                  Tabla2
      id                        numusuario
    001                              1 
    002                              2
    003                              3
    004                              4
    005                              1
    006                              2
    007                              3
    008                              4
    009                              1
    0010                            2                             
    .                                    .
    .                                    .
    .                                    .

    Si Tabla1 tuviera 7 campos, la asignacion de numusuario en Tabla2 iría 1,2,3,4,5,6,7,1,2,3..., Y asi seria la cosa, si alguien me puede ayudar quedaria muy agradecido.

    Gracias...


    martes, 18 de marzo de 2014 12:42

Respuestas

  • Hola,

    Al leer tu mensaje interpreto que cuando hablas de campos te refieres a registros.

    Esto con programación es bastante sencillo, aunque hay que tener en cuenta varios aspectos:

    1. Voy a suponer que el número de usuarios de la Tabla1 es el número de registros que contenga la tabla, ya que también podría ser el valor mayor del campo "numusuario" si el número se asignase consecutivamente y no hubiera saltos.
    2. Voy a suponer que el número de registros de la Tabla2 es indefinido y la asignación del número de usuario finalizará cuando ya no haya más registros, se haya completado la serie "numusuario" o no.
    3. Voy a realizar esta acción en un procedimiento, el cual podría ser asociado al evento Click de un botón de un formulario o alojado en un módulo y procesado en modo interactivo y llamado por una macro.

    Sub PonNumeros()

      Dim Db as Database, Rs1 as Recordset, UsuariosTabla1 as long, VoyPorNumero as long

      Set Db =currentdb

      'Obtengo el nº de usuarios de tabla1 (nº de registros)

      UsuariosTabla1 = DCount("Nz(NumUsuario)","Tabla1")    

      'Abro la Tabla2 ordenada por el campo ID para proceder a cumplimentar, secuencialmente, el campo NumUsuario

      Set Rs1= Db.Openrecordset("Select * From Tabla2 Order By ID;", DbOpenDynaset)

      'Cumplimento secuencialmente el campo NumUsuario

      VoyPorNumero=1 

      Do Until Rs1.Eof

        Rs1.Edit

        Rs1!NumUsuario = VoyPorNumero

        Rs1.Update

        Rs1.MoveNext 

        VoyPorNumero = VoyPorNumero + 1

        If VoyPorNumero > UsuariosTabla1 Then

          VoyPorNumero = 1   'Acabamos de asignar el último nº de usuario y restablecemos el contador a 1

        End If

      Loop

      Rs1.Close 

      Set Rs1 = Nothing

      Set Db = Nothing

    End Sub

    Te lo he programado directamente sobre la respuesta. Espero que te funcione.

    Suerte.

    • Marcado como respuesta Yubell Muñoz miércoles, 19 de marzo de 2014 12:56
    miércoles, 19 de marzo de 2014 10:53
  • Buen dia, agradezco tu respuesta, haciendo un analisis rapido parece ser que serviria, pero afortunadamente lo solucione hace unas horas, de cualquier forma agradezco que te hayas tomado el tiempo para resolverme la situacion :p.

    Agrego el codigo que utilicé por si a alguna persona le puede servir mas adelante:

    Este código esta asignado al evento click de un boton

    Dim db As Database
    Dim rs As Recordset

    cantusers = DCount("numusuario", "Tabla1")
    cantid = DCount("id", "Tabla2")
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Tabla2")
          
        For r = 1 To (cantid)
            If Not rs.EOF Then
                If IsNull(rs("numusuario")) Then
                    rs.Edit
                    rs("numusuario") = r
                    rs.Update
                    rs.MoveNext
                    Else
                    rs.MoveNext
                End If
                    If r Mod cantusers = 0 Then r = 0
            Else
            'msg = MsgBox("No hay registros", vbOKOnly, "Terminado")
            End If
        Next r

    • Marcado como respuesta Yubell Muñoz miércoles, 19 de marzo de 2014 12:56
    miércoles, 19 de marzo de 2014 12:55

Todas las respuestas

  • Hola,

    Al leer tu mensaje interpreto que cuando hablas de campos te refieres a registros.

    Esto con programación es bastante sencillo, aunque hay que tener en cuenta varios aspectos:

    1. Voy a suponer que el número de usuarios de la Tabla1 es el número de registros que contenga la tabla, ya que también podría ser el valor mayor del campo "numusuario" si el número se asignase consecutivamente y no hubiera saltos.
    2. Voy a suponer que el número de registros de la Tabla2 es indefinido y la asignación del número de usuario finalizará cuando ya no haya más registros, se haya completado la serie "numusuario" o no.
    3. Voy a realizar esta acción en un procedimiento, el cual podría ser asociado al evento Click de un botón de un formulario o alojado en un módulo y procesado en modo interactivo y llamado por una macro.

    Sub PonNumeros()

      Dim Db as Database, Rs1 as Recordset, UsuariosTabla1 as long, VoyPorNumero as long

      Set Db =currentdb

      'Obtengo el nº de usuarios de tabla1 (nº de registros)

      UsuariosTabla1 = DCount("Nz(NumUsuario)","Tabla1")    

      'Abro la Tabla2 ordenada por el campo ID para proceder a cumplimentar, secuencialmente, el campo NumUsuario

      Set Rs1= Db.Openrecordset("Select * From Tabla2 Order By ID;", DbOpenDynaset)

      'Cumplimento secuencialmente el campo NumUsuario

      VoyPorNumero=1 

      Do Until Rs1.Eof

        Rs1.Edit

        Rs1!NumUsuario = VoyPorNumero

        Rs1.Update

        Rs1.MoveNext 

        VoyPorNumero = VoyPorNumero + 1

        If VoyPorNumero > UsuariosTabla1 Then

          VoyPorNumero = 1   'Acabamos de asignar el último nº de usuario y restablecemos el contador a 1

        End If

      Loop

      Rs1.Close 

      Set Rs1 = Nothing

      Set Db = Nothing

    End Sub

    Te lo he programado directamente sobre la respuesta. Espero que te funcione.

    Suerte.

    • Marcado como respuesta Yubell Muñoz miércoles, 19 de marzo de 2014 12:56
    miércoles, 19 de marzo de 2014 10:53
  • Buen dia, agradezco tu respuesta, haciendo un analisis rapido parece ser que serviria, pero afortunadamente lo solucione hace unas horas, de cualquier forma agradezco que te hayas tomado el tiempo para resolverme la situacion :p.

    Agrego el codigo que utilicé por si a alguna persona le puede servir mas adelante:

    Este código esta asignado al evento click de un boton

    Dim db As Database
    Dim rs As Recordset

    cantusers = DCount("numusuario", "Tabla1")
    cantid = DCount("id", "Tabla2")
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Tabla2")
          
        For r = 1 To (cantid)
            If Not rs.EOF Then
                If IsNull(rs("numusuario")) Then
                    rs.Edit
                    rs("numusuario") = r
                    rs.Update
                    rs.MoveNext
                    Else
                    rs.MoveNext
                End If
                    If r Mod cantusers = 0 Then r = 0
            Else
            'msg = MsgBox("No hay registros", vbOKOnly, "Terminado")
            End If
        Next r

    • Marcado como respuesta Yubell Muñoz miércoles, 19 de marzo de 2014 12:56
    miércoles, 19 de marzo de 2014 12:55