Personalizar ID o código en Access

Tengo una base de datos y una tabla de usuarios, existen 3 tipos de usuarios:

Programador

Administrador

Usuario general

Lo que necesito es que al ingresar un nuevo usuario el ID. O código se incremente desde 1 pero con una letra, en este caso la primera letra de usuario, por ejemplo si es un usuario Administrador que sea A1, A2, A3... Y si es una usuario general U1, U2... O programador P1, P2, P3

Please!

2 Respuestas

Respuesta
2

Yudith, ¿Te refieres a esto?

Tienes que hacerlo desde un formulario ya que las tablas no tienen código. Pon el control Idusuario como bloqueado, para que nadie pueda intentar cambiarlo por la fuerza y en la tabla pon el campo IdUusario como clave.

Luego en las propiedades del combinado, en Eventos-Después de actualizar crea un procedimiento de evento y escribe

Private Sub Tipo_AfterUpdate()
IdUsuario = Left([Tipo], 1) & Nz(DCount("*", "usuarios", "tipo like '" & Me.Tipo & "'")) + 1
End Sub

Tengo que poner el IdUsuario el último porque antes "tengo que averiguar" si va a ser Programador, administrador o usuario.

Gracias! Estoy intentando pero no me ha resultado, yo tengo algo así lo ideal sería que quede como lista, ya que se ingresaría solo un usuario a la vez.

O el ID. Lo puedo dejar en una esquina. 

Si no es molestia me puedes detallar un poco más ? 

Por partes, si el formulario tiene como origen de registros la tabla Usuarios, no necesitas para nada el botón Guardar. Access, por defecto, ya te lo guarda en la tabla. Por el contrario, si el formulario fuera independiente, tampoco lo necesitarías ya que en el mismo evento que te dije antes, en este caso del control Nivel de seguridad puedes poner la instrucción de anexar registros a la tabla Usuarios. Pero si es tu gusto tener el botón. Sigue manteniendo bloqueado el control Id_usuario y déjalo donde quieras, y en el evento Al hacer clic del botón creas un procedimiento de evento y lo pones como

Private Sub Nivel_Seguridad_AfterUpdate()
IdUsuario = Left([nivel_seguridad], 1) & Nz(DCount("*", "usuarios", "nivel_seguridad like '" & Me.nivel_seguridad & "'")) + 1
docmd.runcommand accmdsaverecord
End Sub

Me explico. Una vez que pulsas el botón, por un lado coge la primera letra de la izquierda del control Nivel_seguridad, es lo de

Left([nivel_seguridad],1)

Por otro lado cuenta cuantos registros hay en la tabla Usuarios hay con ese nivel de seguridad. Y a esa cantidad le añade un 1. Y concatena ambos valores

Y lo de docmd... es para que te guarde el valor

Lógicamente la primera vez que escribas de un nivel de seguridad, antes no hay nada, es nulo, por eso uso la función Nz, que si la pones tal como está te transforma los nulos en ceros, para poder sumarle un 1.

La función Nz que significa NullZero, antiguantemente sólo transformaba los nulos en ceros, para poder sumar los registro. Pero desde el 2007 hace lo que quieras(advierto, no cocina ni lava la ropa)

TextoA=nz([textoB])    si texto b es nulo TextoA=0

TextoA=nz([textoB],4) si textob es nulo TextoA=4

TextoA=Nz([textoB],"Adios Yudith")   si texto B es nulo texto A es lo que te digo

Eso en código VB, si lo pones en el origen de un control o en una consulta tienes que cambiar la coma por punto y coma

De todas formas, cualquier cosa que necesites dímelo o si quieres, repito, si quieres, unos ejemplos de como lo haría mándame un mensaje (sólo el mensaje) a [email protected] y te los envío. Si haces esto último, en el asunto del mensaje pon tu alias Yudith, ya que si no sé quien me escribe ni los abro.

¡Gracias! 

Voy a responder a unas afirmaciones que se hacen. ¿Qué pasaría si Pepe cambiara de sexo? Pues que se llamaría Pepa. Si tengo la tabla Usuarios a la que le añado un campo Id(sólo para ordenar, ya que idusuario es texto)

Cuando voy dando de alta a los diferentes usuarios

Puedes ver que en ese momento hay dos administradoras. Le cambio el tipo a Pepe

Hasta ahora es lógico,. No le va a quitar el puesto a María, ya que Pepe es un recién llegado como Administrador. Ahora vuelvo a degradarlo a simple programador

En este caso, aunque me parezca..., para evitar sufrimientos a alguien, pulso el botón, aunque podría ser en cualquier otro evento y

Ya está restablecido el orden constitucional. El código del botón, pero ya te dije que podría ser cualquier otro evento es

Private Sub Comando7_Click()
DoCmd.GoToRecord , , acFirst
Dim i As Byte
For i = 1 To Me.Recordset.RecordCount
IdUsuario = Left([Tipo], 1) & Nz(DCount("*", "usuarios", "tipo like '" & Me.Tipo & "' and id<=" & Me.Id & ""))
DoCmd.GoToRecord , , acNext
Next
End Sub

O sea, vete al primer registro, actualizame el valor de Idusuario a las nuevas circunstancias teniendo en cuanta que el valor de Id sea igual o menor que el que se debía ver pero lo he puesto como oculto en el formulario, vete al siguiente registro y lo mismo y así hasta el final. Osea, repone los Idusuarios a su valor lógico.

¡Gracias!  Por fin me ha resultado, tenía una relación que hacía que igual el nivel de seguridad lo tomara como números pero ya lo he arreglado, de verdad muchas gracias y seguramente volveré a molestar por otras cosas 🙊.

Hablé muy rápido, funciona pero cuando quise agregar otro usuario también lo deja como A1 y el A1 ya estaba registrado.

Es imposible por dos razones

1º Si pusiste el campo Idusuario, como te dije, como clave no se puede repetir ningún valor.

2º Tu misma pudiste ver en las imágenes que le asigna el número correlativo

De todas te ofrecí mi correo para enviarte ejemplos.

Respuesta
1

¿Qué pasa si en la solución que le dan cambia el usuario Pepe de Programador a Administrador?. Cambiaría el idUsuario a A2, Correcto, ¿pero qué sucede si vuelve y lo cambia por Programador?. Le arrojaría como usuario P2, lo cual no es correcto y se estaría perdiendo el idusuario P1. Y así sucesivamente hasta que se intenta en repetir el idusuario dando error.

En mi concepto se debe replantear la estructura de la tabla y el código.

Si por un lado suena lógico, tal como suena yo creo que debería crearse un historial de usuarios, porque la idea de la base de datos es por dentro de otros ID quede registrado por ejemplo quién registra una venta, entonces el número de venta debería ser en v1a1 (venta número 1 realizada por el administrador 1), por lo cual si ya una vez tuve un U1 que pasa a A1, tal como lo dices si deja de ser administrador, y vuelve a ser solo usuario, debería recuperar su ID anterior.

De igual manera no sé cómo hacer eso 🥺😣

Lo que importa es tener un ID del vendedor el cual es único así cambie de Tipo, ya con este campo es más fácil asignar el código en el evento después de actualizar, algo como:

idusuario = Left([tipo], 1) & Me.Id

El campo ID debe estar oculto en el formulario siguiendo el ejemplo del otro experto. Lo anterior le permite fijar el idUsuario con base al primer carácter del tipo, por ejemplo, A2, esto indica que el ID del vendedor siempre será 2 independiente que se cambie la A por P o U. Como usted lo planteaba no es posible cambiarle el tipo porque al volver a retornarlo puede variar, tomando por ejemplo, A15 etc.

TABLA USUARIOS

FORMULARIO USUARIOS

CODIGO EVENTO "DESPUES DE ACTUALIZAR"

Private Sub Cuadro_combinado3_AfterUpdate()
  idusuario = Left([tipo], 1) & Me.Id

End Sub

Resumiendo no sé que beneficio trae el campo idUsuario, solo basta con que el ID esté en otra tabla, por ejemplo, ventas y relacionando por este campo se pueden obtener las ventas de éste, ahora si fuera necesario saber que ventas realizó cuando estaba en determinado Tipo, es decir, como Admintrador o Usuario, sí es necesario el campo idUsuario en la tabla de ventas, para posteriormente agrupar por ID y TIPO. Lo anterior permite saber cuántas ventas realizó por tipo e inclusive por fecha. Igualmente, se puede ir pensando en separar en una tabla los Tipos (Administrador, Programador y Usuario) así se evita utilizar funciones de texto como Left(), etc, en su defecto se trabajaría con ID de cada tipo.

Espero le sirva, no obstante, lo respondido por el otro experto cumple con su pregunta inicial, sino, que no es funcional.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas