Access : al cumplimentar un registro en formulario, si ya existe mostrar datos asociados y si no grabarlo en su tabla

Tengo muy pocas nociones de access y aunque he buscado mucho en internet no he conseguido solucionar algo que por otro lado parece muy básico.

Tengo dos tablas creadas:

1. CLIENTE, con dos campos, "CIF" que es el clave y no se puede repetir y "Nombre_cliente" donde se incluye la razón social.

2. COTIZACIONES, con varios cambios, el clave es "id_cotizaciones" que es autonumérico, otro es "CIF", "fecha_entrada", "ramo", etc...

Las tablas están vinculadas con una relación de uno a varios, del mismo cliente pueden existir varias cotizaciones de distintos ramos, o fechas o lo que sea.

Hay más campos y más tablas, pero creo que para el caso que nos ocupa no importa.

Tengo creado un formulario, donde aparece el campo CIF y Nombre_cliente (referenciados a la tabla CLIENTE) y también ramo, fecha_entrada, etc... (referenciados a la tabla COTIZACIONES.

Lo que necesito es que al grabar en el formulario un cif, si no existe en la tabla clientes, lo registre y a continuación incluyo el nombre y exactamente igual.

Si existe ese cif en la tabla clientes, necesito que me muestre el nombre asociado, esto ya lo he conseguido (el CIF es alfanumérico) con el evento despues de actualizar:

Me.Nombre_cliente = DLookup("[nombre_cliente]", "[CLIENTE]", "CIF='" & Me.CIF & "'")

Pero lo que ocurre, aunque me lo encuentra bien es que a su vez intenta grabarlo... Y claro, como no se puede repetir no puedo dar de alta dos cotizaciones con el mismo cliente.

Lo que necesito es que cuando encuentre que ya existe el cliente no intente grabar un nuevo registro, pero no sé como hacerlo, como decía antes he buscado mucho sin éxito.

Quedo a la espera de si alguien puede darme la solución.

1 Respuesta

Respuesta
2

Eldel: Lo debes hacer en el Before en lugar del After, para que Cancele el Evento y no haga la Grabación.

Con el Código que te adjunto, si el CIF existe, no te dejará introducirlo y si lo repites 3 veces te cierra el Formulario.

‘En la Cabecera del Modulo asociado al Formulario, después del Option Explicit, o sea fuera de cualquier Función O Procedimieno
Dim IntentosCIF As Integer

Dentro del Evento Form_Load del Formulario, si lo tienes y si no lo creas
IntentosCIF = 0
Copia y Pega éste Evento y Activalo en el TextBox del CIF

Private Sub CIF_BeforeUpdate(Cancel As Integer)
On Error GoTo CIF_BeforeUpdate_Err

If (Eval("DLookUp(""[CIF]"",""[CLIENTE]"",""[CIF] = Form.[CIF] "") Is Not Null")) Then
'Si el valor de CIF no es único, muestra un mensaje.
Beep
MsgBox "El Numero de CIF que has introducido ya existe." & vbCrLf & "Introduce uno que sea Unico.", vbCritical, "NUMERO DE CIF DUPLICADO"
IntentosCIF = IntentosCIF + 1

Call CuentaIntentos ' Para permitir solo tres Intentos
'Vuelve al control CIF.
DoCmd.CancelEvent
End If

CIF_BeforeUpdate_Exit:
Exit Sub
CIF_BeforeUpdate_Err:
MsgBox Error$
Resume CIF_BeforeUpdate_Exit
End Sub 'CIF_BeforeUpdate(Cancel As Integer)

‘También Copia esta Función
Function CuentaIntentos()

If IntentosCIF = 3 Then
MsgBox "Llevas tres Intentos sin éxito." & vbCrLf & "El Formulario se cerrará", vbCritical, "MUCHOS INTENTOS"
DoCmd.Close acForm, "CLIENTE"

'Aquí he supuesto que el Formulario se llama CLIENTE, si no es así lo cambias por el Nombre de tu Formulario
End If
End Function

En primer lugar muchas gracias Jacinto por contestarme, aunque me da la impresión que lo que me escribes es para que en ningún caso se pueda duplicar un cliente en mi formulario COTIZACIONES, es decir, que si existe el cliente e intento grabar al tercer intento me tira fuera. 

Pero lo que necesito en realidad es que en ese formulario, donde el cif es un campo no clave, me permita guardar distintas operaciones/cotizaciones con el mismo cliente. Si es nuevo, entonces que me permita guardarlo, ya sea en esa pantalla o abriendose un formulario nuevo, pero si existe el cliente simplemente que me aparezca su nombre y me deje guardar el registo (el campo clave es id_cotizacion). 

Hasta ahora solo había conseguido que si existe el cliente me aparezcan sus datos, pero como intenta grabarlo de nuevo en la tabla CLIENTE,donde el CIF si es un campo clave, no puedo guardar el registro de la cotización. 

No sé si consigo explicarme adecuadamente, y si he interpretado correctamente tu respuesta. 

Muchas gracias.

Eldel: Realmente el Código está para cuando vas a dar de alta un CIF, que si existe no te deje entrarlo, y aplicable a la Tabla CLIENTE, con un Formulario también llamado CLIENTE.

Releyendo tu pregunta y aclaración veo que aunque el código pueda servirte, no cubre la necesidad que tienes.

A partir de aquí, resumo lo que creo tener claro ahora con el fin de que me lo corrobores.

Tu necesidad básica:

Añadir N Registros a una Tabla COTIZACIONES con clave Primaria Id_Cotización auto numérica y con scundaria CIF, relacionada con la clave Primaria CIF de la Tabla CLIENTE.

Metodología que pretendes seguir:

Elección del CIF, (con otros Campos), de la Tabla CLIENTE.

Datos abtener si los hay:

Registros de la Tabla COTIZACIONES existentes, y si no hubiese ninguno, que puedan comenzar a añadirse.

Dime si basicamente es ésto para sugerirte el proceso y su código, o rectificame en su caso lo que haya malinterpretado. Saludos >> Jacinto

Gracias Jacinto por tu interés; Te respondo:

Tu necesidad básica:

Añadir N Registros a un formulario llamado COTIZACIONES, que está vinculado a una tabla que se llama COTIZACIONES, con clave Primaria Id_Cotización auto numérica y con scundaria CIF, relacionada con la clave Primaria CIF de la Tabla CLIENTE.

Este formulario debe permitirme dar de alta varios registros con el mismo CIF.

Metodología :

Si existe el CIF, se me cumplimenta automáticamente el nombre del cliente (es lo único que había conseguido con el evento que indicaba).

Si no existe el CIF entonces que me permita introducirlo , junto con el nombre en el campo nombre_cliente (y se volcaría en la tabla CLIENTE). Esto se podría hacer en el mismo formulario o abriéndose uno nuevo al detectar que el dato CIF no existe (como sea más fácil).

Te pego pantalla. El campo clave "id_cotizacion" no aparece, pero se vuelca correctamente. Actualmente puedo grabar cotizaciones con clientes nuevos y funciona bien. Lo que no puedo es grabar cotizaciones para clientes que ya existen, porque aunque me recupere su nombre , me intenta duplicar en la tabla CLIENTE el registro. El formulario debería detectar que al existir el cliente en la tabla CLIENTE no debe grabar de nuevo ese registro.

Eldel: Comprendido. Necesitarás un Formulario y Subformulario

Lo que intentas hacer está muy bien estructurado en una BD de Microsoft, que supongo conoces que se llama Neptuno.

El Proceso sería el mismo que añadir líneas de Pedido a un Pedido, o generar un Pedido nuevo y añadirle líneas.

La explicación que yo te puedo dar es larga y al final tendría lagunas, que deberíamos pulir.

Si Abres el Formulario Pedidos en Vista de diseño ahí verás de donde toma los Datos, que es una consulta.

Para elegir al Cliente tienes un Combo, con lo cual no hay duda si existe o no.

La BD no la pongo en un enlace, porque ignoro si legalmente se puede hacer, pero entre otros sitios la puedes encontrar en:

http://www.mvp-access.es/emilio/Access/Descargas.asp 

Está en la Cabecera de la Página.

No obstante, si ves que tienes muchas dificultades, pones tu BD, aquí en un enlace con datos no reles pero con la estructura suficiente para hacer lo que quieres.

Y otra alternativa es que tu BD me la envíes a [email protected]

Te arrancaría el código para que tú siguieras. Saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas