Cuando abro un formulario me aparece todos los campos con el símbolo de error
Necesito ayuda/consejo sobre cómo plantear el tema de los índices y las relaciones. Ya sé que a simple vista no guarda relación con el título, pero he intentado poner alguno más acorde y me da error.
Bien, me explico.
Para poder relacionar dos campos de distintas tablas, por ejemplo, el campo CodigoCliente de la tabla TClientes con el campo CodigoCliente de la tabla TTPV, es necesario que sean del mismo tipo (texto, numérico...), pero nunca, nunca autonumérico. Y aquí está el primer problema.
Yo lo que hago es utilizar una función para crear ese código. Por ejemplo, este:
Public Function GeneracionDeNuevoCodigo(FName As Form, Codigo As String, Tabla As String, Tipo As String, Optional Posicion As Boolean) 'Clientes, formas de pago, categorías Dim vAutonum, vUltimo As Variant If FName.NewRecord Then vAutonum = FName.Controls(Codigo) If Not vAutonum = "" Then Exit Function vUltimo = Nz(DMax(Codigo, Tabla), 0) If IsNull(vUltimo) Then vUltimo = 0 End If vUltimo = vUltimo + 1 FName.Controls(Codigo).Value = vUltimo End If End Function
El problema que tiene utilizar esta función para añadir el codigo que se relaciona con el campo de otra tabla, es que, si creo ese nuevo registro (utilizo la función de arriba para rellenar el campo Codigo, que se relaciona, en este caso, con el campo del mismo nombre en la tabla Artículos):
Y cierro sin introducir ningún valor más (sin rellenar el nombre de la categoría ni seleccionar si está o no activo), al abrir me aparece así:
La solución pasa por eliminar ese registro de la tabla para que vuelva a aparecer bien el formulario:
Además, con este código tengo el problema de que me añade un nuevo registro si utilizo la barra del buscador y no hay coincidencias. Esto lo he arreglado de esta manera:
If FName.NewRecord Then FName.Undo End If
Por último, una vez añadido el Codigo, no puede cancelar la entrada del registro, por lo que tengo que borrarlo manualmente en la tabla, ya que el formulario se pone con los símbolos de error que has visto antes.
Por otra parte, del código que puse antes, tengo la versión extendida:
Public Function GeneracionDeNuevoCodigo(FName As Form, Codigo As String, Tabla As String, Tipo As String, Optional Posicion As Boolean) 'Clientes, formas de pago, categorías y posición Dim vAutonum, vUltimo As Variant If FName.NewRecord Then vAutonum = FName.Controls(Codigo) If Not vAutonum = "" Then Exit Function If MsgBox("Vas a añadir " & Tipo & "." & vbCrLf & vbCrLf & "¿Quieres seguir?", vbYesNo, NombreBD) = vbYes Then vUltimo = Nz(DMax(Codigo, Tabla), 0) If IsNull(vUltimo) Then vUltimo = 0 End If vUltimo = vUltimo + 1 FName.Controls(Codigo).Value = vUltimo Else FName.Undo DoCmd.GoToRecord , , acPrevious Exit Function End If End If End Function
Este te pregunta si quieres añadir un nuevo registro. Si le dices que no, te va al registro anterior. Y aquí viene el problema. Si no hay ningún registro, da error (cuando estás creando una base de datos y aún no has metido el primer registro). Además, cuando utilizas el buscador, si no hay registros, te pregunta si quieres añadir uno nuevo, y tanto si sí, como si no, tienes el problema. Por tanto, en formularios donde tengo un buscador no puedo usar este código.
Yo no sé de qué manera puedo plantear la generación del código, de tal forma de que consiga lo siguiente:
- Me introduzca un código sin necesidad de tener que recurrir a una pregunta para evitar registros vacíos.
- Que cuando cierre el formulario, tome ese código como si lo generara automáticamente, de tal manera que elimine el registro en que solo esté el código.