[RESUELTO] Macro cambiar orden columnas grid formulario

Discute sobre las herramientas de la base de datos
Responder
pmartimor
Mensajes: 63
Registrado: Jue Mar 08, 2018 2:11 pm

[RESUELTO] Macro cambiar orden columnas grid formulario

Mensaje por pmartimor »

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.
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.
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Macro cambiar orden columnas grid formulario

Mensaje por Longi »

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:

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
Seleccionar una fila:

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
Seleccionar varias filas (en columnas no he sabido seleccionar más de una):

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
Recorrer todas las columnas:

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
Recorrer todas las filas

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
Ocultar una columna:

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
Y después hay otras variaciones buscando texto, etc.
Esperemos que te sirva de algo.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
pmartimor
Mensajes: 63
Registrado: Jue Mar 08, 2018 2:11 pm

Re: Macro cambiar orden columnas grid formulario

Mensaje por pmartimor »

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.
LibreOffice 5.1.0.3 en clientes Windows 10, 7, XP sobre BD MySql.
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO] Macro cambiar orden columnas grid formulario

Mensaje por Longi »

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! :)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Responder