Crear formulario con campo autonumérico que se reinicie al crear nuevo registro

Estoy realizando un formulario llamado CotRegistroFrmArt para cotizaciones que se alimenta de una tabla llamada AlmTbAlmacen para los artículos a cotizar.

En el formulario CotRegistroFrmArt quiero colocar un campo autonumérico llamado IdArticulo que debe reiniciar el contador en cada nuevo registro por lo que no puedo usar la autonumeración que trae access. Este debe llenarse para cada artículo que ingrese en el campo Codigo que debe iniciar para cada nuevo registro en el formulario con 0001 e ir en orden ascendente con cada artículo ingresado.

La verdad no tengo idea como hacerlo, por lo que les adelanto no soy un experto en esto.

1 Respuesta

Respuesta
1

A modo rápido:

1) Supongo que algo de VBA sabes.

2) El objetivo es que con VBA haces una consulta sobre la tabla AlmTbAlmacen de modo que buscas el último registros filtrando con el campo Código de modo que ha este dato solo has de sumar uno. Evidentemente si el DCOUNT responde 0, colocar el primer "orden" deseado.

Si tienes algún problema te realizo un ejemplo para que lo tengas más claro.

Gracias por responder, bueno olvidé decir inicialmente que no soy un experto.

En realidad lo que busco es crear un contador de artículos cotizados en el formulario CotRegistroFrmArt.  

IdArticulo es el campo que contará cada articulo cotizado, el campo que contiene los artículos cotizados de la tabla AlmTbAlmacen se llama Codigo que es donde se eligen.

Lo que quiero es algo así

IdArticulo   Codigo                  Almacen   Cantidad     Precio

        0001   YT580058668      REP01             4              25.00

       0002   YT580048839       REP01              1             14.00

Esto es para llevar un orden de los artículos cotizados para posteriormente cuando filtre la cotización solo filtre lo enumerado para cada cotización realizada.

Gracias por el apoyo que puedan dar.

Saludos,

Yo lo he entendido así:

IdArticulo   Codigo                  Almacen   Cantidad     Precio

        0001   YT580058668      REP01             4              25.00

       0001   YT580048839       REP01              1             14.00

       0002   YT580048839       REP01              5             14.00

¿Es correcto?

Gracias por responder amigo. IdArticulo para explicarme mejor viene siendo como el Item. Por eso mi necesidad que valla ascendiendo y no puedo tomarlo de la tabla  AlmTbAlmacen porque van a guardarse en una tabla llamada CotRegistroTB, y será para llevar el orden de los registros de cada cotización. Al hacer una nueva cotización esta iniciará en 0001

IdArticulo   Codigo                  Almacen   Cantidad     Precio

        0001   YT580058668      REP01             4              25.00

       0002    YT580048839       REP01              1             14.00

       0003    YT580048839       REP01              5             14.00

Saludos y gracias de antemano por tu dedicación y deseando puedas ayudarme.

Creo que ya lo he entendido. Te refieres a que el formulario CotRegistroFrmArt que en realidad es la tabla CotRegistroTB necesitas colocar este autonumerico como si cada "cotización" (no entendía del todo este termino, creo que es lo que yo llamaría un presupuesto) fuera en una tabla independiente con un autonumérico.

Llegados a este caso hay dos maneras:

Una fácil y otra menos fácil:

Comento la fácil que yo creo que será muy valida:

Si no requieres de orden manual (o sea que llegado el caso) en este orden:

IdArticulo   Codigo                  Almacen   Cantidad     Precio

        0001   YT580058668      REP01             4              25.00

       0002    YT580048839       REP01              1             14.00

       0003    YT580048839       REP01              5             14.00

quieras pasar a este:

IdArticulo   Codigo                  Almacen   Cantidad     Precio

        0001   YT580058668      REP01             4              25.00

       0002    YT580048839       REP01              5             14.00

       0003    YT580048839       REP01              1             14.00

O lo que es lo mismo, que siempre mantengas el orden de ingreso, entonces ejecutar una simple consulta al insertar un nuevo campo o al salir del mismo te generará el preciado IdArtículo. Te explico el truco.

Coloca un autonumérico en la tabla CotRegistroTB (Bueno esto siempre es recomendable para poder editar los registros de manera segura). Utilizaras este orden para ir añadiendo IdArticulo.

