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
¿Qué necesitamos?
Para ello partimos de lo siguiente:
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.
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)
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)
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
'************************************************************************************** ' 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
El .zip contiene:
- Archivo .accdb creado con Access 2013 32bits
- Imágenes.
Puedes modificarlo, copiarlo, distribuirlo como quieras pero siempre mencionando la fuente.
Buenos Noches. Existe versión 64 bit para acces 2013 del archivo de ejemplo de informes con registros ordenables.
Muchas gracias.
Buenos días. Por favor, necesitaría la contraseña del archivo de ejemplo de informes con registros ordenables. Muchas gracias.