none
Reporte descuadrado - Cursores RRS feed

  • Pregunta

  • Hola amigos una consulta he realizado un cursor, pero los datos mostrados salen descuadrados me pueden ayudar o que puedo hacer para que los datos salgan mas ordenados y que cuadre en cada columna. Adjunto la imagen del reporte y el query del cursor.

    DECLARE @IdVen int,@Usu varchar(50),@Cli varchar(50),@Fe datetime, @To money
    DECLARE CURSOR_PRODUCTO CURSOR
    FOR select v.IdVenta, u.Nombre as Usuario, c.Nombre as Cliente, v.Fecha, v.Total
    from Doc_Venta v
    inner join cliente c on v.IdCli=c.IdCliente
    inner join usuario u on v.IdUsu=u.IdUsuario
    OPEN CURSOR_PRODUCTO
    FETCH CURSOR_PRODUCTO into @IdVen, @Usu, @Cli, @Fe, @To
    print '       REPORTE DE VENTAS DE LOS CLIENTES'
    print replicate('*',50)
    print ''
    print 'IdVenta    Usuario Cliente Fecha Total'
    print '=========================================================================='
    WHILE @@FETCH_STATUS=0
    BEGIN
    print cast(@IdVen as char(2))+space(8)+@Usu+space(8)+@Cli+space(8)+cast(@Fe as char(20))+space(8)+cast(@To as char(8))
    FETCH CURSOR_PRODUCTO into @IdVen, @Usu, @Cli, @Fe, @To
    END
    CLOSE CURSOR_PRODUCTO
    DEALLOCATE CURSOR_PRODUCTO


    jueves, 9 de mayo de 2019 22:17

Respuestas

  • Hola Michael_CS20:

    Print no es la herramienta adecuada para hacer reportes, y mucho menos para trabajarlos.

    No obstante

    CREATE TABLE Doc_Venta
    (idVenta INT IDENTITY(1, 1)
    , Fecha   DATETIME
    , Total   DECIMAL(10, 2)
    , idCli   INT
    , idUsu   INT
    );
    
    CREATE TABLE cliente
    (idCliente INT
    , Nombre    VARCHAR(30)
    );
    
    CREATE TABLE usuario
    (idUsuario INT
    , Nombre    VARCHAR(30)
    );
    go
    insert into Doc_Venta (Fecha, total, idCli, idusu)
    values
    ('20190430 12:00',500.00, 1,1),
    ('20190501 12:00',100.00, 2,2),
    ('20190509 12:00',50.00, 3,3),
    ('20190509 12:00',300.00, 4,4),
    ('20190428 12:00',600.00, 5,5);
    go
    insert into cliente (idCliente, Nombre)
    values 
    (1,'Jose Jose'),
    (2,'Erick'),
    (3,'Chayane'),
    (4,'Luis Miguel'),
    (5,'Thalia');
    go
    insert into usuario (idUsuario, Nombre)
    values
    (1,'Valeria'),
    (2,'Lucia'),
    (3,'Rosa'),
    (4,'Alex'),
    (5,'Pool');
    go
    
    

    Una vez tengo tu escenario creado

    DECLARE @IdVen INT, @Usu VARCHAR(50), @Cli VARCHAR(50), @Fe DATETIME, @To MONEY; DECLARE CURSOR_PRODUCTO CURSOR FOR SELECT v.IdVenta , u.Nombre AS Usuario , c.Nombre AS Cliente , v.Fecha , v.Total FROM Doc_Venta v INNER JOIN cliente c ON v.IdCli = c.IdCliente INNER JOIN usuario u ON v.IdUsu = u.IdUsuario; OPEN CURSOR_PRODUCTO; FETCH CURSOR_PRODUCTO INTO @IdVen, @Usu, @Cli, @Fe, @To; PRINT ' REPORTE DE VENTAS DE LOS CLIENTES'; PRINT REPLICATE('*', 80); PRINT ''; PRINT cast('IdVenta' as char(12))+cast('Usuario' as char(20))+casT('Cliente' as char(20))+cast('Fecha' as char(23))+cast('Total' as char(20)); PRINT cast(replicate('=',100) as char(80)); WHILE @@FETCH_STATUS = 0 BEGIN PRINT CAST(@IdVen AS CHAR(2)) + CHAR(09)+char(09)+char(09) + cast(@Usu as char(20))+ cast(@Cli as char(20)) + CAST(@Fe AS CHAR(20)) + CAST(@To AS CHAR(8)); FETCH CURSOR_PRODUCTO INTO @IdVen, @Usu, @Cli, @Fe, @To; END; CLOSE CURSOR_PRODUCTO; DEALLOCATE CURSOR_PRODUCTO;

    La ciencia esta en hacer un cast a char porque este equivale a posiciones fijas. Si le digo cast(usu as char(20)) al final va a imprimir 20 caracteres aunque no los haya, por tanto 20 espacios.

    jueves, 9 de mayo de 2019 22:46

Todas las respuestas

  • Creo que el objetivo de SQL Server, no es hacer REPORTES, existe un servicio que se llama REPORTING, ahi debería intentar generar su reporte, ¿Estamos hablando de SQL Server, cierto?

    IIslas Master Consultant SQL Server

    jueves, 9 de mayo de 2019 22:33
  • Hola Michael_CS20:

    Print no es la herramienta adecuada para hacer reportes, y mucho menos para trabajarlos.

    No obstante

    CREATE TABLE Doc_Venta
    (idVenta INT IDENTITY(1, 1)
    , Fecha   DATETIME
    , Total   DECIMAL(10, 2)
    , idCli   INT
    , idUsu   INT
    );
    
    CREATE TABLE cliente
    (idCliente INT
    , Nombre    VARCHAR(30)
    );
    
    CREATE TABLE usuario
    (idUsuario INT
    , Nombre    VARCHAR(30)
    );
    go
    insert into Doc_Venta (Fecha, total, idCli, idusu)
    values
    ('20190430 12:00',500.00, 1,1),
    ('20190501 12:00',100.00, 2,2),
    ('20190509 12:00',50.00, 3,3),
    ('20190509 12:00',300.00, 4,4),
    ('20190428 12:00',600.00, 5,5);
    go
    insert into cliente (idCliente, Nombre)
    values 
    (1,'Jose Jose'),
    (2,'Erick'),
    (3,'Chayane'),
    (4,'Luis Miguel'),
    (5,'Thalia');
    go
    insert into usuario (idUsuario, Nombre)
    values
    (1,'Valeria'),
    (2,'Lucia'),
    (3,'Rosa'),
    (4,'Alex'),
    (5,'Pool');
    go
    
    

    Una vez tengo tu escenario creado

    DECLARE @IdVen INT, @Usu VARCHAR(50), @Cli VARCHAR(50), @Fe DATETIME, @To MONEY; DECLARE CURSOR_PRODUCTO CURSOR FOR SELECT v.IdVenta , u.Nombre AS Usuario , c.Nombre AS Cliente , v.Fecha , v.Total FROM Doc_Venta v INNER JOIN cliente c ON v.IdCli = c.IdCliente INNER JOIN usuario u ON v.IdUsu = u.IdUsuario; OPEN CURSOR_PRODUCTO; FETCH CURSOR_PRODUCTO INTO @IdVen, @Usu, @Cli, @Fe, @To; PRINT ' REPORTE DE VENTAS DE LOS CLIENTES'; PRINT REPLICATE('*', 80); PRINT ''; PRINT cast('IdVenta' as char(12))+cast('Usuario' as char(20))+casT('Cliente' as char(20))+cast('Fecha' as char(23))+cast('Total' as char(20)); PRINT cast(replicate('=',100) as char(80)); WHILE @@FETCH_STATUS = 0 BEGIN PRINT CAST(@IdVen AS CHAR(2)) + CHAR(09)+char(09)+char(09) + cast(@Usu as char(20))+ cast(@Cli as char(20)) + CAST(@Fe AS CHAR(20)) + CAST(@To AS CHAR(8)); FETCH CURSOR_PRODUCTO INTO @IdVen, @Usu, @Cli, @Fe, @To; END; CLOSE CURSOR_PRODUCTO; DEALLOCATE CURSOR_PRODUCTO;

    La ciencia esta en hacer un cast a char porque este equivale a posiciones fijas. Si le digo cast(usu as char(20)) al final va a imprimir 20 caracteres aunque no los haya, por tanto 20 espacios.

    jueves, 9 de mayo de 2019 22:46
  • GRACIAS
    viernes, 10 de mayo de 2019 0:24
  • de nada
    viernes, 10 de mayo de 2019 4:35