ACCESS: Asignar un valor automático a un campo en base a los registros de una tabla

En un formulario de ACCESS, me gustaría que al ingresar un nuevo registro, uno de los campos adquiera un valor de manera automática en base a los registros de otra tabla y se realizara en bucle.

Pongo un ejemplo. Se trata de un registro de consultas que llegan a un buzón, y que almacena a qué experto se le deriva cada consulta, la fecha de envío, etc.

De la tabla CONSULTAS, el campo UNIDAD DE DESTINO debe adquirir automáticamente los valores de otra tabla EXPERTOS, que tiene 10 registros (Experto 1, Experto 2, Experto 3...). De esta forma, la primera consulta que ingrese, en el campo UNIDAD DE DESTINO, debe aparecer EXPERTO 1, la segunda EXPERTO 2 y así hasta acabar con la lista, de manera que la consulta 11, también aparezca a EXPERTO 1.

2 Respuestas

Respuesta
1

Si bien me ha dado un error, concretamente "No se ha definido variable". Te pego el código que he puesto el nombre de mis campos, por si pudieras detectar dónde me he equivocado. (Como indicaste que podía ser otro evento, me pareció más adecuado utilizar el AfterUpdate, pero puede que me haya equivocado)

Private Sub DNI_AfterUpdate()
If Me.NewRecord Then
UnidadCaiss = Nz(DLast("unidadCaiss", "buzon")) + 1
End If
If UnidadCaiss = 27 Then
UnidadCaiss = 1
End If
End Sub
End Sub

Donde mis tablas (en la pregunta simplifiqué para poder explicarme mejor) son:

-BUZON, los campos:

DNI; Trámite; UnidadCaiss; Fecha de envío; Observaciones, Nº Registro

-UNIDADES, con dos campos:

-Id

-Unidad

El ComboBox lo hice para sustituir el campo de texto de UnidadCaiss según indicaste:

SELECT [Unidad de destino], [Unidad] FROM Unidades GROUP BY [Unidad de destino];[unidad]

Muchas gracias por tu respuesta

Respuesta
2

Gloria, lo puedes hacer de muchas formas, pero por suponer. Supongamos que tengo una tabla con los Expertos como

Ya te encargas tu de poner hasta el 10. Y tengo una tabla Consulta, con los campos Idconsulta, Idexperto y TipoConsulta y con ella construyo un formulario, da igual único o continuo pero creo que de ésta última forma se ve mejor. En el cambio el cuadro de texto IdExperto por un combinado con origen de la fila en

SELECT IdExperto, Experto FROM Expertos GROUP BY IdExperto,Experto;

y en número de columnas le pongo 2 y en ancho de columnas 0;3 con lo que me queda

Cuando pongo el cursor en el primer TipoConsulta a Experto le asigna el experto1, en el siguiente el Experto2 y así hasta que llegue a 5 (en tu caso a 10) que se "reinicia"

El código del evento Al recibir el enfoque(aunque podría ser otro) es

Private Sub TipoConsulta_GotFocus()
If Me.NewRecord Then
IdExperto = Nz(DLast("idexperto", "consulta")) + 1
End If
If IdExperto = 6 Then
IdExperto = 1
End If
End Sub

Muchas gracias por tu respuesta. Si bien me ha dado un error, concretamente "No se ha definido variable". Te pego el código que he puesto el nombre de mis campos, por si pudieras detectar dónde me he equivocado. (Como indicaste que podía ser otro evento, me pareció más adecuado utilizar el AfterUpdate, pero puede que me haya equivocado)

Private Sub DNI_AfterUpdate()
If Me.NewRecord Then
UnidadCaiss = Nz(DLast("unidadCaiss", "buzon")) + 1
End If
If UnidadCaiss = 27 Then
UnidadCaiss = 1
End If
End Sub
End Sub

Donde mis tablas (en la pregunta simplifiqué para poder explicarme mejor) son:

-BUZON, los campos:

