Como saber si un Id de una tabla existe en otra tabla

Señores buenos días. Mi pregunta es la siguiente: Tengo dos tablas, una llamada clientes y la otra movimientos: Clientes (IdCli, Nombre, Direccion etc) y Movimientos (Idmov, IdCli,, Cant, VrUnitario etc). Lo que busco es que si quiero eliminar un tercero busque el IdCli en la tabla movimientos y si lo encuentra que me saque un mensaje diciendo que el cliente no se puede eliminar por que ya tiene movimiento y si no tiene movimiento que lo elimine. Cabe decir que estas tablas están relacionadas por el campo IdCli.

2 Respuestas

Respuesta
2

Pues tu mismo lo has dicho. Supongamos que el control donde escribes o buscar el IdCliente se llama, por ejemplo, BuscaId. En el evento donde vayas a eliminar el registro de la tabla Clientes puedes poner

If dcount("*","movimientos","idcliente=" & me.buscaid & "")>=1 then

Msgbox"Ese cliente no se puede eliminar, el pobre aun tiene movimiento", vbokonly,"Otra vez será"

Docmd. Cancelevent

else

docmd.runsql"delete * from clientes where idcliente=" & me.buscaid & ""

end if

Es decir, primero comprueba si en la tabla Movimientos hay algún registro con ese Idcliente. Si lo hay no te deja eliminar. Si no lo hay, lo elimina de la tabla Clientes.

¡Gracias! Icue muchísimas gracias, esta linea de código docmd.runsql"delete * from clientes where idcliente=" & me.buscaid & "", era lo que no podía hacer. Me tenia atascado. Mil gracias por tu pronta y oportuna respuesta

Respuesta
2

Solo basta con establecer en la relación entre las tablas "Exigir integridad referencial" activándola la casilla. De esta forma si intenta eliminar un registro IdCliente de la tabla clientes y este tiene movimientos Access se lo hará saber, puede capturar el número del error.

Buenos días, Eperezfer, Dios te bendiga, disculpa por la demora en contestarte, estaba bastante ocupado, bueno te comento: lo que me mandó Icue me sirvió y con eso solucione el problema, pero esto que me acabas de informar es otro método que también me gustaría aprender y así poder elegir entre uno y otro para ver cual puedo usar. Te pido por favor que me des un ejemplo para así adaptarlo a mi necesidad. Te agradezco el inmenso favor. Desde ya muchas gracias

Con gusto le he preparado este ejemplo y es la forma más profesional. Voy a explicarlo con 2 tablas tblclientes y tblmovimientos.

En la tabla tblclientes el campo idCliente es Autonumérico y es la clave principal esto para poder relacionarlo con el campo idCliente de la tabla tblmovimientos y así exigir integridad referencial, lo que obliga que al registrar un movimiento obligue que exista el cliente en la tabla tblclientes, igualmente, verifica si al retirar un cliente de la tabla tblclientes y éste tiene movimiento NO permita el retiro. Esta es la relación.

Observe como se marca la casilla "Exigir integridad referencial", si marca la casilla "Eliminar en cascada los registros relacionados", cuando elimine un cliente se eliminarán todos los movimientos de este cliente lo cual no lo recomiendo.

Formulario Clientes

He incluido 2 botones de comando para retirar el cliente, el primero mediante una macro y el segundo mediante código VBA, el segundo es la forma más profesional.

CONTENIDO DE LA MACRO

CONTENIDO CON CODIGO VBA

Ahora este es resultado al hacer clic sobre cualquiera de estos 2 botones.

Como estoy trabajando con un formulario dependiente utilizo para retirar el cliente la instrucción:

Docmd. RunCommand acCmdDeleteRecord

Pero si fuera desde un formulario utlizaría la instruccion

DoCmd.RunSQL "DELETE * tblClientes WHERE idCliente=" & Me.idCliente

Esta es la forma más eficiente, toda vez, que no se necesita ejecutar ninguna consulta para contar los registros, imagínese que la tabla tblmovimientos tuviera 1,000,000 de registros, tardaría un tiempo en realizarse la consulta.

Tenga en cuenta el código de error 3200, este corresponde a error por violación de la integridad referencial ya que existe un registro relacionado entre las 2 tablas.

Espero le sirva el ejemplo y lo ponga en practica.

Ya le envíe el ejemplo.

Eperezfer, mil gracias por su tremenda respuesta. Está bien estructurada y con una explicación perfecta. El ejemplo esta 1A, lo felicito. Una vez más de te doy un millón de gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas