none
ReportViewer - Los campos se mueven - Visual Studio RRS feed

  • Pregunta

  • Buenas noches,

    Dispongo de un problema al imprimir, yo uso el reportviewer para imprimir los datos de una factura de una forma preimpresa, osea pongo fisicamente una factura en la impresora y mi reportviewer lo que hace es llenarme los datos de la factura, obviamente yo los ajusto, resulta que me di cuenta que se ajustaba mediante yo vaya poniendo los productos osea, ya tenia ajustada la factura cada vez que yo imprima 2 productos y todo estaba en su sitio, pero al momento de añadir 3 producto toda la parte del pie de la factura se movia... espero puedan ayudarme como dejar estatica la parte de pie y el detalle se aumente sin que modifique mi pie de la factura, aqui es dejo unas imagenes.

    Claramente se puede ver como se desajusta cuando se agregan mas productos, quisiera saber como puedo hacer que la parte del pie quede estática aun cuando se estén añadiendo mas productos

    martes, 30 de octubre de 2018 6:10

Respuestas

  • Aquí va un ejemplo en el que creo una tabla con datos de prueba, otra tabla con registros vacíos, y luego hago el union y les aplico un top y order by por mediación de una CTE:

    create table Prueba
    (
        codigo varchar(5),
    	otrocampo varchar(10)
    )
    go
    insert prueba values('1','Hola'), ('2','Mundo')
    go
    
    create table vacios
    (
        codigo varchar(5),
    	otrocampo varchar(10)
    )
    go
    insert vacios values('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('','')
    go
    
    with cte as
    (
      select 0 as orden, codigo, otrocampo from prueba
        union all
      select 1, codigo, otrocampo from vacios
    )
    select top(10) codigo, otrocampo from cte order by orden, codigo
    go
    

    Resultado:

    Captura de pantalla

    martes, 30 de octubre de 2018 20:34

Todas las respuestas

  • Hay dos alternativas, ninguna de ellas particularmente sencilla.

    La primera es que el pie lo definas en el Footer del informe, en lugar del Body. De esta manera siempre queda fijo en la misma posición al final de la página. Recuerda configurar en el informe correctamente la longitud de página (y los márgenes) para que concuerde con tu papel físico. Cuando digo que esta opción no es particularmente sencilla, lo digo porque el footer no tiene acceso a los registros del mismo dataset que usas para las líneas del Body, por lo que dependiendo de cómo estés realizando los cálculos del pie puede ser que tengas que introducir cambios significativos en cuanto a la forma en que los obtienes.

    La segunda alternativa es rellenar el Body con un número fio de líneas en blanco. Me imagino que las líneas de la factura las estás generando mediante un Table. La idea es conseguir que el Table siempre tenga la misma altura. Por ejemplo, si en la factura cabe 20 líneas y solo tienes que escribir 3, entonces detrás de esas 3 líneas de datos añades 17 líneas en blanco al dataset para que el table ocupe la misma altura de 20 líneas. Cuando digo que esta opción no es particularmente sencilla, lo digo porque esta agregación de líneas en blanco hay que hacerla en el origen de datos, lo cual requiere tener buen dominio del SQL (si es que se trata de un .rdl de lado servidor, si es un .rdlc de lado cliente y lo cargas por código entonces es muy simple porque puedes rellenar el datatable con un bucle de código).

    martes, 30 de octubre de 2018 6:53
  • Gracias Alberto! Puse la parte de abajo como pie de pagina pero siempre sale en el mismo lugar así levante un poco el pie de pagina. lo que me tocara hacer es ponerlo en el body la parte que iria abajo pero generar unas columns en blanco, un procedimiento verdad? pero seria un nuevo procedimiento o lo incluyo en el procedure de imprimir factura
    martes, 30 de octubre de 2018 17:06
  • Lo de las líneas en blanco se puede hacer con un procedimiento almacenado y metiéndole un bucle, pero hay otras alternativas. Por ejemplo, puedes hacer un Select de tu tabla y luego ponerle un UNION que enlace con una tabla auxiliar que devuelva líneas en blanco (o una CTE que haga lo mismo pero sin salvarlo en una tabla). Luego le pones un "TOP 20" para que se quede con las primeras 20 filas (o las que necesites para tu informe) y lo complementas con un order by que haga que las filas ficticias queden por debajo de las filas "buenas".
    martes, 30 de octubre de 2018 17:46
  • Lo de las líneas en blanco se puede hacer con un procedimiento almacenado y metiéndole un bucle, pero hay otras alternativas. Por ejemplo, puedes hacer un Select de tu tabla y luego ponerle un UNION que enlace con una tabla auxiliar que devuelva líneas en blanco (o una CTE que haga lo mismo pero sin salvarlo en una tabla). Luego le pones un "TOP 20" para que se quede con las primeras 20 filas (o las que necesites para tu informe) y lo complementas con un order by que haga que las filas ficticias queden por debajo de las filas "buenas".

    Ingeniero, hice la tabla "Vacios" Le hice el UNION entre mis tablas detallefactura y vacios, la verdad no me manejo mucho con sql server, en mi factura se pueden añadir hasta 25 productos 

    Cree una tabla Vacios , que contiene los mismos campos que tiene mi detallefactura

    Ahora no se como hacerle el group by si hacerlo ahi mismo en mi procedure imprimir factura y como hacerlo?!


    De antemano Muchas gracias.




    martes, 30 de octubre de 2018 18:43
  • Aquí va un ejemplo en el que creo una tabla con datos de prueba, otra tabla con registros vacíos, y luego hago el union y les aplico un top y order by por mediación de una CTE:

    create table Prueba
    (
        codigo varchar(5),
    	otrocampo varchar(10)
    )
    go
    insert prueba values('1','Hola'), ('2','Mundo')
    go
    
    create table vacios
    (
        codigo varchar(5),
    	otrocampo varchar(10)
    )
    go
    insert vacios values('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('','')
    go
    
    with cte as
    (
      select 0 as orden, codigo, otrocampo from prueba
        union all
      select 1, codigo, otrocampo from vacios
    )
    select top(10) codigo, otrocampo from cte order by orden, codigo
    go
    

    Resultado:

    Captura de pantalla

    martes, 30 de octubre de 2018 20:34
  • Aquí va un ejemplo en el que creo una tabla con datos de prueba, otra tabla con registros vacíos, y luego hago el union y les aplico un top y order by por mediación de una CTE:

    create table Prueba
    (
        codigo varchar(5),
    	otrocampo varchar(10)
    )
    go
    insert prueba values('1','Hola'), ('2','Mundo')
    go
    
    create table vacios
    (
        codigo varchar(5),
    	otrocampo varchar(10)
    )
    go
    insert vacios values('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('',''),('','')
    go
    
    with cte as
    (
      select 0 as orden, codigo, otrocampo from prueba
        union all
      select 1, codigo, otrocampo from vacios
    )
    select top(10) codigo, otrocampo from cte order by orden, codigo
    go

    Resultado:

    Captura de pantalla

    Esta bien como lo he puesto ingeniero?

    El asunto es que trabajo con procedimientos porque es al momento de imprimir y mis tablas estan concatenadas

    Como condiciono esa union, que me muestre por id de factura, mas no de la tabla general que es detallefactura
    martes, 30 de octubre de 2018 22:08
  • Sí, desde luego la Select puede estar dentro de un procedimiento si es que así lo requieres. La sentencia es la misma y funciona igual con independencia de que esté dentro o fuera de un procedimiento almacenado.

    La sentencia que antes tenías, con todas sus condiciones, filtros, JOINs, etc., es la que se pone en lugar de donde yo te puse "select 0 as orden, codigo, otrocampo from prueba". La única diferencia es que añades el "0 as orden" a lo que ya tuviese esa sentencia. Es decir, tu sentencia no va ANTES de eso (como parece que se ve en tu captura de pantalla), sino que va EN LUGAR de eso.

    miércoles, 31 de octubre de 2018 6:57