Public Function ren(COTIZADOACTUAL)
miSQL = "SELECT [IdArticulo] " & _
    " FROM [CotRegistroTB ] " & _
    " WHERE IDCOTIZADO = " & COTIZADOACTUAL& " ORDER BY IdAUTONUMERICO ASC;"
    Set db = CurrentDb
    Set qry = db.CreateQueryDef(nickcon, miSQL)
    Dim rs As Recordset
    ' activamos la BD
    ' Creamos el Recordset:
    Set rs = db.OpenRecordset(miSQL)
    ' Recorremos el recordset:
    If Not rs.RecordCount > 0 Then Exit Function
    rs.MoveFirst
    i = 1
    Do While Not rs.EOF
            rs.Edit
            rs.Fields("ordenB").Value = i
            rs.Update
            i = i + 1
        ' Pasamos al siguiente registro:
        rs.MoveNext
    ' Cerramos el bucle
    Loop
    rs.Close
    Set rs = Nothing
End Function

Llamando a esta función con el COTIZADOACTUAL en el que estás trabajando, renumerará todos los idarticulo (por cierto te recomiendo que sea un número, luego tu ya en los formulario de salida o informe lo formateas como quieras con ceros delante, letras, eso es lo de menos, pero guardando como número te ahorras muchos problemas de conversión en ese momento.)

Otro modo sería haciendo un DCOUNT y colocando el siguien número, pero corres el riesgo si eliminas un registro, ya que el count solo renombrará los nuevos, pero los ya creados mantendrán su número, con la anterior siempre actualiza todos los idarticulo, con lo que no tienes problema con los eliminados, solo hay que llamar a la función cuando introduzcas un nuevo registro o cuando elimines.

Si no sabes llamar a una funcion, me lo comentas y te paso un ejemplo sencillo, no es complicado.

Por último indicarte de un modo u otro algo de VBA has de tocar, porque los eventos numerarán los registros.

Gracias por tu ayuda, de verdad tu información me ayudó a completar. Estaba tratando de adaptar un ejemplo similar al tuyo que dejaré para ayuda futura y algunas condiciones que tuve que agregar debido a que el código original cambiaba los números hasta de los artículos ya ingresados.

Option Explicit
Function busqItemLibre() As Long
    Dim rs As Recordset
    Dim txtSql As String
    Dim n As Long
    txtSql = "select Item from CotRegistroCns order by Item"
    Set rs = CurrentDb().OpenRecordset(txtSql, dbOpenDynaset)
    If rs.EOF Then
        busqItemLibre = 1 ' No hay ninguno anterior
    Else
        rs.MoveLast
        If rs!Item = rs.RecordCount Then ' No hay ninguno borrado
            busqItemLibre = rs!Item + 1
        Else
            ' Han borrado algún Item. Los recorremos todos para buscar un hueco
            rs.MoveFirst
            Do While rs!Item = rs.AbsolutePosition + 1
                rs.MoveNext
            Loop
            busqItemLibre = rs.AbsolutePosition + 1
        End If
    End If
    rs.Close
End Function

En el cuadro combinado Codigo en el evento Después de Actualizar ingresé las acciones junto con la siguiente condición que evita re-editar los campos ya ingresados y rellenar los que se han eliminados

Private Sub Codigo_AfterUpdate()
   If Item > 0 Then
        Item = Item
    Else
        Item = busqItemLibre
    End If
End Sub

Saludos y bendiciones por ahí te molesto con otras consultas.

El problema que me queda es que con el nuevo registro del formulario este IdArticulo que lo cambie por Item para mejor interpretación continua con el número siguiente, no reinicia a 1 como requiero. Para esto estoy ejecutando desde la consuta llamada CotRegistroCns puedo filtrar NCotizacion que es el número de cotización que se guardará en esta tabla igualmente. El problema es que para lograr esto tengo que guardar NCotizacion para cada Item registrado, puedo colocar como Valor predeterminado de la hoja de propiedades, pero esto me obliga desde el inicio del formulario tener ya el NCotización y en caso que quiera cambiar datos del cliente (NCliente) que se guardan en esta tabla no pudiera hacerlos con sólo guardar. Los datos de NCliente NCotizacion me ayudaran a filtrar la cotización deseada.

Saludos y espero me puedas ayudar

Lo he leído varias veces, pero sin las tablas y sus relaciones no soy capaz a entender el problema. Hasta lo de tener NCotización más menos, pero no entiendo que tiene que ver con NCliente.

¡Gracias! Amigo

Ya logré solucionar el problema pero haré las consultas en una nueva pregunta.

NCotizacion es el número de cada cotización que contiene ciertos artículos.

NCliente es un código asignado al cliente para no utilizar el nombre completo.

Saludos y bendiciones

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas