web analytics

Informe con registros ordenables

La gracia de esta plantilla es conocer alguna manera de ordenar los registros desde un informe o subinforme (también serviría desde un formulario) haciéndolo de un modo mucho más visual. El uso típico sería como subinforme en un formulario de manera que podemos ordenar los registros del informe final de manera mucho más intuitiva

Cambio de posición de los elementos en el formulario
Cambio de posición de los elementos en el formulario

¿Qué necesitamos?

Para ello partimos de lo siguiente:

Relación entre las tablas madre e hija
Relación entre las tablas madre e hija
Datos contenidos en la tabla madre
Datos contenidos en la tabla madre

Datos contenidos en la tabla hija
Datos contenidos en la tabla hija

Tengo 2 tablas (Madre e hija) que mantienen una relación entre ellas, para el ejemplo que nos ocupa hemos puesto nombre de estancias de una casa en la tabla madre, y en la tabla hija las tareas a realizar en cada una de estas estancias, hay un identificador único (Id) para cada estancia y otro identificador único (Id) para cada tarea, así mismo hay un campo en cada una de las tablas para indicar la posición o orden de cada elemento dentro del informe.

Informe de ejemplo - Estancias y tareas
Informe de ejemplo – Estancias y tareas

Supongamos que queremos que las tareas se realicen en un orden concreto dentro del informe, podemos variar con las flechas tanto la posición de las estancias (hay que hacer las tareas antes de la cocina que de la habitación de los niños, por ejemplo) como de las tareas (hacer la cama y después pasar el aspirador)

Formulario en modo diseño
Formulario en modo diseño

En el informe pondremos las flechas y hay que tener cuidado al elegir la agrupación de registros y sobretodo el campo que ajustará su posición (TM_Posicion y TH_Posicion en nuestro ejemplo)

Agrupación y orden del informe
Agrupación y orden del informe

En las flechas dispararemos los eventos  Click():

  • Las flechas bBajar1 y bSubir1 (color azul) suben y bajan la posición de las estancias.
  • Las flechas bBajar2 y bSubir2 (color verde) suben y bajan la posición de las tareas.
 Private Sub bBajar1_Click()
 sMoverPosiciones CurrentDb, "TablaMadre", "", "", "TM_Id", TM_Id, "TM_Posicion", TM_Posicion, "bajar"
 Report_Informe.Requery
 End Sub

Private Sub bSubir1_Click()
 sMoverPosiciones CurrentDb, "TablaMadre", "", "", "TM_Id", TM_Id, "TM_Posicion", TM_Posicion, "subir"
 Report_Informe.Requery
 End Sub

Private Sub bBajar2_Click()
 sMoverPosiciones CurrentDb, "TablaHija", "TH_TM_Id", TH_TM_Id, "TH_Id", TH_Id, "TH_Posicion", TH_Posicion, "bajar"
 Report_Informe.Requery
 End Sub

Private Sub bSubir2_Click()
 sMoverPosiciones CurrentDb, "TablaHija", "TH_TM_Id", TH_TM_Id, "TH_Id", TH_Id, "TH_Posicion", TH_Posicion, "subir"
 Report_Informe.Requery
 End Sub
Y aquí la función para transponer las posiciones:
'**************************************************************************************
 ' www.manteniendo.com
 '**************************************************************************************
 ' SUB: sMoverPosiciones(dbBBDD, sTabla, sCampoIdMadre, sValorIdMadre, sCampoIdHija, sValorIdHija, sCampoPosicion, sValorPosicion, sSentido)
 ' DESCRIPCIÓN: Ordenar valores en 2 tablas relacionadas con un campo de orden propio en cada una.
 ' ARGUMENTOS:
 ' dbBBDD: objeto Database que contiene la base de datos
 ' sTabla: nombre de la tabla en la que realizaremos el posicionamiento
 ' sCampoIdMadre: nombre del campo clave de la tabla madre
 ' sValorIdMadre: valor de Id del campo a ordenar en la tabla madre
 ' sCampoIdHija: nombre del campo Id de la tabla hija
 ' sValorIdHija: valor de Id del registro a ordenar en la tabla hija
 ' sCampoPosicion: nombre del campo de la tabla que contiene el valor de posicion
 ' sValorPosicion: valor de la posicion actual
 ' sSentido: sentido del posicionamiento > "subir" o "bajar"
 ' REQUISITOS:
 ' Los valores deben estar correctamente en la tabla original,
 ' correlativos y empezando de 0 o 1. Cuidado especial al crear
 ' las filas de la tabla.
 '**************************************************************************************
 ' Realizado y testeado con Access 2013 32bit sobre Windows 7
 '**************************************************************************************
 Sub sMoverPosiciones(dbBBDD As Variant, sTabla As String, sCampoIdMadre As String, sValorIdMadre As String, sCampoIdHija As String, sValorIdHija As String, sCampoPosicion As String, sValorPosicion As String, sSentido As String)
 Dim sqlQuery, sqlQueryWhere, sqlQuery1, sqlQuery2 As String
 Dim sSigno1, sSigno2 As String

Select Case sSentido 'Elegimos las operaciones para hacer la conmutación de posición
 Case "subir"
 sValorPosicion = sValorPosicion - 1
 sSigno1 = "+"
 sSigno2 = "-"
 Case "bajar"
 sValorPosicion = sValorPosicion + 1
 sSigno1 = "-"
 sSigno2 = "+"
 End Select

sqlQuery = "UPDATE " & sTabla & " SET [" & sCampoPosicion & "]=([" & sCampoPosicion & "]"
 With dbBBDD
 If sCampoIdMadre <> "" Then
 sqlQueryWhere = "[" & sCampoIdMadre & "]= " & sValorIdMadre & " AND "
 Else
 sqlQueryWhere = ""
 End If
 sqlQuery1 = sqlQuery & sSigno1 & "1) WHERE " & sqlQueryWhere & " [" & sCampoPosicion & "]=" & sValorPosicion
 .Execute sqlQuery1
 If .RecordsAffected >= 1 Then
 sqlQuery2 = sqlQuery & sSigno2 & "1) WHERE [" & sCampoIdHija & "]=" & sValorIdHija
 .Execute sqlQuery2
 Else
 MsgBox "No se puede " & sSentido & " más", vbCritical
 End If
 End With
 Set dbBBDD = Nothing
 End Sub

Comparte con


4 comentarios en “Informe con registros ordenables”

    • Hola Eduardo,

      El ejemplo lo he realizado sólo con versión de 32 bits, pero creo que aún así debería funcionar correctamente en una versión 64bits.
      ¿Me podrías indicar el error que tienes al intentar abrirla en un 64bits?

      Saludos!

Si tienes alguna duda, crítica o sugerencia lo leeré encantado

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.