DNI; Trámite; UnidadCaiss; Fecha de envío; Observaciones, Nº Registro

-UNIDADES, con dos campos:

-Id

-Unidad

El ComboBox lo hice para sustituir el campo de texto de UnidadCaiss según indicaste:

SELECT [Unidad de destino], [Unidad] FROM Unidades GROUP BY [Unidad de destino];[unidad]

Gracias por tu tiempo

Gloria, si has puesto dos End Sub en el evento después de actualizar del control DNI tienes que borrar uno. A cada Private Sub le corresponde sólo un End Sub, final de instrucción.

De todas formas, si ves que te da problemas pon una imagen de la tabla o el formulario Buzón.

Gracias por tu respuesta, disculpa la tardanza. Quité el doble sub que se introdujo por error. Te copio mis tablas, el formulario y el código:

TABLA BUZON

TABLA UNIDADES

FORMULARIO

El ComboBox de unidad es lo que quiero que aparezca automático cuando se cumplimente un nuevo DNI(nueva consulta, nuevo registro) en base a la tabla Unidades, que es donde tengo las Unidades que resuelven las consultas. Cuando haya completado X registros (coincidentes con el campo de Unidad  en la Tabla Unidades, volver a empezar asignando ese campo automáticamente)

El origen de fila del Combo Box es SELECT [Unidades].[Id], [Unidades].[Unidad] FROM Unidades ORDER BY [Unidad], [Id]; 

El código lo he asociado al cuadro de texto DNI, y es:

Private Sub DNI_AfterUpdate()
If Me.NewRecord Then
UnidadCaiss = Nz(DLast("unidadCaiss", "buzon")) + 1
End If
If UnidadCaiss = 27 Then
UnidadCaiss = 1
End If
End Sub

Muchísimas gracias de nuevo por tu tiempo y ayuda.

Me, lo pones más sencillo. Mira, si tengo la tabla Unidades

Y tengo el formulario Buzon, creado en base a la tabla. Como te decía, da exactamente igual que el formulario sea único o continuo, la instrucción es la misma, y te dejo unos campos.

Si escribo un DNI, cuando pulso Enter para pasar al siguiente control

No sé si te sirve, pero puestos a ello, si repitiera el DNI, cuando pulsara Enter

Al pulsar Aceptar el cursor se vuelve al control DNI, para que lo cambies. Puedes ver que te va poniendo los valores de unidades hasta que llega al último que se repite el proceso

Permíteme unos consejos. Llama a los campos, tablas, objetos en general con nombres todo junto. Puede darse el caso, en que al ponerlo separados pongas por error Nombre Cliente y te vuelves loco al ver que no funciona nada y es que entre Nombre y Cliente hay dos espacios, mientras que si lo pones todo junto nunca te equivocas. Ya lo pondrás "bonito" en las etiquetas.

Segundo, si le pones acento a algo pónselo absolutamente a todo, lo digo por lo de Buzon. Y así no tienes que estar pensando ¿Al campo tal le puse acento o no? Personalmente no le pongo acento a nada pero luego en las etiquetas sí.

Bueno, el control UnidadCaiss, le pongo que no sea punto de tabulación y bloqueado=sí, para que no puedan cambiarlo.

Te pongo todo el código del formulario por si te sirve

Private Sub DNI_AfterUpdate()
UnidadCaiss = Nz(DLast("unidadcaiss", "buzon")) + 1
If UnidadCaiss = 8 Then
UnidadCaiss = 1
End If
End Sub
Private Sub DNI_BeforeUpdate(Cancel As Integer)
If DCount("*", "buzon", "dni='" & Me.DNI & "'") >= 1 Then
MsgBox "Ese DNI ya está registrado, deberá cambiarlo", vbOKOnly + vbExclamation, "Lo siento, otra vez será"
DoCmd.CancelEvent
End If
End Sub
Private Sub Form_Current()
DNI.SetFocus
End Sub

De todas formas, si ves que tienes problemas y quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando el ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Gloria, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas