Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
access:desktop:entidades [2019/08/07 13:23]
admin [Eventos en formulario de listado]
access:desktop:entidades [2019/08/16 14:09] (actual)
admin
Línea 1: Línea 1:
 ====== Entidades ====== ====== Entidades ======
  
-Para el mantenimiento de entidades de la BD, podríamos usar un solo formulario y conmutar entre las vistas //​dataview//​ y el modo //​formview//​. Sin embargo, si el formulario requiere de subformularios o de algún control no estándar, es más práctico usar dor formularios.+Para el mantenimiento de entidades de la BD, podríamos usar un solo formulario y conmutar entre las vistas //​dataview//​ y el modo //​formview//​. Sin embargo, si el formulario requiere de subformularios o de algún control no estándar, es más práctico usar dos formularios. Además podríamos usar una vista para el listado y la propia tabla para el detalle.
  
 Por ejemplo, si vamos a hacer el mantenimiento de la tabla ''​COMUNEROS'',​ haremos los siguientes pasos: Por ejemplo, si vamos a hacer el mantenimiento de la tabla ''​COMUNEROS'',​ haremos los siguientes pasos:
Línea 16: Línea 16:
   - Ponemos el //Nombre de la banda de opciones// a ''​Comuneros'',​ por lo que previamente la habremos tenido que crear. Lo veremos en la siguiente sección.   - Ponemos el //Nombre de la banda de opciones// a ''​Comuneros'',​ por lo que previamente la habremos tenido que crear. Lo veremos en la siguiente sección.
   - Cambiamos la propiedad //Título// y ponemos el nombre de la entidad de forma correcta, separando espacios y demás, en nuestro caso ''​Comuneros''​. ​   - Cambiamos la propiedad //Título// y ponemos el nombre de la entidad de forma correcta, separando espacios y demás, en nuestro caso ''​Comuneros''​. ​
-  - Cambiamos las propiedades //Permitir agregar//, //Permitir eliminación//​ y //Permitir ediciones// a ''​No'',​ salvo que queramos permitir la edición al ser una entidad muy sencilla. De esta forma tenemos todos los eventos en VBA y mediante formularios. La eliminación se podría permitir, pero se podría disparar la integridad referencial.+  - Cambiamos las propiedades //Permitir agregar//, //Permitir eliminación//​ y //Permitir ediciones// a ''​No'',​ salvo que queramos permitir la edición al ser una entidad muy sencilla ​(caso de las tablas de //Lookup// en las que sólo tendremos un formulario de listado para todas las operaciones),​ o lo deseemos de forma particular. De esta forma tenemos todos los eventos en VBA y mediante formularios. La eliminación se podría permitir, pero se podría disparar la integridad referencial.
   - En principio dejamos el resto de opciones hasta que veamos la forma de presentar los datos con mas detalle.   - En principio dejamos el resto de opciones hasta que veamos la forma de presentar los datos con mas detalle.
   - Eliminaremos los campos que no sean relevantes, en el caso de los ''​Comuneros''​ podemos elegir mostrar sólo ''​NombreCorto''​ o ''​NombreLargo''​ ya que en la edición se podrán cambiar los dos.   - Eliminaremos los campos que no sean relevantes, en el caso de los ''​Comuneros''​ podemos elegir mostrar sólo ''​NombreCorto''​ o ''​NombreLargo''​ ya que en la edición se podrán cambiar los dos.
Línea 29: Línea 29:
             DoCmd.RunCommand acCmdSaveRecord             DoCmd.RunCommand acCmdSaveRecord
             DoCmd.Close , , acSaveYes             DoCmd.Close , , acSaveYes
-            DoCmd.RefreshRecord+            DoCmd.Requery
 </​sxh> ​           ​ </​sxh> ​           ​
   * //​Cancelar//​. Esta opción ejecuta el código:   * //​Cancelar//​. Esta opción ejecuta el código:
Línea 36: Línea 36:
             DoCmd.Close , , acSaveNo             DoCmd.Close , , acSaveNo
 </​sxh> ​           ​ </​sxh> ​           ​
- +Este código se ejecuta para todas las entidades, son genéricas. En el código del botón //Aceptar// se ha usado ''​DoCmd.Requery''​ en lugar de ''​DoCmd.RefreshRecord''​ porque estamos trabajando con dos formularios.
-Este código se ejecuta para todas las entidades, son genéricas.+
  
 ===== Ribbon de listados ===== ===== Ribbon de listados =====
Línea 77: Línea 76:
  
 Las acciones para //Añadir// y //Editar// son de momento específicas de cada entidad, //Borrar// se puede hacer genérica, y el resto de las acciones se ejecutan para todas las entidades, son genéricas. Las acciones para //Añadir// y //Editar// son de momento específicas de cada entidad, //Borrar// se puede hacer genérica, y el resto de las acciones se ejecutan para todas las entidades, son genéricas.
 +
 +En caso de poner genérica la opción //Borrar//, el código quedaría como sigue:
 +<sxh vb; gutter: false>
 +            DoCmd.RunCommand acCmdDeleteRecord
 +</​sxh> ​   ​
 +Además, en el formulario de listado pondremos el siguiente código, que también nos valdrá para las acciones desde el propio grid:
 +<sxh vb; gutter: false>
 +Private Sub Form_Delete(Cancel As Integer)
 +    If MsgBox("​¿Está seguro de eliminar el regisro actual?",​ vbOKCancel, "​Eliminar"​) = vbOK Then
 +        Cancel = False
 +    Else
 +        Cancel = True
 +    End If
 +End Sub
 +</​sxh> ​   ​
 +
 +===== Ribbon de listados genéricos =====
 +En caso de que queramos usar tareas genéricas para las acciones de los formularios de listado, sólo cambiaremos los botones de //Añadir// y //Editar//:
 +  * //​Añadir//​. Esta opción ejecuta el código:
 +<sxh vb; gutter: false>
 +            DoCmd.OpenForm Screen.ActiveForm.Tag,​ acNormal, , , acFormAdd
 +</​sxh> ​           ​
 +  * //Editar//. Esta opción ejecuta el código:
 +<sxh vb; gutter: false>
 +            DoCmd.OpenForm Screen.ActiveForm.Tag,​ acNormal, , , acFormEdit
 +</​sxh> ​    
 +Para poder saber qué formulario hay que abrir para editar los registros, el nombre lo guardamos en la propiedad ''​Tag''​ del formulario de listado. Por ejemplo, en la propiedad ''​Tag''​ del formulario ''​ComunerosList'',​ almacenamos el valor ''​Comuneros''​.
 +
 +===== Ribbon de listados genéricos =====
 +En caso de que queramos usar tareas genéricas para las acciones de los formularios de listado, sólo cambiaremos los botones de //Añadir// y //Editar//:
 +  * //​Añadir//​. Esta opción ejecuta el código:
 +<sxh vb; gutter: false>
 +            DoCmd.OpenForm Screen.ActiveForm.Tag,​ acNormal, , , acFormAdd
 +</​sxh> ​           ​
 +  * //Editar//. Esta opción ejecuta el código:
 +<sxh vb; gutter: false>
 +            DoCmd.OpenForm Screen.ActiveForm.Tag,​ acNormal, , , acFormEdit
 +</​sxh> ​    
 +Para poder saber qué formulario hay que abrir para editar los registros, el nombre lo guardamos en la propiedad ''​Tag''​ del formulario de listado. Por ejemplo, en la propiedad ''​Tag''​ del formulario ''​ComunerosList'',​ almacenamos el valor ''​Comuneros''​.
 +
 +===== Ribbon de listados de tablas de Lookup =====
 +En este caso, sólo dejaremos el botón //Añadir// y el //Borrar// genérico:
 +  * //​Añadir//​. Esta opción ejecuta el código:
 +<sxh vb; gutter: false>
 +            Screen.ActiveForm.Recordset.AddNew
 +</​sxh> ​           ​
 +  * //Borrar//. Esta opción ejecuta el código:
 +<sxh vb; gutter: false>
 +            DoCmd.RunCommand acCmdDeleteRecord
 +</​sxh> ​    
 +El editar, se hace sobre el propio grid.
 +
 +===== Formularios de detalle y de listado =====
 +En ambos casos, es preferible usar ''​Option Explicit''​.
  
 ===== Eventos en formulario de detalle ===== ===== Eventos en formulario de detalle =====
Línea 110: Línea 163:
 End Sub End Sub
 </​sxh>​ </​sxh>​
-En este código, el ''​if''​ se usa para chequear si se ha hecho doble click en el selector de fila (tal y como se detalla en [[access:​desktop:​ctxmenu|]]),​ por lo demás este código es similar al que vimos como respuesta al botón ''​btn_ComuEdit'',​ por lo que se debería pensar en algún método para que el código se ejecutara en un sólo punto. ​           ​+En este código, el ''​if''​ se usa para chequear si se ha hecho doble click en el selector de fila (tal y como se detalla en [[access:​desktop:​ctxmenu|]]),​ por lo demás este código es similar al que vimos como respuesta al botón ''​btn_ComuEdit'',​ por lo que se debería pensar en algún método para que el código se ejecutara en un sólo punto. 
 + 
 +En caso de usar un formulario de listado para seleccionar elementos, lo normal es que se visualice como ''​Dialog'',​ con lo que el código cambiará a :             
 +<sxh vb; gutter: false> 
 +Private Sub Form_DblClick(Cancel As Integer) 
 +    If (Me.SelHeight = 1) And (Me.SelWidth > 0) Then 
 +        If IsFormDialog(Me) Then 
 +            '​Acción si seleccionamos el elemento 
 +        Else 
 +            DoCmd.OpenForm "​Comuneros",​ acNormal, , "​NumeroSocio='"​ & Forms("​ComunerosList"​)!NUMEROSOCIO & "'",​ acFormEdit 
 +        End If 
 +    End If 
 +End Sub 
 +</​sxh>​ 
 +Aquí se usa la función ''​IsFormDialog'',​ que hace uso del API de Windows para verificar si el objeto es dialog. Se podría usar otro tipo de condición como por ejemplo que el formulario sea ''​Modal''​. En la acción por ejemplo se puede cerrar el formulario o seleccionar el campo actual.
  
 También podemos hacer que se seleccione la cinta contextual al abrir o activar un formulario, hay que poner este código ene el evento ''​Activate'':​ También podemos hacer que se seleccione la cinta contextual al abrir o activar un formulario, hay que poner este código ene el evento ''​Activate'':​
Línea 123: Línea 190:
 </​sxh> ​           ​ </​sxh> ​           ​
  
-Por último, si permitimos que se pueda borrar desde el menú contextual, preguntaremos antes de que se borre:+Por último, si no permitimos que se pueda borrar desde el menú contextual, preguntaremos antes de que se borre:
 <sxh vb; gutter: false> <sxh vb; gutter: false>
 Private Sub Form_Delete(Cancel As Integer) Private Sub Form_Delete(Cancel As Integer)
Línea 133: Línea 200:
 End Sub End Sub
 </​sxh> ​           ​ </​sxh> ​           ​
 +En el caso de que permitamos la eliminación de registros desde el//​Datasheet//,​ Access nos los preguntará igualmente, por lo que no sería necesario.
  
 Con lo que el código para el botón de borrar quedará: Con lo que el código para el botón de borrar quedará: