none
Procedimiento Almacenado con Cursor - SQL - Mostrar en Crystal Report RRS feed

  • Pregunta

  • Estoy creando un procedimiento almacenado pero con cursor(nose mucho de cursor, he estado revisando algunas paginas), tratando de moldear lo que quiero mostrar a la forma del documento que voy a impirmir,  este procedimiento como lo añadiría al crystal report (como estoy usando cursor, no sabria como, por favor ayuden) ??:

    alter PROCEDURE Clientes_Cursor_Walter
    @NPedido as varchar(12)
    AS
    BEGIN
          SET NOCOUNT ON;
          --DECLARE THE VARIABLES FOR HOLDING DATA.(DECLARE LAS VARIABLES PARA MANTENER DATOS.)

          DECLARE @Solicitado INT,
                  @Modelo VARCHAR(50),
                  @Precio_Venta_Unit DECIMAL(10,2),
                  @Dscto_Especial_Unit DECIMAL(10,2),
                  @PrecioSin_Dscto_Especial DECIMAL(10,2),
                  @Vigencia_Acuerdo INT,
                  @Total_Venta DECIMAL(10,2),
                  @PlanTarifario VARCHAR(50),
                  @Renta_Fija_Mens_Unit DECIMAL(10,2),
                  @Forma_Pago VARCHAR(20),
                  @IMEI VARCHAR(15),
                  @CONSULTOR VARCHAR(100),
                  @Total DECIMAL(10,2)
            declare @Id_Pedido int
    set @Id_Pedido=(select Id_Pedido from LURIN_ORQUESTADOR_Pedidos_Cabecera where NumPedido=@NPedido)


          --DECLARE AND SET COUNTER.(declaere y configure el contador)
          DECLARE @Counter INT
          SET @Counter = 1

          --DECLARE THE CURSOR FOR A QUERY.(DECLARAR EL CURSOR PARA UNA CONSULTA.)
          DECLARE Print_Clientes_Cursor CURSOR READ_ONLY
          FOR
     Select 
     d.Solicitado,d.Modelo,dt.Precio_Venta_Unit,dt.Dscto_Especial_Unit,dt.PrecioSin_Dscto_Especial,
     dt.Vigencia_Acuerdo,dt.Total_Venta,d.PlanTarifario,dt.Renta_Fija_Mens_Unit,dt.Forma_Pago,dt.IMEI,
     dt.Consultor
     From LURIN_ORQUESTADOR_Pedidos_Detalle d
     inner join LURIN_ORQUESTADOR_Pedidos_Detalle_AST dt on
     d.IMEI=dt.IMEI
     Where dt.Id_Pedido = @Id_Pedido

          --OPEN CURSOR.
          OPEN Print_Clientes_Cursor

          --FETCH THE RECORD INTO THE VARIABLES.(DESCUBRA EL REGISTRO EN LAS VARIABLES)
          FETCH NEXT FROM Print_Clientes_Cursor INTO
          @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,
          @PrecioSin_Dscto_Especial,@Vigencia_Acuerdo,@Total_Venta,
          @PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,@CONSULTOR 

          --LOOP UNTIL RECORDS ARE AVAILABLE.(BUCLE HASTA QUE LOS REGISTROS ESTÉN DISPONIBLES)
          WHILE @@FETCH_STATUS = 0
          BEGIN
         --        IF @Counter = 1
         --        BEGIN
    --PRINT 'CANTIDAD |' + CHAR(9) + 'MODELO |' + CHAR(9) + CHAR(9) + CHAR(9) + 'P.VENTA |' + CHAR(9) + 'DSCTO ESPECIAL |'+ CHAR(9) +'P.SIN DSCTO |'+ CHAR(9) +'VIGENCIA |'+ CHAR(9) +'T.VENTA |'+ CHAR(9) + 'PLAN TARIFARIO |'+ CHAR(9) +'RENTA FIJA MENSUAL |'
    --PRINT '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------'
         --        END

                 --PRINT CURRENT RECORD.(IMPRIMIR REGISTRO ACTUAL)
                 PRINT CAST(@Solicitado AS VARCHAR(10)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@Modelo as varchar(50)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@Precio_Venta_Unit as varchar(10))+ CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@Dscto_Especial_Unit as varchar(10)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@PrecioSin_Dscto_Especial as varchar(10)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@Vigencia_Acuerdo as varchar(10)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@Total_Venta as varchar(10)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@PlanTarifario as varchar(10)) + CHAR(9) + CHAR(9) + CHAR(9) + 
                 cast(@Renta_Fija_Mens_Unit as varchar(10))

                 --INCREMENT COUNTER.
                 SET @Counter = @Counter + 1

                 --FETCH THE NEXT RECORD INTO THE VARIABLES.(OBTENGA EL SIGUIENTE REGISTRO EN LAS VARIABLES.)
                 FETCH NEXT FROM Print_Clientes_Cursor INTO
                  @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,@PrecioSin_Dscto_Especial,
                  @Vigencia_Acuerdo,@Total_Venta,@PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,
                  @CONSULTOR 

          END
          BEGIN

                 PRINT'--------------------------------------------------------'
                 print'                                                         '
                 print'                                                         '
                 print'                                                         '
                 --PRINT'                                  ' + cast(@Total_Venta as varchar(10))--@Total_Venta           
           END
            --///////////////////// para el TOTAL -SECCION 2 //////////////////////////////////
           --DECLARE AND SET COUNTER.(declaere y configure el contador)
          DECLARE @Counter2 INT
          SET @Counter2 = 1

          --DECLARE THE CURSOR FOR A QUERY.(DECLARAR EL CURSOR PARA UNA CONSULTA.)
          DECLARE Print_Clientes_Cursor2 CURSOR READ_ONLY
          FOR
     Select
    SUM(dt.Total_Venta)'TOTAL'
    From LURIN_ORQUESTADOR_Pedidos_Detalle d
    inner join LURIN_ORQUESTADOR_Pedidos_Detalle_AST dt on
    d.IMEI=dt.IMEI
    Where dt.Id_Pedido = @Id_Pedido

          --OPEN CURSOR.
          OPEN Print_Clientes_Cursor2

          --FETCH THE RECORD INTO THE VARIABLES.(DESCUBRA EL REGISTRO EN LAS VARIABLES)
          FETCH NEXT FROM Print_Clientes_Cursor2 INTO
          @Total

            --LOOP UNTIL RECORDS ARE AVAILABLE.(BUCLE HASTA QUE LOS REGISTROS ESTÉN DISPONIBLES)
          WHILE @@FETCH_STATUS = 0
          BEGIN

                 --PRINT CURRENT RECORD.(IMPRIMIR REGISTRO ACTUAL)
                 PRINT '                                              ' + cast(@Total as varchar(10))

                 --INCREMENT COUNTER.
                 SET @Counter2 = @Counter2 + 1

                 --FETCH THE NEXT RECORD INTO THE VARIABLES.(OBTENGA EL SIGUIENTE REGISTRO EN LAS VARIABLES.)
                 FETCH NEXT FROM Print_Clientes_Cursor2 INTO
                 @Total

          END
           --///////////////////// fin 2 //////////////////////

           BEGIN

                 PRINT '--------------------------------------------------------'
                 print'                                                         '
                 print'                                                         '
                 print'                                                         '

           END

           --///////////////////// PARA LOS FORMA DEPAGO - IMEI -CONSULTOR - SECCION 3 /////////////////////////
           --DECLARE AND SET COUNTER.(declaere y configure el contador)
          DECLARE @Counter3 INT
          SET @Counter3 = 1

          --DECLARE THE CURSOR FOR A QUERY.(DECLARAR EL CURSOR PARA UNA CONSULTA.)
          DECLARE Print_Clientes_Cursor3 CURSOR READ_ONLY
          FOR

     Select
     d.Solicitado,d.Modelo,dt.Precio_Venta_Unit,dt.Dscto_Especial_Unit,dt.PrecioSin_Dscto_Especial,
     dt.Vigencia_Acuerdo,dt.Total_Venta,d.PlanTarifario,dt.Renta_Fija_Mens_Unit,dt.Forma_Pago,dt.IMEI,
     dt.Consultor
     From LURIN_ORQUESTADOR_Pedidos_Detalle d
     inner join LURIN_ORQUESTADOR_Pedidos_Detalle_AST dt on
     d.IMEI=dt.IMEI
     Where dt.Id_Pedido = @Id_Pedido

          --OPEN CURSOR.
          OPEN Print_Clientes_Cursor3

          --FETCH THE RECORD INTO THE VARIABLES.(DESCUBRA EL REGISTRO EN LAS VARIABLES)
          FETCH NEXT FROM Print_Clientes_Cursor3 INTO
          @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,
          @PrecioSin_Dscto_Especial,@Vigencia_Acuerdo,@Total_Venta,
          @PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,@CONSULTOR

            --LOOP UNTIL RECORDS ARE AVAILABLE.(BUCLE HASTA QUE LOS REGISTROS ESTÉN DISPONIBLES)
          WHILE @@FETCH_STATUS = 0
          BEGIN

                 --PRINT CURRENT RECORD.(IMPRIMIR REGISTRO ACTUAL)
                 PRINT 'FORMA DE PAGO:' + ' ' +@Forma_Pago + CHAR(9) +-- CHAR(9)+
                 'IMEI:' + ' ' +@IMEI + CHAR(9) + --CHAR(9) +
                 @CONSULTOR 

                 --INCREMENT COUNTER.
                 SET @Counter3 = @Counter3 + 1

                 --FETCH THE NEXT RECORD INTO THE VARIABLES.(OBTENGA EL SIGUIENTE REGISTRO EN LAS VARIABLES.)
                 FETCH NEXT FROM Print_Clientes_Cursor3 INTO
                  @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,@PrecioSin_Dscto_Especial,
                  @Vigencia_Acuerdo,@Total_Venta,@PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,
                  @CONSULTOR 

          END
           --/////////////////////

          --CLOSE THE CURSOR.
          CLOSE Print_Clientes_Cursor
          DEALLOCATE Print_Clientes_Cursor
          CLOSE Print_Clientes_Cursor2
          DEALLOCATE Print_Clientes_Cursor2
          CLOSE Print_Clientes_Cursor3
          DEALLOCATE Print_Clientes_Cursor3
    END
    GO

    MUESTRA:

    

                                                                                                                                                                                                                                                                                                                            
    jueves, 14 de diciembre de 2017 4:38

Respuestas

  • Tu procedimiento está devolviendo todos sus resultados con sentencias PRINT. El Crystal no es capaz de recoger los resultados que llegan con PRINT (ni tampoco ningún otro motor de reportes, que yo sepa).

    Si no tienes más remedio que dejar los PRINT en el procedimiento, la forma de recogerlos desde código en .NET es a través del evento InfoMessage del objeto SqlConnection usado por el SqlComand que llama al procedimiento (sí, lo sé, es algo poco obvio y rebuscado). Tendrías que usar los datos devueltos en ese evento para construit un DataTable, y luego pasarle el DataTable al Crystal.

    Si puedes cambiar el procedimiento, sugiero crear una tabla temporal, cambiar todos los PRINT por INSERT sobre esa tabla temporal, y al final hacer un SELECT de la tabla y que ese resultado sea lo que devuelve el procedimiento. De esa manera sí que el Crystal puede tomar los resultados.

    jueves, 14 de diciembre de 2017 7:57

Todas las respuestas

  • Tu procedimiento está devolviendo todos sus resultados con sentencias PRINT. El Crystal no es capaz de recoger los resultados que llegan con PRINT (ni tampoco ningún otro motor de reportes, que yo sepa).

    Si no tienes más remedio que dejar los PRINT en el procedimiento, la forma de recogerlos desde código en .NET es a través del evento InfoMessage del objeto SqlConnection usado por el SqlComand que llama al procedimiento (sí, lo sé, es algo poco obvio y rebuscado). Tendrías que usar los datos devueltos en ese evento para construit un DataTable, y luego pasarle el DataTable al Crystal.

    Si puedes cambiar el procedimiento, sugiero crear una tabla temporal, cambiar todos los PRINT por INSERT sobre esa tabla temporal, y al final hacer un SELECT de la tabla y que ese resultado sea lo que devuelve el procedimiento. De esa manera sí que el Crystal puede tomar los resultados.

    jueves, 14 de diciembre de 2017 7:57
  • Hola Alberto, inicialmente hice mi procedure (sin cursor) con los campos que necesitaba, pero en crystal report esta dividido por secciones y necesitaba tener mi cabecera(no tengo problema), pero en la seccion detalle tendría que ir  la primera parte de imagen (en este caso 2 registros) mas abajo el total y luego nuevamente mas abajo una seccion detalle para (IMEI,Forma de Pago, Consultor) de cada registro que muestra en la primera parte, pero ala hora de imprimir no me salia de la forma que muestro en la imagen anterior, me salia  1 registro, total y luego IMEI,Forma de Pago, Consultor, luego el 2do de igual manera (y si hubieran más seguía una debajo de otro), no como se quiere para la impresión, por eso tratando de imprimir con el modelo del documento, buscando alternativas me encontré que se podía hacer con cursor y darle la forma por SQL(cursor recien estoy conociendo), ahora tu me dices que cree una tabla temporal, pero me va a registrar normal ¿? o tendria que crear 3 tablas temporales(como son 3 partes, bueno si se puede decir así que esta dividido), o si se puede mostrar con procedure normal al crystal seria genial, del formato como quiero.

    Gracias por tu tiempo.!!

    jueves, 14 de diciembre de 2017 15:54
  • Hola Alberto, disculpa tanta molestia, he hecho lo que me dijiste cree 3 tablas temporales para cada seccion si es que se le puede decir así.

    Pero a la hora de ir al crystal a tratar de mostrar me sale esto:

    Como se hace, para añadirlo al crystal, o que estoy haciendo mal, por favor.

                                                                                                                                                                                                                                                                                                                                                                                             

    alter PROCEDURE Clientes_Cursor_Walter
    @NPedido as varchar(12)
    AS
    BEGIN
          SET NOCOUNT ON;
          --DECLARE THE VARIABLES FOR HOLDING DATA.(DECLARE LAS VARIABLES PARA MANTENER DATOS.)

          DECLARE @Solicitado INT,
                  @Modelo VARCHAR(50),
                  @Precio_Venta_Unit DECIMAL(10,2),
                  @Dscto_Especial_Unit DECIMAL(10,2),
                  @PrecioSin_Dscto_Especial DECIMAL(10,2),
                  @Vigencia_Acuerdo INT,
                  @Total_Venta DECIMAL(10,2),
                  @PlanTarifario VARCHAR(50),
                  @Renta_Fija_Mens_Unit DECIMAL(10,2),
                  @Forma_Pago VARCHAR(20),
                  @IMEI VARCHAR(15),
                  @CONSULTOR VARCHAR(100),
                  @Total DECIMAL(10,2)
            declare @Id_Pedido int
    set @Id_Pedido=(select Id_Pedido from LURIN_ORQUESTADOR_Pedidos_Cabecera where NumPedido=@NPedido)


          --DECLARE AND SET COUNTER.(declaere y configure el contador)
          DECLARE @Counter INT
          SET @Counter = 1

          --DECLARE THE CURSOR FOR A QUERY.(DECLARAR EL CURSOR PARA UNA CONSULTA.)
          DECLARE Cursor_Temporal CURSOR READ_ONLY
          FOR
     Select 
     d.Solicitado,d.Modelo,dt.Precio_Venta_Unit,dt.Dscto_Especial_Unit,dt.PrecioSin_Dscto_Especial,
     dt.Vigencia_Acuerdo,dt.Total_Venta,d.PlanTarifario,dt.Renta_Fija_Mens_Unit,dt.Forma_Pago,dt.IMEI,
     dt.Consultor
     From LURIN_ORQUESTADOR_Pedidos_Detalle d
     inner join LURIN_ORQUESTADOR_Pedidos_Detalle_AST dt on
     d.IMEI=dt.IMEI
     Where dt.Id_Pedido = @Id_Pedido

          --OPEN CURSOR.
          OPEN Cursor_Temporal

          --FETCH THE RECORD INTO THE VARIABLES.(DESCUBRA EL REGISTRO EN LAS VARIABLES)
          FETCH NEXT FROM Cursor_Temporal INTO
          @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,
          @PrecioSin_Dscto_Especial,@Vigencia_Acuerdo,@Total_Venta,
          @PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,@CONSULTOR 

          --LOOP UNTIL RECORDS ARE AVAILABLE.(BUCLE HASTA QUE LOS REGISTROS ESTÉN DISPONIBLES)
          WHILE @@FETCH_STATUS = 0
          BEGIN


                 --registrando
                 insert into Cursor_Temporal(Solicitado,Modelo,Precio_Venta_Unit,Dscto_Especial_Unit, 
                 PrecioSin_Dscto_Especial,Vigencia_Acuerdo,Total_Venta,PlanTarifario, 
                 Renta_Fija_Mens_Unit)
                 values(@Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit, 
                 @PrecioSin_Dscto_Especial,@Vigencia_Acuerdo,@Total_Venta,@PlanTarifario, 
                 @Renta_Fija_Mens_Unit)


                 --INCREMENT COUNTER.
                 SET @Counter = @Counter + 1

                 --FETCH THE NEXT RECORD INTO THE VARIABLES.(OBTENGA EL SIGUIENTE REGISTRO EN LAS VARIABLES.)
                 FETCH NEXT FROM Cursor_Temporal INTO
                  @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,@PrecioSin_Dscto_Especial,
                  @Vigencia_Acuerdo,@Total_Venta,@PlanTarifario,@Renta_Fija_Mens_Unit
                  ,@Forma_Pago,@IMEI,@CONSULTOR 

          END
          BEGIN

                 PRINT'--------------------------------------------------------'
                 print'                                                         '
                 print'                                                         '
                 print'                                                         '
                 --PRINT'                                  ' + cast(@Total_Venta as varchar(10))--@Total_Venta           
           END
            --///////////////////// para el TOTAL -SECCION 2 //////////////////////////////////
           --DECLARE AND SET COUNTER.(declaere y configure el contador)
          DECLARE @Counter2 INT
          SET @Counter2 = 1

          --DECLARE THE CURSOR FOR A QUERY.(DECLARAR EL CURSOR PARA UNA CONSULTA.)
          DECLARE Cursor_Temporal2 CURSOR READ_ONLY
          FOR
     Select
    SUM(dt.Total_Venta)'TOTAL'
    From LURIN_ORQUESTADOR_Pedidos_Detalle d
    inner join LURIN_ORQUESTADOR_Pedidos_Detalle_AST dt on
    d.IMEI=dt.IMEI
    Where dt.Id_Pedido = @Id_Pedido

          --OPEN CURSOR.
          OPEN Cursor_Temporal2

          --FETCH THE RECORD INTO THE VARIABLES.(DESCUBRA EL REGISTRO EN LAS VARIABLES)
          FETCH NEXT FROM Cursor_Temporal2 INTO
          @Total

            --LOOP UNTIL RECORDS ARE AVAILABLE.(BUCLE HASTA QUE LOS REGISTROS ESTÉN DISPONIBLES)
          WHILE @@FETCH_STATUS = 0
          BEGIN

                  --registrando
                 insert into Cursor_Temporal2(Total)
                 values(@Total)

                 --INCREMENT COUNTER.
                 SET @Counter2 = @Counter2 + 1

                 --FETCH THE NEXT RECORD INTO THE VARIABLES.(OBTENGA EL SIGUIENTE REGISTRO EN LAS VARIABLES.)
                 FETCH NEXT FROM Cursor_Temporal2 INTO
                 @Total

          END
           --///////////////////// fin 2 //////////////////////

           BEGIN

                 PRINT '--------------------------------------------------------'
                 print'                                                         '
                 print'                                                         '
                 print'                                                         '

           END

           --///////////////////// PARA LOS FORMA DEPAGO - IMEI -CONSULTOR - SECCION 3 /////////////////////////
           --DECLARE AND SET COUNTER.(declaere y configure el contador)
          DECLARE @Counter3 INT
          SET @Counter3 = 1

          --DECLARE THE CURSOR FOR A QUERY.(DECLARAR EL CURSOR PARA UNA CONSULTA.)
          DECLARE Cursor_Temporal3 CURSOR READ_ONLY
          FOR

     Select
     d.Solicitado,d.Modelo,dt.Precio_Venta_Unit,dt.Dscto_Especial_Unit,dt.PrecioSin_Dscto_Especial,
     dt.Vigencia_Acuerdo,dt.Total_Venta,d.PlanTarifario,dt.Renta_Fija_Mens_Unit,dt.Forma_Pago,dt.IMEI,
     dt.Consultor
     From LURIN_ORQUESTADOR_Pedidos_Detalle d
     inner join LURIN_ORQUESTADOR_Pedidos_Detalle_AST dt on
     d.IMEI=dt.IMEI
     Where dt.Id_Pedido = @Id_Pedido

          --OPEN CURSOR.
          OPEN Cursor_Temporal3

          --FETCH THE RECORD INTO THE VARIABLES.(DESCUBRA EL REGISTRO EN LAS VARIABLES)
          FETCH NEXT FROM Cursor_Temporal3 INTO
          @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,
          @PrecioSin_Dscto_Especial,@Vigencia_Acuerdo,@Total_Venta,
          @PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,@CONSULTOR

            --LOOP UNTIL RECORDS ARE AVAILABLE.(BUCLE HASTA QUE LOS REGISTROS ESTÉN DISPONIBLES)
          WHILE @@FETCH_STATUS = 0
          BEGIN


                  --registrando
                 insert into Cursor_Temporal3
                 values(@Forma_Pago,@IMEI,@CONSULTOR)

                 --INCREMENT COUNTER.
                 SET @Counter3 = @Counter3 + 1

                 --FETCH THE NEXT RECORD INTO THE VARIABLES.(OBTENGA EL SIGUIENTE REGISTRO EN LAS VARIABLES.)
                 FETCH NEXT FROM Cursor_Temporal3 INTO
                  @Solicitado,@Modelo,@Precio_Venta_Unit,@Dscto_Especial_Unit,@PrecioSin_Dscto_Especial,
                  @Vigencia_Acuerdo,@Total_Venta,@PlanTarifario,@Renta_Fija_Mens_Unit,@Forma_Pago,@IMEI,
                  @CONSULTOR 

          END
           --/////////////////////

          --CLOSE THE CURSOR.
          CLOSE Cursor_Temporal --Print_Clientes_Cursor
          DEALLOCATE Cursor_Temporal --Print_Clientes_Cursor
          CLOSE Cursor_Temporal2
          DEALLOCATE Cursor_Temporal2
          CLOSE Cursor_Temporal3
          DEALLOCATE Cursor_Temporal3
    END
    GO


    jueves, 14 de diciembre de 2017 16:49