Buenas noches:
Gracias ante todo por vuestras aportaciones.
Tengo un formulario que utilizo para hacer diversas búsquedas, filtrando la información en base a una consulta que va cambiando mediante los distintos filtros aplicados.
Me gustaría poder cambiar el orden, mediante una macro, de las columnas del grid del formulario, ya que hay bastantes y la relevancia de unas u otras depende del filtro utilizado.
Adjunto ejemplo de la BD.
Saludos y buenas noches a todos.
[RESUELTO] Macro cambiar orden columnas grid formulario
[RESUELTO] Macro cambiar orden columnas grid formulario
- Adjuntos
-
- prm2.7z
- (118.46 KiB) Descargado 169 veces
Última edición por pmartimor el Dom Abr 01, 2018 12:03 am, editado 1 vez en total.
LibreOffice 5.1.0.3 en clientes Windows 10, 7, XP sobre BD MySql.
Re: Macro cambiar orden columnas grid formulario
Buenas!
En lo que yo conozco, por el momento no se puede.
El control de tablas es un tanto incómodo de manejar, ya que no es un control, sino un control con muchos controles dentro, y no se maneja como que fuese una tabla, precisamente.
Lo que sí que puedes hacer es ocultar columnas según conveniencia, e incluso seleccionar una columna que te quedará con el color de fondo predeterminado, pero en cuanto toques otra parte del control se te va ese color. No sé si te sirva algo de lo que te voy a poner, pero son los trabajos de Romke, que en su día intenté adaptar y desarrollar, pero quedó el proyecto atascado:
Seleccionar una columna:
Seleccionar una fila:
Seleccionar varias filas (en columnas no he sabido seleccionar más de una):
Recorrer todas las columnas:
Recorrer todas las filas
Ocultar una columna:
Y después hay otras variaciones buscando texto, etc.
Esperemos que te sirva de algo.
Un saludo!
En lo que yo conozco, por el momento no se puede.
El control de tablas es un tanto incómodo de manejar, ya que no es un control, sino un control con muchos controles dentro, y no se maneja como que fuese una tabla, precisamente.
Lo que sí que puedes hacer es ocultar columnas según conveniencia, e incluso seleccionar una columna que te quedará con el color de fondo predeterminado, pero en cuanto toques otra parte del control se te va ese color. No sé si te sirva algo de lo que te voy a poner, pero son los trabajos de Romke, que en su día intenté adaptar y desarrollar, pero quedó el proyecto atascado:
Seleccionar una columna:
Código: Seleccionar todo
Sub SeleccionarColumna (Event)
'---------------------------------------------------------
' 0º Declaramos las variables
Dim oDoc As Variant, ocontoller As Variant, oForm As Variant, oCtrl As Variant
Dim oTableControl As Variant, Columna As Variant
'--------------------------------------------------------
' 1º Abrimos el formulario
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Mantenemos la conexión
oDoc = Thisdatabasedocument.formdocuments.getbyname("Formulario1").open ' Abrimos el formulario
oForm=oDoc.drawpage.forms.getbyname("Formulario1") ' Nos hacemos con el control del formulario
oCtrl=oForm.getbyname("CT") ' Control de tablas
oTableControl=oDoc.getCurrentController.getcontrol(oCtrl) ' Nos hacemos con el control del control de tablas
Columna= oCtrl.getbyname("CLAVE") ' Columna en la tabla que queremos seleccionar
'---------------------------------------------------------
' 2º Seleccionamos la columna
wait 100 ' Si no hacemos la espera nos dará un error
oCtrl.select(Columna) ' Seleccionamos la columna
End Sub
Código: Seleccionar todo
Sub SeleccionarFila (Event)
'---------------------------------------------------------
' 0º Declaramos las variables
Dim oDoc As Variant, ocontoller As Variant, oForm As Variant, oCtrl As Variant
Dim oTableControl As Variant, Columna As Variant, Fila As Variant
'--------------------------------------------------------
' 1º Abrimos el formulario
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Mantenemos la conexión
oDoc = Thisdatabasedocument.formdocuments.getbyname("Formulario1").open ' Abrimos el formulario
oForm=oDoc.drawpage.forms.getbyname("Formulario1") ' Nos hacemos con el control del formulario
oCtrl=oForm.getbyname("CT") ' Control de tablas
oTableControl=oDoc.getCurrentController.getcontrol(oCtrl) ' Nos hacemos con el control del control de tablas
'---------------------------------------------------------
' 2º Seleccionamos la Fila
wait 100 ' Si no hacemos la espera nos dará un error
oForm.last
Fila=array(2,Nothing) ' Array que indica fila 2
oTableControl.Select(Fila) ' Fila seleccionada '
End Sub
Código: Seleccionar todo
Sub SeleccionarVariasFilas (Event)
'---------------------------------------------------------
' 0º Declaramos las variables
Dim oDoc As Variant, ocontoller As Variant, oForm As Variant, oCtrl As Variant
Dim oTableControl As Variant, Columna As Variant, Fila As Variant
'--------------------------------------------------------
' 1º Abrimos el formulario
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Mantenemos la conexión
oDoc = Thisdatabasedocument.formdocuments.getbyname("Formulario1").open ' Abrimos el formulario
oForm=oDoc.drawpage.forms.getbyname("Formulario1") ' Nos hacemos con el control del formulario
oCtrl=oForm.getbyname("CT") ' Control de tablas
oTableControl=oDoc.getCurrentController.getcontrol(oCtrl) ' Nos hacemos con el control del control de tablas
'---------------------------------------------------------
' 2º Seleccionamos la Fila
oCon = ThisDatabaseDocument.CurrentController.ActiveConnection ' Activamos la conexión con la base de datos
oStat = oCon.CreateStatement ' Creamos el Statement
oSQLQuery ="SELECT COUNT( ""ID"" ) FROM ""SECCION""" ' Consulta que nos da el número total de filas
oStat.setPropertyValue("ResultSetType",1005) ' Características de la consulta
oResultSet = oStat.executeQuery(oSQLQuery) ' Se ejecuta la consulta
While oResultSet.next ' Ciclo de ejecución de la consulta
Filas= CInt(oResultSet.GetString(1)) ' Resultado de la única fila de la consulta
wEND ' Se acaba el ciclo
'--------------------------------------------------------
' 3º Establecemos un ciclo que recorre todas las filas
' for i= 1 to Filas ' Empezamos el ciclo
' wait 100 ' Si no hacemos la espera nos dará un error
' Fila=array(i,Nothing) ' Array que recorre las distintas filas
' oTableControl.Select(Fila) ' Fila seleccionada '
' Next
Fila=array(1,2,3,4,5,Nothing) ' Array que selecciona todas las filas
oTableControl.Select(Fila) ' Filas seleccionadas
End Sub
Código: Seleccionar todo
Sub SeleccionarVariasColumnas (Event)
'---------------------------------------------------------
' 0º Declaramos las variables
Dim oDoc As Variant, ocontoller As Variant, oForm As Variant, oCtrl As Variant
Dim oTableControl As Variant, Columna As Variant, Fila As Variant
'--------------------------------------------------------
' 1º Abrimos el formulario
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Mantenemos la conexión
oDoc = Thisdatabasedocument.formdocuments.getbyname("Formulario1").open ' Abrimos el formulario
oForm=oDoc.drawpage.forms.getbyname("Formulario1") ' Nos hacemos con el control del formulario
oCtrl=oForm.getbyname("CT") ' Control de tablas
oTableControl=oDoc.getCurrentController.getcontrol(oCtrl) ' Nos hacemos con el control del control de tablas
'---------------------------------------------------------
' 2º Seleccionamos la Columna
'
Columnas = oCtrl.Count-1 ' Número de columnas
For i=0 to Columnas
a=oCtrl.getbyIndex(i)
wait 100 ' Si no hacemos la espera nos dará un error
oCtrl.select(a) ' Seleccionamos la columna
Next
oCtrl.TextColor = RGB(120,50,250)
End Sub
Código: Seleccionar todo
Sub SeleccionarTodasFilas (Event)
'---------------------------------------------------------
' 0º Declaramos las variables
Dim oDoc As Variant, ocontoller As Variant, oForm As Variant, oCtrl As Variant
Dim oTableControl As Variant, Columna As Variant, Fila As Variant
'--------------------------------------------------------
' 1º Abrimos el formulario
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Mantenemos la conexión
oDoc = Thisdatabasedocument.formdocuments.getbyname("Formulario1").open ' Abrimos el formulario
oForm=oDoc.drawpage.forms.getbyname("Formulario1") ' Nos hacemos con el control del formulario
oCtrl=oForm.getbyname("CT") ' Control de tablas
oTableControl=oDoc.getCurrentController.getcontrol(oCtrl) ' Nos hacemos con el control del control de tablas
'---------------------------------------------------------
' 2º Seleccionamos la Fila
oCon = ThisDatabaseDocument.CurrentController.ActiveConnection ' Activamos la conexión con la base de datos
oStat = oCon.CreateStatement ' Creamos el Statement
oSQLQuery ="SELECT COUNT( ""ID"" ) FROM ""SECCION""" ' Consulta que nos da el número total de filas
oStat.setPropertyValue("ResultSetType",1005) ' Características de la consulta
oResultSet = oStat.executeQuery(oSQLQuery) ' Se ejecuta la consulta
While oResultSet.next ' Ciclo de ejecución de la consulta
Filas= CInt(oResultSet.GetString(1)) ' Resultado de la única fila de la consulta
wEND ' Se acaba el ciclo
'--------------------------------------------------------
' 3º Establecemos un ciclo que recorre todas las filas
for i= 1 to Filas ' Empezamos el ciclo
wait 100 ' Si no hacemos la espera nos dará un error
Fila= array(i,Nothing) ' Array que recorre las distintas filas
oTableControl.Select(Fila) ' Fila seleccionada '
Next
End Sub
Código: Seleccionar todo
Sub EliminarUnaColumna
'---------------------------------------------------------
' 0º Declaramos las variables
Dim oDoc As Variant, ocontoller As Variant, oForm As Variant, oCtrl As Variant
Dim oTableControl As Variant, Columna As Variant, Fila As Variant, oTableView As Variant
'--------------------------------------------------------
' 1º Abrimos el formulario
ocontroller = Thisdatabasedocument.currentController
if not ocontroller.isconnected then ocontroller.connect ' Mantenemos la conexión
oDoc = Thisdatabasedocument.formdocuments.getbyname("Formulario1").open ' Abrimos el formulario
oForm=oDoc.drawpage.forms.getbyname("Formulario1") ' Nos hacemos con el control del formulario
oCtrl=oForm.getbyname("CT") ' Control de tablas
oTableControl=oDoc.getCurrentController.getcontrol(oCtrl) ' Nos hacemos con el control del control de tablas
oTableView=oTableControl
Columna=oCtrl.getbyindex(1)
Columna.hidden=not Columna.hidden ' Only a column
end
oTableView.Visible=false
end sub
Esperemos que te sirva de algo.
Un saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10
Re: Macro cambiar orden columnas grid formulario
Muchas gracias Longi. Probaré la selección de columnas; esto hará que al menos destaque la columna relacionada con la ordenación. El problema estará en las columnas que queden ocultas por la derecha, aunque se puede utilizar la barra de desplazamiento, o bien utilizar distintas consultas que establezcan de forma predeterminada el orden de las columnas.
Saludos cordiales.
Saludos cordiales.
LibreOffice 5.1.0.3 en clientes Windows 10, 7, XP sobre BD MySql.
Re: [RESUELTO] Macro cambiar orden columnas grid formulario
Buenas!
Con respecto a la última parte de tu respuesta quisiera especificar alguna cosa:
Un control de tablas es un control dentro de un formulario. Si pretendes cambiar el origen de los datos (distintas consultas), tendrías que cambiar el origen de los datos del formulario.
Además, cada columna podríamos asimilarla a un campo de datos en un control, que tienen un origen de datos definido según el origen de datos del formulario, lo cual nos lleva a que al cambiar la fuente de datos, cada columna (que son fijas, y ese es el quiz), no va a encontrar el origen que se le había asignado previamente.
Todo esto me hizo pensar, y creo que sí que sería posible el hacer los cambios programáticamente, pero, suponiendo que mantengas la consulta origen del formulario en el que está el control de tablas, habría que acceder a la columna por el índice, acceder al nombre de la columna y cambiarlo por el nuevo, y acceder al origen de datos de la columna y cambiárselo también. (Esto si no hay que cambiar también el tipo de campo. Imagínate que de un campo texto quieres pasarlo a un combobox.....)
O sea, que hay que mantener la columna (el índice) y cambiarle todas las propiedades, como si lo hicieses a mano en el diseño del formulario cada vez que lo abres. Vamos, una locura!
Nos lo podríamos plantear para una o unas pocas columnas, pero no más.
Por otro lado, estuve rumiando un poco el asunto, y quizá sea más sencillo lo siguiente:
Haces tantos controles de tabla como necesites (todos dependientes de la misma consulta y en el mismo formulario, solo que con el orden de columnas que te interese). Todos tendrán que tener el mismo tamaño y las mismas coordenadas (uno encima de otro), y los pones como invisibles, excepto uno, claro!
Según lo que vayas a hacer ocultarás todos y descubrirás solo uno (el elegido en cada momento)
Esto te va a hacer la base un poco más pesada, pero no supone casi problema de programación, mientras que lo otro tiene pinta de ser una locura.
Ya nos cunetas!
Otro saludo!
Con respecto a la última parte de tu respuesta quisiera especificar alguna cosa:
Un control de tablas es un control dentro de un formulario. Si pretendes cambiar el origen de los datos (distintas consultas), tendrías que cambiar el origen de los datos del formulario.
Además, cada columna podríamos asimilarla a un campo de datos en un control, que tienen un origen de datos definido según el origen de datos del formulario, lo cual nos lleva a que al cambiar la fuente de datos, cada columna (que son fijas, y ese es el quiz), no va a encontrar el origen que se le había asignado previamente.
Todo esto me hizo pensar, y creo que sí que sería posible el hacer los cambios programáticamente, pero, suponiendo que mantengas la consulta origen del formulario en el que está el control de tablas, habría que acceder a la columna por el índice, acceder al nombre de la columna y cambiarlo por el nuevo, y acceder al origen de datos de la columna y cambiárselo también. (Esto si no hay que cambiar también el tipo de campo. Imagínate que de un campo texto quieres pasarlo a un combobox.....)
O sea, que hay que mantener la columna (el índice) y cambiarle todas las propiedades, como si lo hicieses a mano en el diseño del formulario cada vez que lo abres. Vamos, una locura!
Nos lo podríamos plantear para una o unas pocas columnas, pero no más.
Por otro lado, estuve rumiando un poco el asunto, y quizá sea más sencillo lo siguiente:
Haces tantos controles de tabla como necesites (todos dependientes de la misma consulta y en el mismo formulario, solo que con el orden de columnas que te interese). Todos tendrán que tener el mismo tamaño y las mismas coordenadas (uno encima de otro), y los pones como invisibles, excepto uno, claro!
Según lo que vayas a hacer ocultarás todos y descubrirás solo uno (el elegido en cada momento)
Esto te va a hacer la base un poco más pesada, pero no supone casi problema de programación, mientras que lo otro tiene pinta de ser una locura.
Ya nos cunetas!
Otro saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Libreoffice 6.4.2, en Windows 10