Crear un autonumérico en un subformulario

Como estas.
Sucede que dentro de mi formulario principal tengo un subformulario en vista hoja de datos. Ambos ligados a diferentes tablas.
Paso registros del formulario principal al subform por medio de un botón de comando. Dentro del subform hay un campo llamado [Articulo] y pretendo que este campo numero los registros que van entrando al subform, tipo autonumérico.
He visto muchos ejemplos pero no se como acomodarlos a mis necesidades aquí te pongo algunos
Uno de los códigos para simular el autonumérico es este:
Private Sub Form_Current() 
Articulo = Nz(DMax("Articulo", "ShoppingList"), 0) + 1 
End Sub 
Como veras el código lo coloco en el evento al activar registro del subform, pero hace esto: supongamos quiero agregar 3 registros azul, amarillo y rojo
agrego el primero:
Articulo NomPro
---1--- -azul- 
Agrego el segundo registro
Articulo Nompro
---2--- -azul- 
------- Amarillo
Agrego el tercer registro
Articulo NomPro
---3--- -azul- 
------- amarillo 
-------  --rojo-- 
Lo que pretendo que haga es esto:
Articulo NomPro
---1--- -azul- 
Agrego el segundo registro
Articulo Nompro
---1--- -azul- 
---2--- Amarillo
Agrego el tercer registro
Articulo NomPro
---1--- -azul- 
---2--- amarillo 
---3--- --rojo-- 
Creo que esto es porque el subform esta en vista hoja de datos. Me han pasado funciones que deberían simular el autonumérico y las llamo desde el evento al activar registro del subform pero algunas mandan errores y otras solo funcionan para el primer registro pero al agregar más ya no pasa nada se queda el campo vacío, incluso me dijeron que lo hiciera con una consulta y creara un campo llamado contador y pegara esto:
Contador: DCont("Campo_simulaCont";"NombreTabla";"Campo_simulaCont <= " & [Campo_simulaCont])
Pero utilizar la consulta implicaría modificar código de la base por lo que no lo creo conveniente, como veras estoy desesperado por eso acudo ati si necesitas el código de las funciones que me han pasado con mucho gusto te lo proporciono.

1 respuesta

Respuesta
1
En primer lugar disculpa el retraso pero cada día tengo más preguntas y menos tiempo.
Por lo que veo, el subformulario está actualizando siempre el número de artículo del primer registro, mientras que tu quieres que lo haga con el último.
Lo que haría es poner el número de artículo cuando insertas el registro desde el formulario.
Supongo que en el formulario tendrás un botón o algo que haga insertar el registro en la segunda tabla. Es en ese punto donde, junto con el resto de datos, deberías poner el número de artículo usando la función "Nz(DMax("Articulo", "ShoppingList"), 0) + 1".
Pruébalo o dime cómo realizas el "insert" de la segunda tabla y vemos cómo hacerlo.
Excelente santiago funciono de maravilla, ya agrega el numero de registro entrado en la tabla, pero que pasa si borro uno ya no serian concurrentes, osea, si meto los registros 1, 2, 3, 4, 5 y borro el registro numero 2 la secuencia quedaría 1, 3, 4, 5 y ya no serian concurrentes como podría solucionar ese problema.
Bueno se me ocurre hacer un conteo del total de registros con el RecordCount pero como le indico que vaya checando la concurrencia de los números en ese campo y que si no lo es, lo haga concurrente
El código de mi Botón de comando con el cual transfiero el registro activo del formulario principal al subformulario es este:
Private Sub cmdAddList_Click()
If Ejemplares = 0 Then
MsgBox "No hay Existencias", vbExclamation + vbOKOnly, "Alerta"
Exit Sub
Else
DoCmd.SetWarnings False
DoCmd.RunSQL "Insert Into  ShoppingList(NCompra, Articulo, CodBar, Autor, Titulo, Editorial, PrecioD, Factura, FechaVenta)values ('" & txtNCompra.Value & "','" & Nz(DMax("Articulo", "ShoppingList"), 0) + 1 & "','" & CodBar.Value & "', '" & Autor.Value & "','" & Titulo.Value & "','" & Editorial.Value & "','" _
& txtPrecDesc.Value & "','" & Factura.Value & "','" & txtDateIn.Value & "')"
DoCmd.Requery "Lista"
Me.Requery
DoCmd.SetWarnings True
End If
End Sub
Mi formulario Principal se llama "frmLibros" (Ligado a la tabla "Libros") y el subformulario se llama "Lista" (Ligado a la tabla "ShoppingList").
Ejemplares es un campo del formulario principal así como también los son los campos dentro del primer paréntesis del "Insert to ShoppingList".
Y tengo otro formulario llamado "Delrecords" de la misma tabla ShoppingList que se usa para borrar registros por lo que también actualiza a "Lista". Pienso que aquí podría colocar el código para checar la concurrencia que te menciono arriba en el evento al cerrar ya que este formulario se abre desde un botón en el formulario Principal "frmLibros".
Espero puedas ayudarme nuevamente gracias y se aceptan ideas y comentarios...
Saludos desde la Zona Metropolitana de la Ciudad de México.
Si lo que buscas es simular un autonumérico, la forma es la que habíamos puesto... hasta cierto punto, porque si borrabas el último la función reutilizaría el mismo número de registro.
Otra cosa es si quieres reutilizar todos los números borrados. En ese caso toca programar.
Tendrás que poner el siguiente código en un módulo cualquiera:
Option Compare Database
Option Explicit
Function buscaNumeroArticuloLibre() As Long
    Dim rs As Recordset
    Dim txtSql As String
    Dim n As Long
    txt = "select articulo from ShoppingList order by articulo"
    Set rs = CurrentDb().OpenRecordset(txtSql, dbOpenDynaset)
    If rs.EOF Then
        buscaNumeroArticuloLibre = 1 ' No hay ninguno anterior
      Else
        rs.MoveLast
        If rs!articulo = rs.RecordCount Then ' No hay ninguno borrado
            buscaNumeroArticuloLibre = rs!articulo + 1
          Else
            ' Han borrado algún artículo. Los recorremos todos para buscar un hueco
            rs.MoveFirst
            Do While rs!articulo = rs.AbsolutePosition + 1
                rs.MoveNext
            Loop
            buscaNumeroArticuloLibre = rs.AbsolutePosition + 1
        End If
    End If
    rs.Close
End Function
Y después modificar donde ponías...
    Nz(DMax("Articulo", "ShoppingList"), 0)
... poner:
    BuscaNumeroArticuloLibre()
Con eso te reutilizará los números de artículo que borres.
Muchísimas gracias santiago no es exactamente lo que buscaba pero lo he ajustado a mis necesidades y ya quedo. Te dejo un excelente amigo y muchas gracias de nuevo poca gente como tu.. bye

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas