Modificar formulario mediante clave

He creado un formulario para desde éste poder insertar los datos en una tabla. En principio los datos introducidos no se van a modificar pero a veces habrá que hacerlo.
¿Cómo puedo bloquear el formulario para que nadie modifique la información ya introducida en él y que si es necesario modificar algo me pida un usuario y contraseña.

1 Respuesta

Respuesta
1
Entiendo que el formulario está hecho con el asistente, y claro, de esta forma, cuando modificas algo, automáticamente se guarda, pues bien, yo lo que haría sería lo siguiente:
1º Crear el formulario sin el asistente
2º Mediante VBA, crear las consultas que necesites por medio de recordset
3º Y luego creas un botón de modificar, que lleve consigo una condicional " If ", algo así como:
If inputobox = "1234" then 'tu contraseña
...hacer cambios con el comando  DoCmd.RunSQL (update ...
else
end if
Prueba a hacer esto y si algún paso no sabes hacerlo, lo vamos viendo.
Hola danimm
La verdad que acertaste, el formulario lo creé con el asistente y las consultas que hay en el formulario llego a ellas mediante botones hechos con el cuadro de herramientas que están vinculados a otros formularios que a su vez están basados en consultas de selección, de parámetros y campos calculados.
El problema si no es abusar de tu tiempo es que de macros y vba estoy muy verde. Te agradecería si es posible que me detallaras el código de la macros para hacer las consultas y el botón de modificar que lleve consigo la condicional "if".
El formulario "detalles-ficha" se basa en una tabla "Datos" con 4 campos que son:
"id-registro", "titulo", "autor" "genero"
Tengo además 3 botones creados automáticamente (sin yo editar vba) con el asistente del cuadro de herramientas en "vista diseño", seleccionando el botón de comando y vinculándolo a la acción abrir formulario "Datos" que a su vez está basado en una consulta de parámetros, cuyo parámetro es [dime el titulo]. Otro botón para abrir otro formulario "fecha-final" basado en una consulta de campos calculados, cuyo campo calculado es: fecha-evento=[fecha-inicial] +2 y otro botón que te lleva al último registro.
El caso es que tanto el contenido de los campos como clickear estos botones todo en el formulario "detalles-ficha", me gustaría que para modificarse dependa de introducir una contraseña tipo ****** que se me pedirá al hacer clic sobre cualquier etiqueta, botón, cuadro de texto, etc. del formulario "detalles-ficha". si se puede que apareciera el mensaje de "contraseña errónea" si se equivoca.
Espero que me puedes detallar los códigos vba y cómo y dónde insertarlo. He mirado en varios libros y webs pero no me veo la solución, es que no sé mucho de vba y te agradecería mucho pudieras ayudarme.
Gracias por tu tiempo y tu paciencia
Ok, como esto va a ser un poco complicado, vamos por partes:
1º empieza creando un formulario nuevo sin el asistente, añadiendo tantos cuadros de texto y botones como necesites, si te salta el asistente lo cancelas. El formulario que ya tienes hecho dejalo, por si al final no te gustase lo que te ofrezco, que sigas teniendo el tuyo.
2º los códigos VBA se insertan desde, por ejemplo, si quieres insertar código a un botón para abrir un formulario:
Haces click derecho sobre el botón>propiedades>eventos>"al hacer clic" y seleccionas "código"
Te aparecerá una pantalla con texto donde pondrá:
Private sub Commandbutton1
End Sub
Pues bien, estaré estas lineas es donde tienes que escribir tu código para abrir el formulario, que en este caso seria:
DoCmd. OpenForm "NombreDeTuFormulario"
En fin, ve creando el formulario y te voy diciendo códigos...
Ahí va un poco de código, si sabes un poquito de inglés, lo entenderás fácilmente:
Suponiendo que has creado el formulario "detalles-ficha" con los cuadros de texto llamados TXTidRegistro, TXTtitulo, TXTautor y TXTgenero y una tabla llamada "Datos" con los campos idRegistro, titulo, autor y genereo, hacemos click derecho en TXTidRegistro>propiedades>eventos>"al salir" y selecciona código, y escribe lo siguiente:
Private Sub TXTidRegistro_Exit(Cancel As Integer)
If Not IsNull(TXTidRegistro) Then
DoCmd.SetWarnings False
Dim rs As Recordset
Dim db As Database
Set db = CurrentDb
Set rs = db.OpenRecordset("select * from DATOS where IdRegistro = " & TXTidRegistro.Value)
If rs.EOF Then 'si no existe ...
TXTidRegistro = Empty
TXTtitulo = Empty
TXTautor = Empty
TXTgenero = Empty
MsgBox "No existe el registro", vbInformation, "NO EXISTE ..."
TXTidRegistro.SetFocus
Else
TXTtitulo = rs.Fields(1)
TXTautor = rs.Fields(2)
TXTgenero = rs.Fields(3)
End If
End If
End Sub
Ahora creamos un botón de comando que lo llamaremos BOTmodificar, y le creamos un evento "al hacer clic", y en el código escribimos lo siguiente:
Private Sub BOTmodificar_Click()
Dim CONTRASEÑA As String
CONTRASEÑA = InputBox("Introduzca la contraseña", "CONTRASEÑA...")
If CONTRASEÑA <> "1234" Then
MsgBox "Permiso denegado", vbCritical, "ERROR"
Else
If IsNull(TXTidRegistro) Then
MsgBox "Debes seleccionar primero un registro", vbInformation, "ERROR..."
Else
DoCmd.SetWarnings False 'quitar mensajes de Access tipo ¿quieres actualizar...?
DoCmd.RunSQL "Update DATOS Set TITULO = '" & Form!TXTtitulo.Value & "', AUTOR='" & Form!TXTautor.Value & "',
GENERO ='" & Form!TXTgenero.Value & "' Where IdRegistro = " & Form!TXTidRegistro.Value
MsgBox "Registro actualizado", , "ACTUALIZADO"
End If
End If
End Sub
También puedes crear otro botón que lo llamaremos BOTlimpiar y le creamos otro evento "al hacer clic" con el código:
TXTidRegistro = Empty
TXTtitulo = Empty
TXTautor = Empty
TXTgenero = Empty
RECUERDA: que cuando abres el editor de VBA ya te sale la primera y última línea de código (Private sub y End Sub) por lo tanto no tendrás que volver a escribir dichas líneas.
Para eliminar registros, creas un botón y le pones el código DoCmd. RunSQL "Delete ..." lo puedes ver en internet, es muy parecido al de modificar.
Ve haciendo cosillas y me comentas.
Hola Danimm
Ya he insertado el código que me mandaste pero en el código del botón BOTmodificar hay unas líneas que el depurador me las marca como error de sintaxis. Me indica que el problema esta en las comillas " o la coma, Tal vez es el editor de texto de la web el que las modifican o que yo al copiar y pegar el código se modifique
DoCmd.RunSQL "Update DATOS Set TITULO = '" & Form!TXTtitulo.Value & "',
AUTOR='" & Form!TXTautor.Value & "',
GENERO ='" & Form!TXTgenero.Value & "' Where IdRegistro = " & Form!TXTidRegistro.Value
que tecla del teclado me devuelve "', ¿son dobles comilas o una comilla? ¿debe estar este código en dos líneas en vez de cuatro? ¿la coma es porque continúa en  una sola línea? es que me da fallo de sintaxis. Yo lo que había hecho es copiar desde tu respuesta y pegar el código
Gracias por la ayuda
Te da error, porque tiene que ir todo en una linea, desde Docmd. Hasta idRegistro. Value, lo que ocurre que al pasarlo a este foro, se la descolocado un poquito.
Por cierto, son dobles comillas, las que están encima del 2 más comilla simple, ¿la qué está junto con el signo de interrogación?
Por cierto, debes tener muy muy muy en cuenta los nombres de los cuadros de texto y los campos de tu tabla, a los que les puse TXT son los cuadros de texto, los otros son los campos de las tablas.
Hola
 Por cierto estoy con access 2003 pero me imagino que como es código vba dará igual.
Ya lo he puesto todo en una línea pero me sigue dando error de sintaxis
Te he escrito el código mostrando dónde me aparecen las comillas dobles y simples
DoCmd.RunSQL (comilla doble)Update DATOS Set TITULO = (comilla simple y doble) & Form!TXTtitulo.Value & (comilla doble y simple), AUTOR=(comilla simple y doble) & Form!TXTautor.Value & (comilla doble y simple),
GENERO =(comilla simple y doble) & Form!TXTgenero.Value & (comilla doble y simple) Where IdRegistro =(comilla doble) & Form!TXTidRegistro.Value
En todo caso copio y pego el código así que no debería haber error tal vez el error de sintaxis no está en las comillas sino en las comas (,) o en otra cosa. Si pudieras revisar el código que me mandaste. Solo este botón me error
Gracias por todo
ok
bueno lo de las comillas y el error de sintaxis ya se corrigió, fue un problema al copiar y pegar
Una pregunta cuando creo el formulario sin el asistente, lo hago desde
Nuevo>nuevo formulario>vista diseño>
me indica que elija una tabla o consulta desde donde proceden los datos del objeto...
Ahí he seleccionado la tabla "DATOS" y se me ha abierto el diseño del formulario y he puesto los campos "IdRegistro" "TITULO" "AUTOR" "GENERO".
Después desde el cuadro de herramientas he insertado 4 cuadros de texto y he puesto los
nombres "TXTidRegistro" "TXTtitulo" "TXTautor" "TXTgenero"
Finalmente he creado un botón de comando "BOTmodificar"
He agregado al "TXTidRegistro" el código vba y también al botón "BOTmodificar" su código pero no veo que funcionen.
¿los 4 campos de la tabla "DATOS" deben de estar en el formulario o solo los 4 cuadros de texto? yo he insertado los 4 campos de la tabla y ademas los 4 cuadros de texto pero veo que si quiero modificar el registro puedo escribir en los campos de las tablas. Cómo funcionaría todo esto de modificar el registro.
Gracias por la ayuda y discúlpame si soy un poco torpe pero poco a poco lo estoy cogiendo
Hola Danimm
Bueno he seguido pensando y pensando y ya entiendo todo lo que me has indicado.
Corrígeme si me equivoco.
En el formulario no están los registros de la tabla, no tiene que haber etiquetas tan solo es necesario los cuadros de texto para escribir en ellos los datos. Debo escribir primero en el TXTidRegistro y al hacer intro me salen rellenos los TXTtitulo, Txtautor y TXTgenero en éstos modifico los datos y luego pulso el botón BOTmodificar e ingreso clave. Si la ingreso bien pues se modifican los datos y se indica el mensaje de "REGISTRO ACTUALIZADO".
el problema que tengo y por eso no me sale bien es que mi campo "IdRegistro" de la tabla "DATOS" está relleno con datos como "id1", "id2" etc. y en diseño de tabla el tipo de datos de este campo es texto y con texto no me funciona, me pone cuando voy al formulario y escribo por ejemplo id1:
Se ha producido error 3464 en tiempo. No coinciden los tipos de datos en la expresión de criterios. Se esperaba 1
la línea que condiciona a que el tipo de datos del "IdRegistro" de la tabla sea numérico y no del tipo  texto creo que es ésta:
Set rs = db.OpenRecordset("select * from DATOS where IdRegistro = " & TXTidRegistro.Value)
Podría modificarse el código vba para que no me dé error en el formulario si tengo relleno el campo "IdRegistro" de la tabla con datos del tipo texto como "id1"
un detalle más podría aparecer la contraseña cuando la escribo  1234 en formato ****
Gracias por todo
Lo entendiste bien.
En cuanto a lo de idRegistro, me refiero con el id de tu tabla, así que este debería ser autonumérico en tu tabla Datos.
Si escribes en TXTidRegistro el 1, debería aparecer en los demás cuadros, lo correspondiente al primer registro de tu tabla, el 1 es autonumérico, te lo facilita access él sólito.
En cuanto a lo de contraseña ****, si que se puede, lo he leído en algún sitio pero no sabría decírtelo usando un inputbox, que es lo tu usas, con un cuadro de texto si es fácil, cambiándolo en las propiedades del mismo. Pero para esto tendrías que hacer un nuevo formulario que se te abriese cada vez que pinches en BOTmodificar, introduces la contraseña y cuando des en aceptar te haga el código que tienes en BOTmodificar.
Hola Danimm
Mi campo "IdRegistro" necesita tener un formato de texto porque los datos que inserto en él se escriben así: "id1, id2, id3. El "id" forma parte del dato escrito por eso no sé que habrá que cambiar en el código que me pasaste para que me lo acepte porque en estos momentos da
"error 3464. no coinciden los tipos de datos en la expresión de criterios. Se esperaba 1".
Espero me puedas ayudar
Quería hacerte otra pregunta sobre este mismo tema, pero te lo hago, si estás activo en otra pregunta, mejor.
(a ver si puedes contestarme a la anterior aclaración que te he pedido)
Gracias por todo
A ver, te comento, cuando uno crea un registro nuevo, Access le asigna un número correlativo automáticamente en la tabla, ese número es que yo llamo idRegistro, todo el código del botón BOTmodificar y del cuadro de texto TXTidRegistro está basado en ello.
Lo que creo que haces con id1, id2... es asignar manualmente otro campo correlativo, y por eso no te funciona con el código que yo te puse.
No sé si me he explicado...
A las malas, me podrías mandar tu access a mi correo y le hecho un vistazo:
Dannnymm(arroba)ono(punto)com
Hola Danimm
Así es ... eso es lo que hago, asignar manualmente otro campo correlativo y además en formato Texto.
En mi caso el campo "IdRegistro" tiene un formato Texto porque los datos que he introducido tienen letras y números y  por tanto no es numérico ni autonumérico... además ya tengo la columna de la tabla rellenada con este tipo de datos,  y claro con éstos no me funciona el código que me pasaste.
En resumen el problema es que el código del botón funciona cuando el campo tiene formato numérico y casualmente al campo "IdRegistro" le he asignado un formato de texto. Por eso me gustaría si  es posible que pudieras modificar el código del botón BotModificar para que funcione cuando el campo "IdRegistro" tenga un formato de texto. No es por capricho , es que ya tengo la columna de la tabla rellenada con este formato y no querría tener que cambiarlos ahora.
Gracias por la ayuda y tu paciencia y espero me perdones si me he explicado mal.
Debes cambiar entonces esto:
Set rs = db.OpenRecordset("select * from DATOS where IdRegistro = " & TXTidRegistro.Value)
a
Set rs = db.OpenRecordset("select * from DATOS where IdRegistro = TXTidRegistro.Value)
Los signos "& significa que estás buscando números, de esta nueva forma, es para texto.
En el apartado de DOCMD. RUNSQL "UPDATE... creo que también tienes esos signos al final de la instrucción. Pruébalo así y si no, lo dejas sin "&. Haz las pruebas y me comentas.
Hola Danimm
El cambio lo he hecho en el cuadro de texto > propiedades > evento > al salir:
He cambiado en el cuadro de texto TXTidRegistro en el evento, las líneas señaladas por las nuevas y me da error de compilación error de sintaxis y las he revisado varias veces.
A lo mejor el resto del código no es compatible con el cambio de código en esas líneas, o hay que cambia algo más en esas líneas no sé pero si quito solamente    "&   para que funcione para texto ahora me da error.
Gracias por la ayuda
Tendría que hacer alguna prueba, estoy casi seguro que el problema viene de lo que te he comentado.
¿Me podrías mandar una copia de tu proyecto y le hecho un vistazo?
Dannnymm(arroba)ono(punto)com

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas