|
Responder
|
| Autor | |
maserrano
Colaborador
Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Tema: Ordenar registrosEnviado: 28/Agosto/2023 a las 12:43 |
|
Buenas.
Una pregunta. Si quiero ordenar registros de un formulario por un campo concreto (p.e., en el evento clic de botón) hago: Private Sub OrdenAsc_Click() DoCmd.SetOrderBy "campo ASC" End Sub ...o bien, Private Sub OrdenDes_Click() DoCmd.SetOrderBy "campo DES" End Sub pero si lo que quiero es que me ordene según el campo en el que está posicionado el cursor, cómo lo hago ? Gracias por adelantado.
|
|
![]() |
|
mounir
Colaborador
Unido: 09/Febrero/2009 Localización: Asturias-España Estado: Sin conexión Puntos: 6521 |
Enviado: 28/Agosto/2023 a las 15:03 |
|
Hola!
Mírate este enlace https://access-global.net/vba-una-funcion-para-ordenar-todos-los-formularios/ |
|
|
Un Saludo.
|
|
![]() |
|
maserrano
Colaborador
Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 28/Agosto/2023 a las 16:28 |
|
Buenas.
El ejemplo aplica tres parámetros en una función (formulario, orden y tipo); este último para asc o desc en el orden de los mismos.
Pero cuando aplica el evento y llama la función, OrdenaForm: Call OrdenaForm(Me, "Cliente", "DESC") le decimos el Formulario (Me), El campo (Cliente) y el Orden (Desc). Yo lo que intento (y no me sale), es que el campo responda a una variable que dependa de dónde esté situado el foco (en qué campo) y que al producirse el evento (clic, p.e.) ordene por ese campo el formulario. Gracias de nuevo. |
|
![]() |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14926 |
Enviado: 28/Agosto/2023 a las 18:37 |
|
Hola,
Punto 1 Personalmente aplicaría un cambio a la función de ordenación para que en el primer argumento, en lugar de un Form, recibiera un String. Aparte de ser una manía personal (y ahí poca defensa tengo), para trabajar como voy a proponer es la forma más adecuada. Ese cambio no solo debe hacerse en la línea de declaración de la función; también debes hacerlo en la propia función (ojo, he visto una declaración de un sform que no se para que sirve). Básicamente estos cambios: Function OrdenaForm(strFormName As String, strControl ..... Dim frm As Form Set frm = Forms(strFormName) Punto 2 Para que un evento (imaginemos clic) asociado a un control se ejecute tenemos varias opciones: - [Procedimiento de evento] - llamada a función desde hoja de propiedades - asignación de función desde VBA La primera opción implica tener tantos procedimientos como controles quieras poder ordenar llamado casi de la misma forma a la función que ordena. La segunda implica escribir, control a control desde la hoja de propiedades la llamada a la función. La tercera es la que a mi más me gusta ya que la controlas desde código y se puede hacer con pocas líneas. Una vez hecho el cambio de la función veamos como podemos hacer de forma sencilla la asignación de eventos. Yo utilizo el Load del formulario. - Declarar un array arrControles - Llenar el array con los nombres de los controles a utilizar - Mediante un bucle establecer la llamada a la función en el evento deseado Algo así Dim arrControles As Variant Dim i As Integer arrControles = Array("unControl", "otroControl", "yotromas") For i = LBound(arrControles) To UBound(arrControles) Me(arrControles(i)).OnClick = "=OrdenaForm(" & Chr(34) & Me.Name & Chr(34) & "," & Chr(34) & arrControles(i) & Chr(34) & "," & Chr(34) & "ASC" & Chr(34) & ")" Next Notas: - Esa modificación sólo ordena de forma ascendente. Habría que trabajarlo para que, si ja estuviera ordenado por ese campo ASC, de hiciera DESC - Si alguno de los controles tuviera un procedimiento Click ya establecido, esa asignación lo obviaría. En ese caso quitas el control del array y llamas a la función que ordena desde el procedimiento de ese control. A ver si te sirve. NOTA: todo escrito al vuelo |
|
![]() |
|
maserrano
Colaborador
Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 28/Agosto/2023 a las 21:19 |
|
Uff.
Lo siento, pero no me entero de casi nada. El tema de arrays me sobrepasa. Me he limitado casi a copìar y probar (sustituyendo Los tres controles, claro) y me dice que hay un error '438' en tiempo de ejecución: el objeto no admite esta propiesdad o método. De verdad, creía que la cosa era más sencillita. Igual me tengo que limitar a ordenar por un campo concreto y ya está. De todas formas muchísimas gracias por el aporte. El problema es mío que tengo que poner las pilas. |
|
![]() |
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1536 |
Enviado: 28/Agosto/2023 a las 22:56 |
|
Puedes usar el objeto Screen para saber cuál es el control activo (Screen.ActiveControl), y cuál era el control que tenía el foco antes del activo (Screen.PreviousControl). Según como tengas los formularios, controles, o si esos botones están en un ribbon, uno de esos 2 objetos tendrán lo que quieres (el origen del control se guarda en la propiedad ControlSource).
Por ejemplo, si los 2 botones están en el mismo formulario que los controles por los que se desea ordenar:
A partir de aquí, puedes controlar el error si el control no tiene esa propiedad o estaba en otro formulario, puedes hacerlo más "global" a la aplicación, puedes hacer casi todo lo que se te ocurra.
|
|
![]() |
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1536 |
Enviado: 28/Agosto/2023 a las 23:05 |
|
Otra posibilidad es volver al control anterior y usar DoCmd.RunCommand (igual que antes, usa un control de errores cuando no se pueda ordenar o volver):
Y si usas Ribbon, puedes utilizar los botones para ordenar propios de Access, y olvidarte de escribir código.
|
|
![]() |
|
maserrano
Colaborador
Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 29/Agosto/2023 a las 00:09 |
|
Pues lo miro y mañana comento sin falta.
Muchas gracias
|
|
![]() |
|
maserrano
Colaborador
Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 29/Agosto/2023 a las 15:12 |
|
Perdonad pero no he podido responder antes (se acabaron vacaciones y el trabajo...)
He seguido los pasos indicados por pitxicu y va genial; le he implementado un control de errore "simple" y, la verdad que hace lo que yo quería: ordenar (asc, des) por cualquier campo del formulario. El control, en ambos botones está en el form y el cídogo es básicamente el de Pitxicu: Private Sub OrdenAsc_Click() On Error GoTo OrdenAsc_Click_Err Screen.PreviousControl.SetFocus DoCmd.RunCommand acCmdSortAscending OrdenAsc_Click_Exit: Exit Sub OrdenAsc_Click_Err: MsgBox Error$ Resume OrdenAsc_Click_Exit End Sub ------------------------------------------ Private Sub OrdenDesc_Click() On Error GoTo OrdenDesc_Click_Err Screen.PreviousControl.SetFocus DoCmd.RunCommand acCmdSortDescending OrdenDesc_Click_Exit: Exit Sub OrdenDesc_Click_Err: MsgBox Error$ Resume OrdenDesc_Click_Exit End Sub |
|
![]() |
|
maserrano
Colaborador
Unido: 02/Abril/2014 Localización: España Estado: Sin conexión Puntos: 690 |
Enviado: 29/Agosto/2023 a las 15:14 |
|
Muchísimas gracias a todos.
|
|
![]() |
|
Responder
|
|
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |