** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Ordenar registros
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoOrdenar registros

 Responder Responder
Autor
Mensaje
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 690
Enlace directo a este mensaje Tema: Ordenar registros
    Enviado: 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.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 6521
Enlace directo a este mensaje Enviado: 28/Agosto/2023 a las 15:03
Un Saludo.
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 690
Enlace directo a este mensaje 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.


Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje 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








Xavi, un minyó de Terrassa

Mi web
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 690
Enlace directo a este mensaje 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.

Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje 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:

Private Sub cmdAsc_Click()
    Me.OrderBy = Screen.PreviousControl.ControlSource
    Me.OrderByOn = True
End Sub

Private Sub cmdDesc_Click()
    Me.OrderBy = Screen.PreviousControl.ControlSource & " DESC"
    Me.OrderByOn = True
End Sub

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.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje 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):

Private Sub cmdAsc_Click()
    Screen.PreviousControl.SetFocus
    DoCmd.RunCommand acCmdSortAscending
End Sub

Private Sub cmdDesc_Click()
    Screen.PreviousControl.SetFocus
    DoCmd.RunCommand acCmdSortDescending
End Sub

Y si usas Ribbon, puedes utilizar los botones para ordenar propios de Access, y olvidarte de escribir código.
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 690
Enlace directo a este mensaje Enviado: 29/Agosto/2023 a las 00:09
Pues lo miro y mañana comento sin falta. 
Muchas gracias
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 690
Enlace directo a este mensaje 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
Arriba
maserrano Ver desplegable
Colaborador
Colaborador


Unido: 02/Abril/2014
Localización: España
Estado: Sin conexión
Puntos: 690
Enlace directo a este mensaje Enviado: 29/Agosto/2023 a las 15:14
Muchísimas gracias a todos.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable