none
Sql curssor RRS feed

  • Pergunta

  • Boa noite a todos os membros tenho uma stored procedure que passo a mencionar a baixo, o que ela faz?

    Ela devolve o numero AE que é numero de veiculos reservados para um tipo de frota numa determinada data, o AE=Aentrega  e AR= Arecolha

    ou seja conta os veiculos que existem reservados naquela datainicioreserva , agora pretendia no AR contar os veiculos em q a datafimreserva é essa mesma, passo a mostrar   a SP e a imagem do que essa stored procedure devolve:

    --exec ReportEntragasPorDiaCom2TipoFrota '2013-01-01' , '2013-12-21'
    ALTER	procedure [dbo].[ReportEntragasPorDiaCom2TipoFrota]
    	@datainicioreserva  varchar(255),
    @datafimreserva varchar (255)
    
    
    as
    
    select   
     convert (varchar(10), a.datainicioreserva,105) as datainicioreserva , 
     convert (varchar(10), a.datafimreserva,105)  as datafimreservaA, 
     COUNT (a.idReserva) as cntAE,
      COUNT (a.idReserva) as cntAR,
     --b
     convert (varchar(10), a.datafimreserva,105)  as datafimreservaB, 
     COUNT (a.idReserva) as cntBE,
      COUNT (a.idReserva) as cntBR
     --h
     
     into #reservasF
    from reserva a
    inner join tipoFrota b on a.idTipoFrota = b.idTipoFrota
    group by a.datainicioreserva,  a.datafimreserva, b.idTipoFrota,b.descTipoFrota
    
    
    delete from #reservasF
    
    --set identity_insert users on
    
    declare @idTipoFrota varchar (100)
    declare @descTipoFrota varchar (100)
    declare @cnt1 varchar (100)
    declare @cnt2 varchar (100)
    
    
    select distinct   
     convert (varchar(10), a.datainicioreserva,20) as datainicioreserva ,
     convert (time, a.datainicioreserva ) as horainicio,
     convert (varchar(10), a.datafimreserva,105)  as datafimreserva, 
     convert (time, a.datafimreserva ) as horafimreserva,
       b.idTipoFrota,b.descTipoFrota,
       COUNT (a.idReserva) as cnt1,
      COUNT (a.idReserva) as cnt2
    into #reserva  
    from reserva a
    inner join tipoFrota b on a.idTipoFrota = b.idTipoFrota
    where  ((a.datainicioreserva > =  @datainicioreserva  or   @datainicioreserva < = a.datafimreserva) 
    and  a.datainicioreserva< =  @datafimreserva ) 
    group by a.datainicioreserva,  a.datafimreserva, b.idTipoFrota,b.descTipoFrota
    
          
                 DECLARE ccursor  CURSOR READ_ONLY FOR
    			select distinct   datainicioreserva, datafimreserva,idTipoFrota,cnt1, cnt2, descTipoFrota from #reserva  
    
    
    
                       OPEN ccursor
    
    
                       FETCH NEXT FROM ccursor INTO @datainicioreserva,@datafimreserva,@idTipoFrota,@cnt1, @cnt2 ,@descTipoFrota
    
                       WHILE @@FETCH_STATUS = 0
                       BEGIN
    
    if @descTipoFrota = 'A' 
    begin
    
    	if not exists (select * from #reservasF where datainicioreserva = @datainicioreserva )
    	begin
    		insert into #reservasF (datainicioreserva,datafimreservaA,cntAE , cntAR )
    		select @datainicioreserva,@datafimreserva,@cnt1, @cnt2  from #reserva where datainicioreserva = @datainicioreserva and idTipoFrota = @idTipoFrota
    	end
    	else
    	begin
    		update #reservasF set datainicioreserva=@datainicioreserva,
    		datafimreservaA=@datafimreserva,cntAE=@cnt1, cntAR =@cnt2  where datainicioreserva=@datainicioreserva
    	end
    
    end
    
    
    if @descTipoFrota = 'b' 
    begin
    
    	if not exists (select * from #reservasF where datainicioreserva = @datainicioreserva )
    	begin
    		insert into #reservasF (datainicioreserva,datafimreservab,cntBE, cntBR )
    		select @datainicioreserva,@datafimreserva,@cnt1, @cnt2  from #reserva where datainicioreserva = @datainicioreserva and idTipoFrota = @idTipoFrota
    	end
    	else
    	begin
    		update #reservasF set datainicioreserva=@datainicioreserva,
    		datafimreservab=@datafimreserva,cntBE =@cnt1, cntBR = @cnt2  where datainicioreserva=@datainicioreserva
    	end
    
    end
    
    
    				   FETCH NEXT FROM ccursor INTO @datainicioreserva,@datafimreserva,@idTipoFrota,@cnt1, @cnt2,@descTipoFrota
    
                       end
    
                       CLOSE ccursor
                       DEALLOCATE ccursor
    
    select 
    	isnull(datainicioreserva,'') as datainicioreserva,	
    	isnull(datafimreservaA,'') as datafimreservaA,
    	isnull(cntAE,'') as AE,
    	isnull(cntAR,'') as AR,
    	
    	--isnull(datafimreservaB,'') as datafimreservaB,
    isnull(datafimreservaB,'') as datafimreservaB,
    	isnull(cntBE,'') as BE,
    	isnull(cntBr,'') as BR
    										
    from #reservasF
    
    order by datainicioreserva asc

    esta sp devolve estes dados:

    e por exemplo a linha:

                       datainicio      datafim          AE    AR

    linha 1        2013-01-01  08-01-2013    1     0

    depois entre a linha 2 e 3 devia aparecer a tal linha com o veicuolo que tem q recolher nesse dia ou seja deveria ficar

                     ................       04-01-2013   0      1    isto pq pq tem q entregar um dia 04-01-2013.

    Fiz-me entender, agradecia ajuda desde ja o meu muito obrigado Helder Pires



    Helder

    sexta-feira, 11 de janeiro de 2013 02:23

Todas as Respostas

  • Helder

    Não entendi sua dúvida, poderia montar um select maior com o resultado atual de sua proc e montar uma previa de como vc gostaria que fosse o resultado da query?


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS, MCITP, MCT.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 14 de janeiro de 2013 10:13
    Moderador