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
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
- Compartir respuesta