Redefinir Eliminar en Microsoft Access 2000
Quiero que en un formulario (o en general) cuando se le de a eliminar a un registro de cierta tabla en realidad no se elimine, si no que se ejecute otra acción (que sera poner el campo ACTIVO a 0).
He redefinido el metodo Form_Delete del formulario (y alguno por el estilo) pero aun asi no consigo detener la eliminacion del registro.
¿Cómo puedo conseguir el efecto deseado?
He redefinido el metodo Form_Delete del formulario (y alguno por el estilo) pero aun asi no consigo detener la eliminacion del registro.
¿Cómo puedo conseguir el efecto deseado?
1 respuesta
Respuesta de azezino81
1
1
Yo haría una consulta de actualización UPDATE para el campo en lugar del botón que supongo que habrás creado con el asistente (lo de la barita mágica ;p)
Es decir, en lugar del código que genera un botón eliminar:
Private Sub btn_eliminar_Click()
On Error GoTo Err_btn_eliminar_Click
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
Exit_btn_eliminar_Click:
Exit Sub
Err_btn_eliminar_Click:
MsgBox Err.Description
Resume Exit_btn_eliminar_Click
End Sub
En lugar de eso, yo haría un recordset nuevo con la instrucción SQL UPDATE
Si sigues sin tenerlo claro, dilo que te lo pastearé, no lo hago ahora porque no lo tengo a mano :p
Venga!
Es decir, en lugar del código que genera un botón eliminar:
Private Sub btn_eliminar_Click()
On Error GoTo Err_btn_eliminar_Click
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
Exit_btn_eliminar_Click:
Exit Sub
Err_btn_eliminar_Click:
MsgBox Err.Description
Resume Exit_btn_eliminar_Click
End Sub
En lugar de eso, yo haría un recordset nuevo con la instrucción SQL UPDATE
Si sigues sin tenerlo claro, dilo que te lo pastearé, no lo hago ahora porque no lo tengo a mano :p
Venga!
Hola
No me ha quedado claro :_
Yo quiero que la actualización se lleve a cabo cuando el usuario elimine el registro pero yo no he creado ningún botón "Eliminar", si no que me refería a cuando por ejemplo le da al botón de eliminar registro de la propia barra de herramientas del asccess o cuando se selecciona la barra vertical de la izquierda en un formulario y se le da a suprimir del teclado.
Por otro lado si lo que has puesto se refiere al código original que tengo que sustituir y que se refiere a los botones que digo, no lo encuentro :_
Gracias por tu ayuda
No me ha quedado claro :_
Yo quiero que la actualización se lleve a cabo cuando el usuario elimine el registro pero yo no he creado ningún botón "Eliminar", si no que me refería a cuando por ejemplo le da al botón de eliminar registro de la propia barra de herramientas del asccess o cuando se selecciona la barra vertical de la izquierda en un formulario y se le da a suprimir del teclado.
Por otro lado si lo que has puesto se refiere al código original que tengo que sustituir y que se refiere a los botones que digo, no lo encuentro :_
Gracias por tu ayuda
Manipular el eliminar del access creo que no se puede ya que es la forma de trabajar del programa compilado que vende micro$oft, es decir, es intocable.
Una alternativa podría ser ocultarle esas barras de herramientas a los usuarios ;)
Entonces te queda la faena de crear el botón eliminar... que eso es mu fácil :p
a ver ahora que tal
Una alternativa podría ser ocultarle esas barras de herramientas a los usuarios ;)
Entonces te queda la faena de crear el botón eliminar... que eso es mu fácil :p
a ver ahora que tal
Hola
He hecho esto. He creado un botón "Eliminar" con el siguiente código:
Private Sub Comando24_Click()
If Not IsNull(DNI) Then
actualizacion = "UPDATE EMPLEADOS SET EMPLEADOS.ACTIVO = -1 WHERE EMPLEADOS.DNI = '" & DNI & "';"
DoCmd.RunSQL (actualizacion)
End If
End Sub
Esto hace que cuando se ejecute te pregunte si estas seguro de querer actualizar la fila, si le doy que si todo va bien, el problema es que si le doy que no da un error:
-----
Se ha producido el error "2501" en tiempo de ejecución:
La acción RumSQL se canceló.
-----
Yo no quiero que esto salga como un error. De hecho no lo entiendo, es el usuario el que ha cancelado la acción así que no veo porque eso va a ser un error.
He hecho esto. He creado un botón "Eliminar" con el siguiente código:
Private Sub Comando24_Click()
If Not IsNull(DNI) Then
actualizacion = "UPDATE EMPLEADOS SET EMPLEADOS.ACTIVO = -1 WHERE EMPLEADOS.DNI = '" & DNI & "';"
DoCmd.RunSQL (actualizacion)
End If
End Sub
Esto hace que cuando se ejecute te pregunte si estas seguro de querer actualizar la fila, si le doy que si todo va bien, el problema es que si le doy que no da un error:
-----
Se ha producido el error "2501" en tiempo de ejecución:
La acción RumSQL se canceló.
-----
Yo no quiero que esto salga como un error. De hecho no lo entiendo, es el usuario el que ha cancelado la acción así que no veo porque eso va a ser un error.
DNI que es? ¿Una variable que tienes tu definida previamente?
Mmm
Hagámoslo por pasos...
1.-Asegúrate que DNI contenga algo, es decir, haz en el formload que una etiqueta cualquiera adopte el valor DNI y a ver que ves...
2.-Comprueba que la instrucción SQL funcione, es decir, crea una consulta, pon vista sql (o con el entorno visual, es lo mismo) y la ejecutas. Es posible que el valor -1 no lo puedas meter en el campo por el tipo de campo que tengas definido en la tabla.
3.-Si con los pasos 1 y 2 no solucionamos el tema te aconsejo que cambies el modo de ejecutar la consulta, quiero decir, que en lugar de usar el DoCmd.RunQSL uses un recordset de los de toda la vida
try again :p
Mmm
Hagámoslo por pasos...
1.-Asegúrate que DNI contenga algo, es decir, haz en el formload que una etiqueta cualquiera adopte el valor DNI y a ver que ves...
2.-Comprueba que la instrucción SQL funcione, es decir, crea una consulta, pon vista sql (o con el entorno visual, es lo mismo) y la ejecutas. Es posible que el valor -1 no lo puedas meter en el campo por el tipo de campo que tengas definido en la tabla.
3.-Si con los pasos 1 y 2 no solucionamos el tema te aconsejo que cambies el modo de ejecutar la consulta, quiero decir, que en lugar de usar el DoCmd.RunQSL uses un recordset de los de toda la vida
try again :p
DNI es un campo del formulario, siempre tiene algo porque antes en el if compruebo si esta vacío, ademas solo da error cuando al preguntarme si de verdad quiero modificar la fila digo "No", si digo que si no da ningún error y se ejecuta bien la consulta por lo tanto la consulta también esta bien.
Para asegurarme he puesto que antes la muestre por pantalla y esta bien escrita (Así que DNI no esta vacío ni nada por el estilo)
Utilizo DoCmd.RunQSL porque es lo que encontré buscando por ahí (llevo con access poco más de una semana)
¿Qué es eso del recordset? ¿Cómo funciona?
------
Otra cosa:
Luego querré que al insertar un nuevo registro busque antes si esta con ACTIVO = -1 (el formulario no muestra estos registros) y en vez de intentar insertarlo (que dará error porque esa clave ya existe) lo que haga es poner ACTIVO = 0. Pero para esto no me va a servir simplemente con poner un botón a menos que lo complique mucho y ademas no rendiría porque la mayoría de las veces va a ser un registro totalmente nuevo y simplemente va a tener que insertarlo como se haría normalmente y ya esta.
¿Cómo podría hacer esto?
Para asegurarme he puesto que antes la muestre por pantalla y esta bien escrita (Así que DNI no esta vacío ni nada por el estilo)
Utilizo DoCmd.RunQSL porque es lo que encontré buscando por ahí (llevo con access poco más de una semana)
¿Qué es eso del recordset? ¿Cómo funciona?
------
Otra cosa:
Luego querré que al insertar un nuevo registro busque antes si esta con ACTIVO = -1 (el formulario no muestra estos registros) y en vez de intentar insertarlo (que dará error porque esa clave ya existe) lo que haga es poner ACTIVO = 0. Pero para esto no me va a servir simplemente con poner un botón a menos que lo complique mucho y ademas no rendiría porque la mayoría de las veces va a ser un registro totalmente nuevo y simplemente va a tener que insertarlo como se haría normalmente y ya esta.
¿Cómo podría hacer esto?
No se porque te pregunta si quieres actualizar, debería hacerlo sin más, al menos del modo que lo hago yo normalmente se traga la consulta directamente (lo hago con recordsets).
prueba poniendo una etiqueta on_error goto ... bla bla
Para hacerlas bien, crea cualquier botón con el asistente y te las crea, luego copy paste...
El problema debe estar en que cuando le dices que no intenta hacer algo más que no debe afectar tu aplicación, osea, que en el onerror le pones exitsub y ale...
Recordset es un objeto que contiene un juego de registros, es decir, un objeto en memoria que contiene los resultados de una consulta como una tabla.
Para cambiar el estado al intentar insertar un registro ya existente, si te he entendido bien, es otra consulta de actualización (UPDATE). Con un botón mismo lo podrías hacer...
prueba poniendo una etiqueta on_error goto ... bla bla
Para hacerlas bien, crea cualquier botón con el asistente y te las crea, luego copy paste...
El problema debe estar en que cuando le dices que no intenta hacer algo más que no debe afectar tu aplicación, osea, que en el onerror le pones exitsub y ale...
Recordset es un objeto que contiene un juego de registros, es decir, un objeto en memoria que contiene los resultados de una consulta como una tabla.
Para cambiar el estado al intentar insertar un registro ya existente, si te he entendido bien, es otra consulta de actualización (UPDATE). Con un botón mismo lo podrías hacer...
Es que si hago la inserción de un nuevo registro con un botón se haría demasiado complicado, vamos, tendría que abrir otro formulario donde metieran los datos o algo así y no me convence.
Pero ahora tengo otro problema que me ha surgido:
En el formulario viene para rellenar el campo DNI (que es la clave) y yo quiero que solo lo deje editar cuando se va a insertar un nuevo registro, es decir, en las hojas anteriores donde se ven los datos que ya estén en las tablas si vale que deje modificar otros campos pero no quiero que se deje el del DNI (en realidad no deja porque luego salta un error al intentar cambiar la clave, pero lo que yo quiero es que no llegue ni a dejar escribir, que solo deje escribir cuando se esta editando un nuevo registro).
Y en cuanto al recordset : ¿Puedes mandarme un ejemplo o alguna página para verlo mejor? He estado mirando la ayuda del access pero no veo como usarlo para modificar
Pero ahora tengo otro problema que me ha surgido:
En el formulario viene para rellenar el campo DNI (que es la clave) y yo quiero que solo lo deje editar cuando se va a insertar un nuevo registro, es decir, en las hojas anteriores donde se ven los datos que ya estén en las tablas si vale que deje modificar otros campos pero no quiero que se deje el del DNI (en realidad no deja porque luego salta un error al intentar cambiar la clave, pero lo que yo quiero es que no llegue ni a dejar escribir, que solo deje escribir cuando se esta editando un nuevo registro).
Y en cuanto al recordset : ¿Puedes mandarme un ejemplo o alguna página para verlo mejor? He estado mirando la ayuda del access pero no veo como usarlo para modificar
El otro problema básicamente es que quiero que el DNI solo se inserte al hacer un registro nuevo pero que luego no deje modificarlo, es decir, que en el formulario salga el campo de texto como bloqueado o algo así, pero a la hora de insertar un nuevo registro si que deje escribir ahí
No entiendo ese "otro problema" :(
Un ejemplo de recordset que yo he usado es este, mira:
Me.RecordSource = "SELECT * FROM Clientes"
Me.Requery
Cuadro_combinado114.SetFocus
Cuadro_combinado114.Value = "Tots"
Me.Recordset.MoveLast
Me.Recordset.MoveFirst
lbl_total.Caption = Me.Recordset.RecordCount & " de " & numeroC & " (100%)"
En este caso he usado el propio recordset del formulario actual (fíjate que pongo "Me.bla bla bla")
Un ejemplo de recordset que yo he usado es este, mira:
Me.RecordSource = "SELECT * FROM Clientes"
Me.Requery
Cuadro_combinado114.SetFocus
Cuadro_combinado114.Value = "Tots"
Me.Recordset.MoveLast
Me.Recordset.MoveFirst
lbl_total.Caption = Me.Recordset.RecordCount & " de " & numeroC & " (100%)"
En este caso he usado el propio recordset del formulario actual (fíjate que pongo "Me.bla bla bla")
Otra cosa:
Tengo:
Intentado = "SELECT SUM(PROYECTOS.PRESUPUESTO) FROM PROYECTOS WHERE COD_EMPRESA = '" & Me!COD_EMPRESA & "';"
Set db = CurrentDb
Set rst = db.OpenRecordset(Intentado)
Y quiero saber que resultado ha dado la suma
¿Cómo lo saco?
Tengo:
Intentado = "SELECT SUM(PROYECTOS.PRESUPUESTO) FROM PROYECTOS WHERE COD_EMPRESA = '" & Me!COD_EMPRESA & "';"
Set db = CurrentDb
Set rst = db.OpenRecordset(Intentado)
Y quiero saber que resultado ha dado la suma
¿Cómo lo saco?
Lo del dni-> has de ir probando con las propiedades del objeto o control, básicamente hay estas: visible, active y locked cada una tiene su utilidad... y pues para manipular cuando se ha de poder modificar o no, eso ya es más criterio de programador (es mi opinión) ya que puedes hacerlo de muchas maneras y lo mismo lo que tu tienes en mente hacer no se me pasaría a mí ni en un millón de años, por decir algo... es decir que solo este locked=false cuando apretes el botón nuevo y si apretás el botón siguiente anterior etc que este locked=true...
Yo en un formulario parecido tengo puesto un botón que si clicas puedes escribir y si clicas again dejas de poder escribir, es como un seguro para evitar "accidentes"...
Para sacar eso, yo haría esto:
num_proyectos=rs.Fields(0)
Tengo hecho esto en un form por aquí y funciona...
Suerte!
Postdata: se esta alargando un poco la pregunta, ¿no? u_u'
Yo en un formulario parecido tengo puesto un botón que si clicas puedes escribir y si clicas again dejas de poder escribir, es como un seguro para evitar "accidentes"...
Para sacar eso, yo haría esto:
num_proyectos=rs.Fields(0)
Tengo hecho esto en un form por aquí y funciona...
Suerte!
Postdata: se esta alargando un poco la pregunta, ¿no? u_u'
Si, se esta alargando. ¿Es un problema? Es que prefiero no abrir otra pregunta. Si te molesta dilo y lo dejo
Aquí va mi nueva duda:
Tengo un formulario en el que se rellenan varias cajas de texto, y al darle a un botón se construye una select con los datos insertados.
Quiero que esa select pase a ser el "Origen de registro" de un subformulario que se encuentra ahí de manera que al refrescar el subformulario muestre los valores que quiero.
(Básicamente es para buscar resultados conforme a unos parámetros)
¿Qué código tengo que poner en el evento clic del botón para conseguir esto?
Más detalladamente:
Tengo un campo fecha de inicio, fecha de fin, y puesto de trabajo y la select construida es SELECT * FROM EMPLEADOS left outer join PARTICIPA_EN ON EMPLEADOS.DNI=PARTICIPA_EN.DNI WHERE EMPLEADOS.PUESTO_DE_TRABAJO='" & Me!PUESTO_DE_TRABAJO & "' AND (PARTICIPA_EN.FECHA_DE_FIN < " & Me!Fecha_de_inicio & " OR PARTICIPA.FECHA_DE_INICIO > " & Me!Fecha_de_fin & ") AND EMPLEADOS.ACTIVO = 0 GROUP BY EMPLEADOS.DNI;
Y quiero que en el subformulario se vean los resultados de esta select
Aquí va mi nueva duda:
Tengo un formulario en el que se rellenan varias cajas de texto, y al darle a un botón se construye una select con los datos insertados.
Quiero que esa select pase a ser el "Origen de registro" de un subformulario que se encuentra ahí de manera que al refrescar el subformulario muestre los valores que quiero.
(Básicamente es para buscar resultados conforme a unos parámetros)
¿Qué código tengo que poner en el evento clic del botón para conseguir esto?
Más detalladamente:
Tengo un campo fecha de inicio, fecha de fin, y puesto de trabajo y la select construida es SELECT * FROM EMPLEADOS left outer join PARTICIPA_EN ON EMPLEADOS.DNI=PARTICIPA_EN.DNI WHERE EMPLEADOS.PUESTO_DE_TRABAJO='" & Me!PUESTO_DE_TRABAJO & "' AND (PARTICIPA_EN.FECHA_DE_FIN < " & Me!Fecha_de_inicio & " OR PARTICIPA.FECHA_DE_INICIO > " & Me!Fecha_de_fin & ") AND EMPLEADOS.ACTIVO = 0 GROUP BY EMPLEADOS.DNI;
Y quiero que en el subformulario se vean los resultados de esta select
Pues para hacer esto, yo usaría esta técnica:
En el evento click mismo, presionas click derecho y clicas en "palabra completa", ahí buscas el nombre del subformulario y luego ya lo tenemos, solo tienes que cambiar el recordsource y refrescar o requery, lo que más te guste, usando "palabra completa" podrás trabajar con el subform como si estuvieras en él...
en visualbasic normal mola más =[
Espero que te sirva
Postdata: no es un problema que se alargue, tranqui, pero es que me haría gracia tener más puntos :$
En el evento click mismo, presionas click derecho y clicas en "palabra completa", ahí buscas el nombre del subformulario y luego ya lo tenemos, solo tienes que cambiar el recordsource y refrescar o requery, lo que más te guste, usando "palabra completa" podrás trabajar con el subform como si estuvieras en él...
en visualbasic normal mola más =[
Espero que te sirva
Postdata: no es un problema que se alargue, tranqui, pero es que me haría gracia tener más puntos :$
- Compartir respuesta
- Anónimo
ahora mismo