locked
problema con MultiColumna en Reporte con Reporting Services RRS feed

  • Pregunta

  • Hola, me dirijo a todos con la cabeza quebrada, jaja.

    Ya tengo varias semanas con el mismo problema y no logro encontrar una solución, ya busque en la web y no hay manera.
    Resulta que tengo un reporte donde expongo varios datos de una persona, nombre, curp, domicilio, etc., pero también en el mismo reporte le pongo sus pagos que han hecho a una caja de ahorro, los datos del empleado, los pongo bien en el reporte, el problema son los pagos, que tienen este formato:

    Pago     Fecha              ID
    100       1/01/2009        1
    85         4/02/2009        2
    50.7      17/03/2009      3
    367.3    28/04/2009      4
    ...
    ...

    Así es como regresa los datos la consulta T-SQL, pero si lo pongo en un control 'Table' asi nada mas, lo que hace es utilizar muchas hojas, por la cantidad de información. Entonces lo que trato de hacer es acomodar esa información en varias columnas, de tal forma que se puedan acomodar en la menor cantidad de hojas.

    Los intentos que ya he hecho es poner un sub-reporte, pero me renderiza una sola columna (el reporte maestro solo tiene una columna) y no es como lo quiero.

    Lo último que hice fue acomodarlo en una tabla, y esa tabla la meto en una matriz, agrupándolos en un 'List' con la siguiente expresión: =Ceiling(RowNumber(Nothing)/2), luego en los grupos de columnas de la matriz pongo la siguiente expresión: =RowNumber("list1_Details_Group"), y me pone los datos en 2 columnas a lo ancho de la hoja (esto lo vi en un post, y que me disculpe el autor, pero no recuerdo la página), el resultado de esto es asi:

    Pago     Fecha              ID         Pago     Fecha              ID
    100       1/01/2009        1           85         4/02/2009       2
    50.7      17/03/2009      3           367.3    28/04/2009      4
    ...                                             ...

    El problema, es que se lee de izquierda a derecha y luego hacia abajo, y lo que me piden es que lo hagan de arriba hacia abajo y luego a la derecha, algo asi:

    Pago     Fecha              ID         Pago     Fecha              ID
    100       1/01/2009        1          367.3    28/04/2009      4
    85         4/02/2009        2          ...
    50.7      17/03/2009      3          ...

    Esto es porque asi se lee su estado de cuenta, y les sirve de mucho que la información se presentara así, pero ya no encuentro solución.

    Utilizo SQL Server 2005 Reporting Services.

    Quien guste ayudarme, se lo agradeceré.
    • Editado eLOriginal martes, 9 de junio de 2009 17:00
    martes, 9 de junio de 2009 16:48

Respuestas

  • Ok, mas que nada el problema es acomodar el contenido de una tabla en una sola hoja a través de columnas, es decir, si la tabla tiene 100 registros, en la hoja normalmente se dibujarían unos en la primera hoja (supongamos que caben 25 registros x hoja) y al terminar seguiría con la siguiente hoja, llevándose un total de 4 hojas para dibujar todos los registros de la tabla.

    Lo que deseo obtener es que dicha tabla acomode su contenido al ancho de la hoja, permitiendo formar 'columnas' con los datos, y que la lectura de dichos datos (es decir, cómo se dibujarian los registros) sea de arriba hacia abajo, y luego a la siguiente columna (el ejemplo mas común son las columnas de Word, asi es exactamente como deseo mi informe).

    Fran Diaz tiene razon en cuanto al diseño para un cierto tamaño de hoja, me disculpo por poner esa restricción, cuando uno diseña para un cierto tamaño es obvio que lo hace porque se va a imprimir así.

    Pues bien después de tanto batallar (casi como 2 meses o algo asi) tratando de hacerlo, he encontrado una solución 'temporal' que quizá no es la mejor manera de hacerlo, pero lo voy a explicar por si alguien se topa con el mismo problema.

    Lo que hice fue poner tantas tablas quería que hubiera por hoja (en forma de columna), en mi caso, 2 tablas a lo ancho, algo así:

    NameColumn1 | NameColumn2 |                             Name Column1 | NameColumn2 |
    Fields!campo1  | Fields!campo2 |                              Fields!campo1  | Fields!campo2

    Si lo pongo así, me dibuja exactamente lo mismo en las dos tablas, entonces lo que hago es 'calcular' cuántos registros caben por hoja, y solamente hacer visible los que necesito, por ejemplo en la primer tabla solo necesito los primeros 25 (suponiendo que caben 25 registros por hoja [26 con el titulo]), en la segunda tabla necesito los 'segundos' 25 registros, es decir, del registro 26 al 50 y así sucesivamente.

    Para eso en la propiedad Hidden (de Visibility) de la tabla1, pongo la siguiente expresión:
    =IIF(RowNumber(Nothing)>0 and RowNumber(Nothing)<=25,False,True)
    eso indica que va a dibujar los primeros 25 (del 1 al 25) registros que nos regrese la consulta.

    En la tabla2, pongo en la misma propiedad Hidden, la siguiente expresión:
    =IIF(RowNumber(Nothing)>25 and RowNumber(Nothing)<=50,False,True)
    esto indica que va a dibujar los 'segundos' 25 registros (del 26 al 50) que nos regrese la consulta.

    ahora, como sabrán lo que hago realmente es 'ocultar' los demás registros para que el reporteador no los dibuje, y nos da la vista de que realmente tenemos los datos ordenados de arriba hacia abajo, y luego en la siguiente columna.

    Las desventajas:
    * Tenemos que dibujar y configurar tantas tablas, calculando el numero maximo de registros que puede tener el informe, por ejemplo, si sabemos que los registros no pasan de 200 registros, en este ejemplo que puse, necesitaría 8 tablas, y como en cada hoja voy a tener 2 tablas, entonces serían a lo mucho 4 hojas.

    *Hay que estar ocultando las tablas posteriores, por ejemplo, si dibujamos las 8 tablas, hay que modificar la propiedad Hidden (de visibility) de la tabla (para que no se muestre si es que no hay registros que mostrar), por ejemplo, en la tabla 3 (donde van los registros del 51 al 75), tendríamos la siguiente expresión: =IIF(CountRows(Nothing)<51,True,False)

    Sé que es un truco y no es la mejor solución, pero hace lo que tiene que hacer, y si a alguien le sirve, pues adelante.
    • Marcado como respuesta eLOriginal viernes, 19 de junio de 2009 6:19
    viernes, 19 de junio de 2009 6:19

Todas las respuestas

  • Hola, cual es el criterio para armar las columnas? o sea usted puso aqui como que solo hay dos tablas con sus pagos. De ser asi podria hacerlo de la siguiente manera

    1) Traer la query agregando un rownumber de sql (revise la sintaxis tsql de 2005 que ya tiene una funcion Row_number())
    2) Armar dos tablas pegadas en el reporte
    3) Aplicar un filtro a cada una para que solo muestre los que tienen numero mayor a X y la otra menor a X

    Si la cantidad de tablas es variable entonces lo veo complicado hacerlo de un metodo simple y deberia usted armar su propio control de RS que lo resuelva

    Maxi Accotto Consultoria en SQL Server Buenos Aires - Argentina http://blog.maxiaccotto.com
    martes, 9 de junio de 2009 22:02
    Moderador
  • Mire Maxi, es sólo una tabla 'pagos', y lo que hago es una simple consulta 'SELECT' para obtener los datos, lo que quiero no tiene que ver con la manera en cómo me regresa los datos SQL Server, sino ubicar dichos datos en el reporte de tal manera, que ocupe 2 columnas. Imagínese que la tabla pagos, me regresa unos 500 registros, el hacerlo en un control 'Table' me significa imprimir muchas hojas ocupando sólo una region de ésta, por ello, quiero aprovechar el ancho de la hoja, poniendo los registros de tal manera que al finalizar en la primera columna, se vaya a la segunda y ahí ponga los datos, y si se acaba esa hoja, entonces pasar a la siguiente con el mismo criterio.

    Algo como esto:

    X1    X7
    X2    X8
    X3    X9
    X4    X10
    X5    X11
    X6    X12

    y no como esto (porque ya lo tengo así):

    X1   X2
    X3   X4
    X5   X6
    X7   X8
    X9   X10
    X11   X12

    Es decir, ya logré que se acomodaran en 2 columnas en la hoja, pero aun no logro que lo comience a escribir de arriba hacia abajo, y luego en la siguiente columna.

    Menciona que propone armar mi propio control de RS para resolverlo, hace tiempo que busco cómo hacerlo, y si me pone un ejemplo, seguro que intentaré hacerlo, si me proporciona algunos recursos, como un tutorial o algo.

    Por su opinión gracias.

    martes, 9 de junio de 2009 22:16
  • Hola Maxi y ElOriginal :),


    Se me ocurre algo, podrías crearte un procedmiento almacenado que ya te devolviera las columnas así como tu quieres. A ver con estos pasos:

    - Calcula según el formato de línea, fuente y tal, cuantas filas te entran en el report.
    - Luego creas varias select trayendote los datos y luego las juntas en con un union u similar dentro de tu SP
    - Una vez tienes tus columnas, montas tu report y tirar!!!

    Prueba y nos cuentas ;),

    Saludos y suerte!!


    Fran Díaz | {geeks.ms/blogs/fdiaz/} | {onobanet.com} | {secondnug.com}
    miércoles, 10 de junio de 2009 6:17
    Moderador
  • Gracias Fran por responder, pero realmente es algo mas complicado que eso.

    Antes de poner los datos de la tabla 'Pagos' en el reporte, arriba de esa tabla (metida por cierto en una Matrix) tengo otra tabla y algunos otros controles  más (como la foto del empleado, etc.) de los cuales su extensión hacia abajo en el reporte es variable, y por tal motivo me representa una restricción en la primera hoja, ya que, digamos en las posteriores no habría problema, puesto que ocuparía toda la hoja (el encabezado del reporte es estático).

    Luego me topo con que si calculo el espacio para un cierto tamaño de hoja (supongamos A4), que pasa si el usuario cambia de tamaño en el control Report Viewer?, es decir que pasa si quiere ahora imprimir en una tamaño A5, entonces ya no pondría los registros en el reporte de manera correcta, cosa que hasta ahora lo hace bien.

    He intentado casi de todo, y quisiera saber si alguien conoce la otra parte del 'casi' que yo no conozco para resolver esto.

    En espera de su respuesta, gracias....
    miércoles, 10 de junio de 2009 15:10
  • Hola de nuevo,

    Antes de poner los datos de la tabla 'Pagos' en el reporte, arriba de esa tabla (metida por cierto en una Matrix) tengo otra tabla y algunos otros controles  más (como la foto del empleado, etc.) de los cuales su extensión hacia abajo en el reporte es variable, y por tal motivo me representa una restricción en la primera hoja, ya que, digamos en las posteriores no habría problema, puesto que ocuparía toda la hoja (el encabezado del reporte es estático).

    No entiendo...explicate un poco más porfa :).

    Luego me topo con que si calculo el espacio para un cierto tamaño de hoja (supongamos A4), que pasa si el usuario cambia de tamaño en el control Report Viewer?, es decir que pasa si quiere ahora imprimir en una tamaño A5, entonces ya no pondría los registros en el reporte de manera correcta, cosa que hasta ahora lo hace bien.

    Hombre, normalmente si diseñas un informe para unas medidas son para imprimir en dichas medidas. Si imprimes más pequeño te salen más hojas  por cada hoja del informe y si imprimes más grande desperdicias igualmente más hojas

    Cuentanos un poco más ;)

    Un Saludo


    Fran Díaz | {geeks.ms/blogs/fdiaz/} | {onobanet.com} | {secondnug.com}
    martes, 16 de junio de 2009 7:19
    Moderador
  • Ok, mas que nada el problema es acomodar el contenido de una tabla en una sola hoja a través de columnas, es decir, si la tabla tiene 100 registros, en la hoja normalmente se dibujarían unos en la primera hoja (supongamos que caben 25 registros x hoja) y al terminar seguiría con la siguiente hoja, llevándose un total de 4 hojas para dibujar todos los registros de la tabla.

    Lo que deseo obtener es que dicha tabla acomode su contenido al ancho de la hoja, permitiendo formar 'columnas' con los datos, y que la lectura de dichos datos (es decir, cómo se dibujarian los registros) sea de arriba hacia abajo, y luego a la siguiente columna (el ejemplo mas común son las columnas de Word, asi es exactamente como deseo mi informe).

    Fran Diaz tiene razon en cuanto al diseño para un cierto tamaño de hoja, me disculpo por poner esa restricción, cuando uno diseña para un cierto tamaño es obvio que lo hace porque se va a imprimir así.

    Pues bien después de tanto batallar (casi como 2 meses o algo asi) tratando de hacerlo, he encontrado una solución 'temporal' que quizá no es la mejor manera de hacerlo, pero lo voy a explicar por si alguien se topa con el mismo problema.

    Lo que hice fue poner tantas tablas quería que hubiera por hoja (en forma de columna), en mi caso, 2 tablas a lo ancho, algo así:

    NameColumn1 | NameColumn2 |                             Name Column1 | NameColumn2 |
    Fields!campo1  | Fields!campo2 |                              Fields!campo1  | Fields!campo2

    Si lo pongo así, me dibuja exactamente lo mismo en las dos tablas, entonces lo que hago es 'calcular' cuántos registros caben por hoja, y solamente hacer visible los que necesito, por ejemplo en la primer tabla solo necesito los primeros 25 (suponiendo que caben 25 registros por hoja [26 con el titulo]), en la segunda tabla necesito los 'segundos' 25 registros, es decir, del registro 26 al 50 y así sucesivamente.

    Para eso en la propiedad Hidden (de Visibility) de la tabla1, pongo la siguiente expresión:
    =IIF(RowNumber(Nothing)>0 and RowNumber(Nothing)<=25,False,True)
    eso indica que va a dibujar los primeros 25 (del 1 al 25) registros que nos regrese la consulta.

    En la tabla2, pongo en la misma propiedad Hidden, la siguiente expresión:
    =IIF(RowNumber(Nothing)>25 and RowNumber(Nothing)<=50,False,True)
    esto indica que va a dibujar los 'segundos' 25 registros (del 26 al 50) que nos regrese la consulta.

    ahora, como sabrán lo que hago realmente es 'ocultar' los demás registros para que el reporteador no los dibuje, y nos da la vista de que realmente tenemos los datos ordenados de arriba hacia abajo, y luego en la siguiente columna.

    Las desventajas:
    * Tenemos que dibujar y configurar tantas tablas, calculando el numero maximo de registros que puede tener el informe, por ejemplo, si sabemos que los registros no pasan de 200 registros, en este ejemplo que puse, necesitaría 8 tablas, y como en cada hoja voy a tener 2 tablas, entonces serían a lo mucho 4 hojas.

    *Hay que estar ocultando las tablas posteriores, por ejemplo, si dibujamos las 8 tablas, hay que modificar la propiedad Hidden (de visibility) de la tabla (para que no se muestre si es que no hay registros que mostrar), por ejemplo, en la tabla 3 (donde van los registros del 51 al 75), tendríamos la siguiente expresión: =IIF(CountRows(Nothing)<51,True,False)

    Sé que es un truco y no es la mejor solución, pero hace lo que tiene que hacer, y si a alguien le sirve, pues adelante.
    • Marcado como respuesta eLOriginal viernes, 19 de junio de 2009 6:19
    viernes, 19 de junio de 2009 6:19
  • Me alegro de que al final funcionara ;)

    Un Saludo
    Fran Díaz | {geeks.ms/blogs/fdiaz/} | {onobanet.com} | {secondnug.com}
    viernes, 19 de junio de 2009 6:20
    Moderador