Autonuméricos

Necesito crear un campo que incremente su valor numérico de uno en uno y con el siguiente formato; 001/2003, 002/2003, 003/2003 y así sucesivamente. También necesito que al cambiar el año el registro se ponga a cero y salga el año en vigor, de esta forma; 001/2004, 002/2004 etc. Los autonuméricos no me sirven porque si borras un registro salta al siguiente.
4

4 respuestas

Respuesta
1
Aúpa,
¿Qué tal la entrada del nuevo año?, espero que bien.
Bueno, vamos a ver si podemos resolver tu duda...
En efecto, como bien dices, un campo autonumérico no te va a servir para lo que quieres hacer: necesitas un campo de texto con al menos 8 posiciones de longitud. Este código habrá que calcularlo separándolo en dos partes (Número y AñoEnCurso)
Para poder generar el código, te recomiendo que utilices una tabla auxiliar. Una tabla que únicamente tendrá dos campos:
* Numero: de tipo texto, longitud 3. Este campo va a guardar el último número que hayas generado 001, 002, 003,... así, siempre sabrás, al crear un nuevo registro, cual es el nuevo número que tienes que asignar al nuevo registro.
* AnnoEnCurso: de tipo texto, longitud 4. Este campo va a guardar el año en curso.
Con estos dos campos ya podemos llevar la numeración que deseas. El procedimiento a seguir para obtener un código nuevo sería:
Al crear un nuevo registro:
1. Recoger de la tabla auxiliar el valor del campo Numero
2. Incrementar el valor del campo Numero
3. Guardar el valor de Numero incrementado en la tabla auxiliar
4. Asignar al Código el valor de Numero incrementado
5. Añadir al código el carácter /
6. Recoger de la tabla auxiliar el valor del Campo AnnoEnCurso
7. Añadir al código el valor de AnnoEnCurso
Si te manejas bien en VISUAL BASIC, te resultará fácil implementar este pequeño algoritmo (si tienes pegas, no dudes en consultarme). La solución en Visual Basic te resultará mucho más versátil y potente.
Si no quieres meterte en Visual Basic, puedes hacer lo mismo con un par de consultas. Te indico el modo:
Supón que tenemos una tabla (llamada Tabla1) con un campo llamado Código donde vamos a guardar los códigos de 8 caracteres con el formato 001/2003, 002/2003, 003/2003...
* CONSULTA 1
Esta consulta va a crear un registro nuevo de la tabla Tabla1, y va a asignar al campo Código un valor basado en los datos de la tabla Auxiliar ((Numero + 1) & "/" & AnnoEnCurso). En este caso he utilizado una consulta de inserción, que directamente me crea un registro nuevo con el código pseudo-autonumérico. El código SQL de la Consulta sería:
INSERT INTO Tabla1 ( Codigo )
SELECT (Format([Numero]+1,"000")) & "/" & [AnnoEnCurso] AS Expr1
FROM Auxiliar;
Como ves, utilizo la función Format para que el número mantenga las tres cifras, y se rellene a ceros por la izquierda.
* CONSULTA 2.
Esta consulta, simplemente incrementa el campo Numero de la tabla Auxiliar y lo guarda. La instrucción SQL sera:
UPDATE Auxiliar SET Auxiliar.Numero = Format([Numero]+1,"000");
Por tanto, te basta con llamar a estas dos consultas para crear un registro nuevo con su correspondiente código, y actualizar el número de secuencia.
II. Como actualizar el número de año.
------------------------------
Para controlar el cambio de año, basta con comprobar cada vez que se arranque la aplicación si el año de la fecha del sistema coincide con el año que tenemos guardado en la tabla auxiliar.
Si el año no coincide, habrá que actualizar el valor del campo AnnoEnCurso de la tabla auxiliar, y poner a 000 el campo numero.
En este caso, el algoritmo a seguir sería:
1. Obtener el año actual de la fecha del sistema
2. Obtener el campo AnnoEnCurso de la tabla Auxiliar
3. Si año actual <> AnnoEnCurso Entonces
3.1. Reiniciar la numeración (Numero =000)
3.2. Modificar AnnoEnCurso=Año Actual.
La manera de implementarlo sería la siguiente:
1. Crea una consulta (Vamos a llamarle, por ejemplo: ActualizaNumeracion).
Esta consulta será la que inicialice el campo Numero a 000, y obtenga el año actual. El código SQL de la consulta sería:
UPDATE Auxiliar SET Auxiliar.Numero = "000", Auxiliar.AnnoEnCurso = Year(Now());
2. Crea una Macro, y guardala con el nombre: AutoExec
Si guardas la macro con este nombre, se ejecutará automáticamente cada vez que inicies tu aplicación. En esta Macro es donde vamos a comprobar si el año en curso ha cambiado, y en tal caso, llamaremos a la consulta que hemos creado antes.
2.1 Activa la columna "Condiciones" de la macro (pulsa el botón "Condiciones" de la Varar de Herramientas)
2.2. En la columna CONDICIÓN de la primera línea de la macro, introduce lo siguiente:
DBúsq("AnnoEnCurso";"Auxiliar")<>Formato(Año(Ahora());"0000")
Esto compara el campo AnnoEnCurso de la tabla Auxiliar con el año de la Fecha del sistema.
[ Si tienes instalada la versión de Access en Inglés, deberás escribir: DLookup("AnnoEnCurso";"Auxiliar")<>Format(Year(Now());"0000") ]
2.3. En la columna ACCIÓN de la primera Línea de al Macro, introduce lo siguiente:
AbrirConsulta (En la parte de abajo, pon en Nombre de Consulta: ActualizaNumeracion)
3. Guarda la Macro
Ahora, cada vez que abras la aplicación, te realizará automáticamente la comprobación, y actualizará el año cuando este haya cambiado.
Espero que con esto haya podido resolver el problema o al menos, haberte aportado alguna pista. Me resulta difícil poder concretarte más la solución sin conocer tu Base de Datos. Cualquier duda o pega, no dudes en consultarme.
Un abrazo,
Javi
Respuesta
1
Tendrás que utilizar un poco de código (o una consulta) que te devuelva el máximo del número de ese campo, luego le sumas uno y ya lo tienes.
E.G. de consulta
"Select Max(left(Contador, len(contador)-5)) as Maximo from Tabla"
en Maximo tendrás el máximo del número. Entonces número a asignar= Maximo +1
Max([Campo]) devuelve el mayor valor de un número
como tu formato es 001/2003 yo calculo el máximo de los tres dígitos de la izquierda, es decir el máximo de la parte izquierda de coger todos los dígitos del campo -5 (cuatro para el ejercicio y uno para la barra inclinada).
Otra forma quizá mejor sería tener dos campos uno para el año y otro para el contador poniendo la barra al imprimir o mostrar en pantalla. Entonces con que utilizaras Max([Campo]) sería suficiente.
Respuesta
1
Pues lo que tienes que hacer es colocar el siguiente código en un botón de comando de un formulario:
DoCmd. GoToRecord acDataForm, "Nombre_formulario", acNewRec
valor = Trim(Str(DMax("val(left(codigo,3))", "nombre_de_la_tabla", "val(right(codigo,4))=year(date())") + 1))
valor = IIf(IsNull(valor), "1", valor)
codigo.value = IIf(Len(valor) = 1, "00" & valor, IIf(Len(valor) = 2, "0" & valor, valor)) & "/" & Year(Date)
Con estas instrucciones se supone que debes tener un campo llamado "codigo" en una tabla cualquiera. El campo debe ser carácter y en el formulario el cuadro de texto que muestra el código debe llamarse "Codigo".
Espero te sirva, en cualquier cosa no dudes en preguntar.
Respuesta
1
Algo parecido a esto:
Private Sub Form_Load()
Dim miBd As DAO.Database
Dim miRs As DAO.Recordset
Dim miAnio As Integer
miAnio = Format(Now, "yyyy")
Set miBd = CurrentDb()
Set miRs = miBd.OpenRecordset("select max(cont) from Tabla2 where anio = " & miAnio)
MsgBox miRs.Fields(0)
miRs.Close
miBd.Close
Set miRs = Nothing
Set miBd = Nothing
End Sub
Esto saca de la tabla tabla2 el campo cont, que es el numérico más alto para el año en curso. Esta tabla tiene un campo anio y otro campo cont, y esos dos campos forman la PORQUE de dicha tabla.
Te recomiendo que hagas algo parecido en tu aplicación, porque te será más cómodo que andar metiendo guinoes en los campos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas