[RESUELTO]Limitar longitud d caracteres en un campo informe.

Discute sobre las herramientas de la base de datos
Responder
Edu9
Mensajes: 34
Registrado: Mar Ene 16, 2018 12:53 pm

[RESUELTO]Limitar longitud d caracteres en un campo informe.

Mensaje por Edu9 »

Como bien dice el titulo, deseo poder limitar el número de caracteres en el campo nombre de un informe para que no me genere doble linea.
Imaginemos que tengo una lista de nombres de señoras y que tengo algunos nombres como "Remedios de la Concepcion" que me ocupan dos lineas del informe y al limitarlo a 10 caracteres solo me ocuparía una linea de informe.
La macro que me generó amablemente Longi es esta:

Código: Seleccionar todo

Sub Informes (Event As Object)
    Wait 200
    oForm=Event.Source.Model.Parent
    Conn = ThisDatabaseDocument.CurrentController.ActiveConnection                     ' Conectamos para recoger los datos de las tablas
    oStat=Conn.createStatement()                                                       ' Creación de la conexión
    Taller= oForm.getByName("Taller").boundfield.getString
	oConsulta = ThisDatabaseDocument.DataSource.QueryDefinitions.getByName ("General") ' La consulta en la que se basa el reporte
 
    if Right (Taller,1)=1 or Right (Taller,1)=2 or Right (Taller,1)=3 Then
    Como= "%" & left (Taller,len(Taller)-1)& "%" & "%" & Right(Taller,1) &"%"
    Else
	Como= "%"& Taller &"%"  	
    End if

    oConsulta.Command= "SELECT ""1º apellido"", ""2º apellido"", ""Nombre"", ""TELEFONO 1"", ""nº Socio"" FROM ""PRUEBAMERG2"" WHERE UPPER ( ""viajes"" ) LIKE UPPER('"& Como &"')" 
    ocontroller = Thisdatabasedocument.currentController
    if not ocontroller.isconnected then ocontroller.connect                         ' Mantenemos la conexión
    oreportdoc = Thisdatabasedocument.reportdocuments.getbyname("General").open     ' Abrimos el informe
    oTexttable = oreportdoc.Texttables(0)                                           ' La tabla del informe
    Filas= oTexttable.rows.count()-1                                                ' Cuantas Filas tiene la tabla
    'oTexttable.Columns.insertByIndex(Columnas+1,2)									' Inserta otra columna
    
    oreportdoc.DrawPage(0). Control(0).Text= Taller                                               
    oreportdoc.DrawPage(1).Control(0).Text= "Mes " & Month(Now())&"/" & Year (Now())                                                                                   ' Aplicamos el tamaño
    oreportdoc.DrawPage(2). Control(2).Text= Filas 
    oreportdoc.DrawPage(3). Control(2).Text= Format(Date, "mmmm") 
    oreportdoc.DrawPage(4). Control(2).Text= Format(Date+30, "mmmm")
    oreportdoc.DrawPage(5). Control(2).Text= Format(Date+60, "mmmm")

End sub
Y tambien me gustaría que saliera ordenado por el primer apellido, pues aun poniendo en la consulta orden ascendente no me lo ordena.
Cada vez que entro en estos temas me parecen mas apasionantes pero tambien muy complejos para mi, ya, viejo cerebro.
Gracias por vuestra dedicación.
Última edición por Edu9 el Jue May 10, 2018 8:49 pm, editado 1 vez en total.
LibreOffice 7.2 en Windows 7
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Limitar longitud de caracteres en un campo informe.

Mensaje por Longi »

Buenas!
En cuanto a la longitud del nombre tienes varias posibilidades:
1- Como ya has tenido acceso a la barra de herramientas de tabla, puedes modificar formatos en cada celda, es decir, puedes reducir el tamaño de la letra, si eso no supone un problema.
2- Te puedes colocar en el extremo de la celda del encabezamiento y cuando el cursor haya cambiado de forma, entonces puedes adaptar la anchura de la columna de nombre, o reducir la de teléfono, para dejar más espacio, según veas.
3- Te colocas a la izquierda de la fila donde irán los datos (la que no es encabezamiento) y el cursor cambiará a una flecha, y entonces clickas, con lo que seleccionas toda la fila. Después vas a menú>Tabla>Tamaño>Altura de fila, y desmarcas 'Ajuste dinámico', con lo que hay que dar una altura fija, que puede ser 0,5 ó 0,6 ctms, mucho más no porque se te va del número de filas que querías tener.
De este modo, aunque tenga letras demás no te saldrá una fila doble.
4- En la consulta con la que se genera el informe puedes utilizar esta función: LEFT( "Nombre", 10 ), poniéndole en el Alias la palabra Nombre. Lo que hace es coger los 10 primeros caracteres del nombre. Esto mismo te serviría para los apellidos, por ejemplo.

El tema del orden en el informe ya sabía que iba a salir, pero dejé correr el tiempo.
No deja de ser una pregunta diferente y no menor, por lo que lo normal sería tratarla en otro hilo.
Te lo respondo en otro post, así si algún administrador lo quiere separar en dos hilos diferentes se lo pongo algo más fácil.
De momento espero que puedas usar sin problemas cualquiera de las opciones que te aporto (quizá la 3ª sea la más cómoda, sobre todo por lo que vendrá en la siguiente respuesta.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: Limitar longitud de caracteres en un campo informe.

Mensaje por Longi »

Vamos con el tema del orden en el informe!
Como decía el otro 'Yo vengo a hablar de mi libro'...., es decir, en el enlace que te puse sobre las macros para informes sin ORB, en el botón de 'Consideraciones', se despliega un informe, en el que se explican diferentes cosas sobre informes en general, y sobre las cosas hechas en esta base en particular.
Ataca en esas explicaciones el tema del orden, explicando que no responde bien de ninguna manera al orden que le propone la consulta ni al orden en el que se supone que quieres establecer en el diseño del informe, así que proponía dos posibilidades:
1- Poner en la consulta de origen de datos el campo por el que se iba a ordenar como primer campo (funciona en informes simples, de una sola tabla, y solo en ApacheOpenOffice)
2-Substituir la fuente de datos del informe, de tal manera que cambiábamos la consulta de origen por un comando SQL. Esta segunda opción es mucho más efectiva, pero me tiene un problema que aún tengo por resolver.
Quizá algún forero pueda echar una mano con esto:
En la macro que pusimos para abrir el informe hay una línea de código en la que se hace referencia a la consulta que es el origen de datos. Bien!, después hay otra línea en la que modificamos la consulta según el tipo de taller, y empieza por 'oConsulta.Command='. Esta línea hace que se modifique la consulta cada vez que abrimos el informe, así, según qué taller tengamos en el formulario, así saldrá un informe u otro. Estamos 'commandando' la consulta, la fuente de datos. (Esto también hace que sea una tontería variar la consulta, ya que cada vez que lanzas el informe te la va a dejar con el diseño que comandamos, no con el que hiciste de forma manual en la consulta)
Si cambiamos la fuente de datos a una sentencia SQL, (que ya digo que está explicado allí cómo hacer), a día de hoy no he encontrado el método (que seguro que es fácil) de 'commandar' esa sentencia SQL.
Por lo que te propongo una tercera vía, muy poco explorada por mi, pero que creo que en informes del formato antiguo, abiertos en LibreOffice si que funciona:
(haz una copia del informe, y guárdala para tu seguridad)
-Abre el informe en modo diseño
-Si no tienes abierta la barra de diseño de formularios, vete a menú>ver>barras de herramientas>diseño de formularios.
-En el quinto icono de la barra, que se llama ‘Navegador de formularios’, clickas y te aparece un diálogo en el que se muestra un icono, con el nombre ‘Formularios, y justo debajo 7 cuadrados con rayas inclinadas.
- En el sexto, llamado ‘Sorting’, picas con el botón derecho y vas a propiedades. Te abrirá otro diálogo.
- En la casilla ‘Valor’ pon: 1º apellido, que es el nombre del campo por el que quieres que te ordene, y que además es el primer campo de la consulta y del informe.
-Cierras los diálogos, le das al icono de guardar cambios en el informe, cruzas los dedos, y pruebas a ver si te funciona con datos reales (a mi me ha funcionado con tan solo dos registros, lo cual no es más que una broma, evidentemente).

Si quieres reforzar un poco el tema del orden puedes sustituir la línea 'oConsulta.Command=.....' por esta otra, que incluye el orden por el 1º apellido:

Código: Seleccionar todo

    oConsulta.Command= "SELECT ""1º apellido"", ""2º apellido"", ""Nombre"", ""TELEFONO 1"", ""nº Socio"" FROM ""PRUEBAMERG2"" WHERE UPPER ( ""viajes"" ) LIKE UPPER('"& Como &"')ORDER BY ""1º apellido"" ASC"


Ya nos cuentas cómo te fue.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Edu9
Mensajes: 34
Registrado: Mar Ene 16, 2018 12:53 pm

Re: Limitar longitud de caracteres en un campo informe.

Mensaje por Edu9 »

Hola Longi
Una vez más me te agradezco tu ayuda.
" En el sexto, llamado ‘Sorting’, picas con el botón derecho y vas a propiedades. En la casilla ‘Valor’ pon: 1º apellido,."
Esta linea me ha resuelto el problema de la ordenación alfabética.
He hecho decenas de pruebas con la linea de la macro añadiendo la función LEFT pero no la acepta, modifico la consulta en SQL y me corta el nombre perfectamente pero al ejecutar la macro ignora o rediseña la consulta no tomando en cuenta ni el corte del nombre ni la ordenación alfabetica.
Sigo investigando para poder cortar el nombre pero por el momento ya me has resuelto muchos de mis quebarderos de cabeza.
Guardo un listado de las macros de tu "informes" de mas de 100 páginas que consulto y consultaré con avidez pues es un trabajo magistral de todo lo que se puede hacer con informes. Leí las consideraciones iniciales pero no caí en el momento pues trataba de absorber todo lo que leía.
Muchas gracias otra vez Longi
LibreOffice 7.2 en Windows 7
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO]Limitar longitud d caracteres en un campo info

Mensaje por Longi »

Buenas de nuevo!
Aunque marcaste como resuelto, el tema del cortado en la consulta lo tienes sin resolver, y te explico, aunque ya te lo comenté en el post anterior:
La macro rediseña la consulta cada vez que se carga (estaba diseñada sin respetar el orden y sin cortar el nombre), y lo hace con la línea que empieza con 'oConsulta.Command= .....'. Si quieres que respete el cortado y el orden, tienes que cambiar aquí el código de la macro:

Quitar la línea:

Código: Seleccionar todo

    oConsulta.Command= "SELECT ""1º apellido"", ""2º apellido"", ""Nombre"", ""TELEFONO 1"", ""nº Socio"" FROM ""PRUEBAMERG2"" WHERE UPPER ( ""viajes"" ) LIKE UPPER('"& Como &"')"
Y substituirla por:

Código: Seleccionar todo

oConsulta.Command= " SELECT ""1º apellido"", ""2º apellido"", LEFT( ""Nombre"", 10 ) ""Nombre"", ""TELEFONO 1"", ""nº Socio"" FROM ""PRUEBAMERG2"" WHERE UPPER ( ""viajes"" ) LIKE UPPER ('""& Como &""') ORDER BY ""1º apellido"" ASC"
Con esto ya tienes orden por el primer apellido, y tienes cortado el nombre. Luego puedes hacer pruebas a cortar también los apellidos, si te resultase práctico.

Un saludo! ;)
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Edu9
Mensajes: 34
Registrado: Mar Ene 16, 2018 12:53 pm

Re: [RESUELTO]Limitar longitud d caracteres en un campo info

Mensaje por Edu9 »

Hola Longi!
La linea, tal como me la has mandado, la había probado de todas las maneras posibles pero, a mi,con windows7 y libreoffice 6, me devuelve un informe vacío.
Tanto la ordenación como el limitar la longitud no me lo acepta en la linea susodicha, o me da error devolviendo un informe vacío o ignora simplemente las funciones LEFT Y ORDER BY.
Sigo investigando y si encontrara una solución por seguro que la envío al foro.
Muchas gracias otra vez
LibreOffice 7.2 en Windows 7
Longi
Mensajes: 804
Registrado: Dom Ene 20, 2013 9:05 pm
Ubicación: Ourense, Galicia, España

Re: [RESUELTO]Limitar longitud d caracteres en un campo info

Mensaje por Longi »

Un ligero problema de sintaxis....
Prueba así:

Código: Seleccionar todo

    oConsulta.Command= " SELECT ""1º apellido"", ""2º apellido"", LEFT( ""Nombre"", 10 ) ""Nombre"", ""TELEFONO 1"", ""nº Socio"" FROM ""PRUEBAMERG2"" WHERE UPPER ( ""viajes"" ) LIKE UPPER('"& Como &"') ORDER BY ""1º apellido"" ASC"
Me sobraban unas comillas en '"& Como &"'

Otro saludo!
Openoffice 4.1.7, en Windows 10
Libreoffice 6.4.2, en Windows 10
Edu9
Mensajes: 34
Registrado: Mar Ene 16, 2018 12:53 pm

Re: [RESUELTO]Limitar longitud d caracteres en un campo info

Mensaje por Edu9 »

Una vez más me descubro ante tu dominio de las macros.
La linea funciona perfectamente y hace lo que deseaba que hiciera.
(LEFT( ""Nombre"", 10 ) ""Nombre"") esto me sorprendió, había probado todo menos esto, y tiene su lógica pues primero cortas el nombre y se lo pasas a Nombre.
Una vez más gracias mil.
LibreOffice 7.2 en Windows 7
Responder